Вопрос к знатокам - страница 3

 
Chris_Brown писал(а) >>

А если будет двумерный массив, матрица 4 на 9 и каждому элементу присвоить значение 0.1, это будет примерно так?

Как Вам правильно указал Talex, инициализировать массивы можно (и нужно) при помощи функции ArrayInitialize

 

Помогите!

Не могу понять как работает алгоритм обучения НС (с учителем).

Для примера возьму конкретно свою НС (Плиз сильно не ругайте меня я как бы новичок в этом деле)

Помогите с составлением алгоритма обучения НС


//Размеры матрицы
double W[4][9];//Матрица весов размером 4 на 8
//	W					
//	W31	-0,52	-0,01	-0,08	0,35	          Выходной слой
//	W21	1,52	1,35	1,12	-1,38	
//	W22	7,05	4,75	3,25	1,45	
//	W23	7,36	4,42	3,90	2,26	          Скрытый слой 2   
//	W24	6,79	5,54	3,74	2,81	
//	W11	-4,65	13,06	7,00	4,67	0,07
//	W12	-3,25	11,92	2,66	5,98	2,41      Скрытый слой 1
//	W13	-3,31	8,93	3,32	5,57	4,20
//	W14	4,33	4,86	9,84	8,96	1,52 

//Функции активации нейронов
double NormDate(double Date,int Type,int A) {
  double x;
  if (Type==0){     
      x=Date;
      return(MathTan(MathExp(A*x)-MathExp(-A*x)/MathExp(A*x)+MathExp(-A*x)));//гиперболический тангенс
      }
  if (Type==1){
      x=Date;
      return(1/(1+MathExp(-A*x)));// сигмоид
     }
 } 


//+------------------------------------------------------------------+
//| Многослойная нейронная сеть.                                     |
//| Параметры сети:                                                  |
//| Входные параметры подаются во входном массиве - X                |                                   
//| Веса задаются в весовой матрице - W                              |
//| Число скрытых слоёв = V                                          |
//|                                                                  |
//+------------------------------------------------------------------+
double neuronet1(double W[][],double X[], int V){
int N=ArraySize(X);
int i,j,I;
double sum=0.0;
double Out[99][99];
double summ=0.0;
//Расчёты скрытых слоёв NC
for (I=0; I<=V-1; I++){
  for(i=I*N; i<=(N-1+N*I); i++){
  for(j=0; j<=N-1; j++){
  if(I==0)
        summ+=(W[j][i]*X[j]);else
        summ+=(W[j][i]*Out[I-1][j]);
}
Out[I][i-I*N]=NormDate(summ,0,1);
summ=0;
}
}
//Расчёт выходного слоя NC
for(j=0; j<=N-1; j++){
sum+=W[j][8]*Out[V-1][j];
}

sum=NormDate(sum,0,1);

return(sum);
}

int init(){
//+------------------------------------------------------------------+
//|  Инциализирование весовой матрицы случайными числами             |
//+------------------------------------------------------------------+
MathSrand(TimeLocal());
double Dia=1;//диапазон случайных чисел
ArrayInitialize(W,(MathRand()/32767.0*Dia));
}
int start(){
//+------------------------------------------------------------------+
//| Создание массива с входными данными                              |
//+------------------------------------------------------------------+
double X[4];
 X[0]=1.2447;// На первых порах пусть будут сами котировки 
 X[1]=1.2458;
 X[2]=1.2364;
 X[3]=1.2377;
 
 double Out[1];
 Out[1]=0.8;//  например в процессе обучения должно получиться значение больше 0.8
 
 //Пример обращения к функции нейросети
 Comment(neuronet1(W,X,2));
   return(0);}
//+------------------------------------------------------------------+
 

И ещё на счёт гиперболического тангенса, он правильно считается ?


return((MathExp(A*x)-MathExp(-A*x))/(MathExp(A*x)+MathExp(-A*x)));
 
А можно ли как то динамически задать диапазон массива?
 
Chris_Brown >>:

И ещё на счёт гиперболического тангенса, он правильно считается ?

tanh(x) = sinh(x)/cosh(x) = (e^x - e^-x)/(e^x + e^-x)


Кстати функция e^x вроде не быстрая.

Так что лучше так:

double var = A*x;

double expVar = MathExp(var);
double revExpVar = 1/expVar;

double tanh = (expVar - revExpVar)/(expVar + revExpVar)

Должно получиться побыстрее.

Chris_Brown >>:
А можно ли как то динамически задать диапазон массива?

Область значений? она от -1 до 1 . Если я правильно понял то:

double ScaledTanh = Scale*tanh - Shift;
 

Область значений? она от -1 до 1 . Если я правильно понял то:

double ScaledTanh = Scale*tanh - Shift;

Нет. Я о другом.

Стандартное объявление массива:

int Mas[50]; // Вот тут массив задан диапазоном от 0 до 49


А я имел ввиду динамически, тоесть при каких то вычислений изменять этот диапазон

 
ArrayResize() - изменяет размер массива.
 
Mathemat >>:
ArrayResize() - изменяет размер массива.

Аха, вот Вам пример:

double W[3][4];

ArrayResize(W,2)


В результате мы изменем 3 на 2, а как изменить второе ? Допустим с 4 на 6

--------

У меня возникла другая идея: (К примеру)

#define Input 4 //Число нейронов в входном слое
#define Out 1 //Число нейронов в выходном слое
double W[Input][Out+1];//Весовая матрица

но тут возникает ошибка к Out нельзя добовлять 1

 

Добрый день всем.

Не совсем по теме вопрос. Пож. подскажите -

Как перевести текст в формате PDF в Word?

(Файл большой, - "Сумерки", Д.Глуховский 65 мб)

 
rid писал(а) >>

Добрый день всем.

Не совсем по теме вопрос. Пож. подскажите -

Как перевести текст в формате PDF в Word?

(Файл большой, - "Сумерки", Д.Глуховский 65 мб)

Я обычно распознаю в FineReader и перегоняю в Word. Хотя может есть и другие варианты.

Но вопрос точно не в тему.

Причина обращения: