Pregunta para los entendidos - página 3

 
Chris_Brown писал(а) >>

Y si hay una matriz bidimensional, una matriz de 4 por 9 y a cada elemento se le asigna un valor de 0,1, ¿sería algo así?

Como Talex ha señalado correctamente, puedes (y debes) inicializar las matrices utilizando la función ArrayInitialize

 

¡Ayuda!

No puedo entender cómo funciona el algoritmo de aprendizaje NS (con un profesor).

Tomaré mi NS como ejemplo (Por favor, no me regañes demasiado, soy algo nuevo en esto).

Ayúdame a dibujar el algoritmo de aprendizaje NS


//Размеры матрицы
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);}
//+------------------------------------------------------------------+
 

También sobre la tangente hiperbólica, ¿se cuenta correctamente?


return((MathExp( A* x)-MathExp(- A* x))/(MathExp( A* x)+MathExp(- A* x)));
 
¿Hay alguna forma de establecer dinámicamente el rango del array?
 
Chris_Brown >> :

Y sobre la tangente hiperbólica, ¿se cuenta correctamente?

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


Por cierto, la función e^x no parece ser rápida.

Así que es mejor así:

double var = A* x;

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

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

Debería ser más rápido.

Chris_Brown >> :
¿Hay alguna forma de establecer dinámicamente el rango del array?

¿Cuál es el rango de valores? Es de -1 a 1. Si lo he entendido bien:

double ScaledTanh = Scale*tanh - Shift;
 

¿Cuál es el rango de valores? ¿Es de -1 a 1 . Si lo he entendido bien:

double ScaledTanh = Scale*tanh - Shift;

No. No me refiero a eso.

La declaración estándar de un array:

int Mas[50]; // Aquí el array está definido por el rango de 0 a 49


Me refería a que sea de forma dinámica, es decir, que cambie este rango al hacer algunos cálculos.

 
ArrayResize() - cambia el tamaño de la matriz.
 
Mathemat >> :
ArrayResize() - cambia el tamaño de la matriz.

Aha, aquí hay un ejemplo:

doble W[3][4];

ArrayResize(W,2)


El resultado cambiará de 3 a 2. ¿Cómo cambiamos el segundo de 4 a 6?

--------

Tengo otra idea: (Por ejemplo.)

#define Input 4 //Número de neuronas en la capa de entrada
#define Out 1 //Número de neuronas en la capa de salida
double W[Input][Out+1];//Matriz de pesos

pero aquí aparece el error de sumar 1 a Out

 

Buenas tardes a todos.

En realidad, no se trata del tema. Por favor, avise...

¿Cómo traduzco el texto en formato PDF a Word?

(El archivo es grande, - "Crepúsculo", D. Glukhovsky 65 mb)

 
rid писал(а) >>

Buenas tardes a todos.

En realidad, no se trata del tema. Por favor, avise...

¿Cómo traduzco el texto en formato PDF a Word?

(El archivo es grande, - "Crepúsculo", D. Glukhovsky 65 mb)

Suelo reconocer en FineReader y convertirlo a Word. Aunque puede haber otras opciones.

Pero la pregunta está definitivamente fuera de tema.