Question pour les connaisseurs - page 3

 
Chris_Brown писал(а) >>

Et s'il s'agit d'un tableau à deux dimensions, d'une matrice de 4 par 9 et que chaque élément se voit attribuer une valeur de 0,1, cela donnerait-il quelque chose comme ceci ?

Comme Talex l'a correctement souligné, vous pouvez (et devriez) initialiser les tableaux en utilisant la fonction ArrayInitialize.

 

Au secours !

Je n'arrive pas à comprendre comment fonctionne l'algorithme d'apprentissage de NS (avec un professeur).

Je vais prendre l'exemple de ma NS (ne me grondez pas trop, je suis un peu nouveau dans ce domaine).

Aidez-moi à dessiner l'algorithme d'apprentissage 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);}
//+------------------------------------------------------------------+
 

En ce qui concerne la tangente hyperbolique, compte-t-elle correctement ?


return((MathExp( A* x)-MathExp(- A* x))/(MathExp( A* x)+MathExp(- A* x)));
 
Existe-t-il un moyen de définir dynamiquement l'étendue du tableau ?
 
Chris_Brown >> :

Et la tangente hyperbolique, compte-t-elle correctement ?

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


Au fait, la fonction e^x ne semble pas être rapide.

Donc c'est mieux comme ça :

double var = A* x;

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

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

Il devrait être plus rapide.

Chris_Brown >> :
Existe-t-il un moyen de définir dynamiquement l'étendue du tableau ?

Quelle est la gamme de valeurs ? C'est de -1 à 1. Si j'ai bien compris :

double ScaledTanh = Scale*tanh - Shift;
 

Quelle est la plage de valeurs ? -1 à 1 . Si je comprends bien :

double ScaledTanh = Scale*tanh - Shift;

Non. Ce n'est pas ce que je veux dire.

La déclaration standard de tableau:

int Mas[50] ; // Ici le tableau est défini par l'intervalle de 0 à 49


Je voulais dire de manière dynamique, c'est-à-dire en modifiant cette plage lors de certains calculs.

 
ArrayResize() - modifie la taille du tableau.
 
Mathemat >> :
ArrayResize() - modifie la taille du tableau.

Aha, voici un exemple :

double W[3][4] ;

ArrayResize(W,2)


Le résultat changera de 3 à 2. Comment changer le second de 4 à 6 ?

--------

J'ai une autre idée : (Par exemple.)

#define Input 4 //Nombre de neurones dans la couche d'entrée
#define Out 1 //Nombre de neurones dans la couche de sortie
double W[Input][Out+1];//Matrice de poids

mais ici apparaît l'erreur d'ajouter 1 à Out

 

Bonjour à tous.

Pas vraiment sur le sujet. Veuillez me conseiller -

Comment traduire le texte en format PDF dans Word ?

(Le fichier est volumineux, - "Twilight", D. Glukhovsky 65 mb)

 
rid писал(а) >>

Bonjour à tous.

Pas vraiment sur le sujet. Veuillez me conseiller -

Comment traduire le texte en format PDF dans Word ?

(Le fichier est volumineux, - "Twilight", D. Glukhovsky 65 mb)

Je reconnais généralement dans FineReader et je le convertis en Word. Bien qu'il puisse y avoir d'autres options.

Mais la question est définitivement hors sujet.