線形回帰の記述を支援する - ページ 6

 

この場合、おそらく一番良いのは、すべてのX[i]の算術平均を求め、その値自体から差し引き、回帰係数を計算し、再び補正することでしょう。原理的には、Y[i]で同じことをすることを妨げるものは何もありません。しかし、明らかに難しいことではないのですが、数式を見つけようとしたことはありません。弱く条件付けされた行列には、明らかに何らかのトリックがある。

追伸:データ系列をほぼ同じ順番に正規化することもできます。

 
Mathemat писал (а)>>

この場合、おそらく一番良いのは、すべてのX[i]の算術平均を求め、その値自体から差し引き、回帰係数を計算し、再び補正することでしょう。原理的には、Y[i]で同じことをすることを妨げるものは何もありません。しかし、明らかに難しいことではないのですが、数式を見つけようとしたことはありません。弱く条件付けされた行列には、明らかに何らかのトリックがある。

追伸:データ系列をほぼ同じ順番に正規化することもできます。

と、日本経済新聞社を通じて提案したことがあります。補正不要のストレートな処方。

これで、ACFもコードベースに入れることができるようになりました。再確認したところ、すべて8文字の精度で一致していますが、MQLで計算したACFの値をファイルに入力したことが原因である可能性が高いです。

 

セルゲイ 2年前にLRを書くときに、すでにつまずいたことがあります。方法は簡単で、Candidの 推薦に耳を傾けることです。この勧告で唯一指定するのは、Time[Bars-1] ではなく、最初の値 X[] の時間を引くことです。まず、Xスタートがプロシージャー内で移動するため、プロシージャーコードがユニバーサルになる。次に、チャート上に多くのバーがある場合(3年は1000000分、すなわち60000000秒)、チャート上の最初のバーの時間を差し引いても、状況は根本的に変わりません。3つ目は、MOを使わずに元の数式に戻ることができるようになることで、精度を保ちながらサイクルの繰り返しをなくすことができるようになります。

もうひとつ。X[]が分刻みなのは気がつきました。つまり、Xが等距離に 配置されているのです。つまり、時間から完全に離れて、バー・ナンバーを 使うことができるのです。この移行を行えば、すべてが正確かつ迅速にカウントされるようになります。確認することができます。これは、LRがM1とD1で同じように動作するという観点からも好ましいことです(小節番号ではなく時間である場合、D1のX値がどのように異なるかを想像してみてください)。

 
Yurixx писал (а)>>

セルゲイ...

ありがとう、全部試したよ。

私なりの計算方法を並べただけですが、もしかしたら誰かが役に立つかもしれません。どこにも何も動かさなくていいんです。Xを0にするのは気が引ける。この関数を使ってACFを計算するのですが、時間的制約があるはずです(いくつかの依存関係があります)。

 

一般に、X自体を点0に移動させる必要はない。そのためには、LR関数において、Xそのものではなく、X[1]でシフトされた内部配列を用いればよい。配列がなくても、合計が計算される時点でX[1]の値を減算すればよいのです。

ちなみに、試された方は、効果がなかったのでしょうか?

 
Yurixx писал (а)>>

一般に、X自体を点0に移動させる必要はない。そのためには、LR関数において、Xそのものではなく、X[1]でシフトされた内部配列を用いればよい。配列がなくても、合計が計算される時点でX[1]の値を減算すればよいのです。

ちなみに、試された方は効果があったのでしょうか?

試してみたところ、うまくいきそうです。しかし、6個の数値の配列に対してこのようなエラーが発生した場合、オフセットがあってもエラーが蓄積されないという保証はないのです。私の担当する配列は7200(分)です。そこで見つけたのが、このアルゴリズムで、正しく動作するのです。もう一台はもう信用できないので手放しました。

//+------------------------------------------------------------------+
//| Формула предлагаемая мной                                        |
//| Рассчет коэффициентов A и B в уравнении                          |
//| y(x)=A*x+B                                                       |
//| используються формулы https://forum.mql4.com/ru/10780/page5       |
//+------------------------------------------------------------------+

void LinearRegr(double X[], double Y[], int N, double& A, double& B)
{
      double mo_X = 0.0, mo_Y = 0.0, var_0 = 0.0, var_1 = 0.0;
      
    for ( int i = 0; i < N; i ++ )
      {
        mo_X +=X[i];
        mo_Y +=Y[i];
      }
    mo_X /=N;
    mo_Y /=N;
        
    for ( i = 0; i < N; i ++ )
      {
        var_0 +=(X[i]-mo_X)*(Y[i]-mo_Y);
        var_1 +=(X[i]-mo_X)*(X[i]-mo_X);
      }
        A = var_0 / var_1;
        B = mo_Y - A * mo_X;
}

>> シフトなんていらないよ。

 

大丈夫です、セルゲイさん、お好きなものをお使いください。ただ、ちょっとしたことに注目してほしいんです。

確かにお分かりのように、MOはどの行も最大と最小の間にあります。あなたのコードは、実際には原点を [mo_X, mo_Y] に移動することを意味します。そのために、7200の値をすべてループさせるのです。そして、総和を計算しながら、行座標からゼロ点座標を引き算していくのです。系列[Xm, Ym]の任意の 点を原点とし、[mo_X, mo_Y]を[Xm, Ym]に置き換えて2周目の計算を行う方がよい。

線形回帰の パラメータAは、原点移動に対して不変である。MOは関係ない。

この事実は、紙面で3分もあれば確認できます。

だから、IRを計算するサイクルは不要なのです。XとYの値をクローズオーダーに持っていくだけです。

 
Prival писал (а)>>

6個の数値の配列に対してこのようなエラーが出るのであれば、オフセットがあってもエラーが蓄積されないという保証はない。

ここで問題なのは、数字の数ではなく、その6個のそれぞれに1216600000という永久に(役に立たない)足し算が存在していることである。単に情報が全く入っていないだけです。しかし、有効数字10桁である。9とすると、最後の0は6もすべて存在するため、情報量が少ない。 二乗すると、このゴミは仮数の有効数字17桁を遮ることになる。しかも15人しか入っていない。つまり、最低桁を(トイレに)捨てることになる。一方、この捨て桁にこそ、必要な情報が含まれている(変数成分Xの情報の一部が含まれている)。

 

だから、この数式は私が作ったものではありません。本に書いてあるんです。そして、二乗を使うその式から、(二乗を使わない)この式が導き出される。鉛筆を持って座るだけ。スキャナーを手に入れたら、Tikhonov V.I. "Statistical Radio Engineering" p.446のページを掲載する予定です。

 
その通り、鉛筆を持って座れば、傾きbの元の式のXi→Xi-X0、Yi→Yi-Y0を置き換えれば、この新しい式は元の式と等価であることが分かります。X0とY0がどのような値 であっても。そのため、MO計算であるXiとYiの和を第2サイクル内に移動させることができ、LR計算時間を半減させることができる。そして、精度を上げるためには、適切なX0とY0を選択する必要があります。そして、シリーズXとYのオーダーが近くなるように行うのが良い。