目利きの方に質問です - ページ 3

 
Chris_Brown писал(а)>>

また、4×9の2次元配列の行列があり、各要素に0.1という値が割り当てられているとしたら、次のようなものになるでしょうか。

Talexが 正しく指摘しているように、ArrayInitialize 関数を使って配列を初期化することができます(そうすべきです)。

 

助けて

NSの学習アルゴリズムの仕組みが(先生では)理解できない。

私のNSを例にとって説明します(ちょっと初心者なのであまり叱らないでください)。

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);}
//+------------------------------------------------------------------+
 

また、ハイパーボリックタンジェントについては、正しくカウントされているのでしょうか?


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に変わります。2つ目の4を6に変えるにはどうしたらよいでしょうか。

--------

もう一つ、(例えば)こんな考えもあります。

#define Input 4 //入力層のニューロン数
#define Out 1 //出力層のニューロン数
double W[Input][Out+1];/Weight マトリックス

が、ここでOutに1を足すというエラーが発生します。

 

皆さん、こんにちは。

あまり関係ない話ですがアドバイスをお願いします。

PDF形式のテキストをWordに変換するにはどうすればよいですか?

(ファイルサイズが大きいため、「トワイライト」D.Glukhovsky 65 mbとなります。)

 
rid писал(а)>>

皆さん、こんにちは。

あまり関係ない話ですがアドバイスをお願いします。

PDF形式のテキストをWordに変換するにはどうすればよいですか?

(ファイルサイズが大きいため、「トワイライト」D.Glukhovsky 65 mbとなります。)

普段はFineReaderで認識し、Wordに変換しています。他の選択肢もあるかもしれませんが。

しかし、この質問は間違いなく本題から外れています。