Hilfe beim Schreiben einer linearen Regression - Seite 6

 

Wahrscheinlich ist es in diesem Fall am besten, das arithmetische Mittel aller X[i] zu ermitteln, es von den Werten selbst abzuziehen, die Regressionskoeffizienten zu berechnen und sie wieder zu korrigieren. Im Prinzip hindert Sie nichts daran, das Gleiche mit Y[i] zu tun. Aber ich habe nicht versucht, die Formel zu finden, obwohl es offensichtlich nicht schwierig ist. Offensichtlich gibt es einen Trick mit schwach konditionierten Matrizen.

P.S. Sie können die Datenreihen auch auf etwa die gleiche Reihenfolge normalisieren.

 
Mathemat писал (а) >>

Wahrscheinlich ist es in diesem Fall am besten, das arithmetische Mittel aller X[i] zu ermitteln, es von den Werten selbst abzuziehen, die Regressionskoeffizienten zu berechnen und sie wieder zu korrigieren. Im Prinzip hindert Sie nichts daran, das Gleiche mit Y[i] zu tun. Aber ich habe nicht versucht, die Formel zu finden, obwohl es offensichtlich nicht schwierig ist. Offensichtlich gibt es einen Trick mit schwach konditionierten Matrizen.

P.S. Sie können die Datenreihen auch auf etwa die gleiche Reihenfolge normalisieren.

Und das habe ich getan und über MOJ vorgeschlagen. Einfache Formel, keine Korrektur erforderlich.

Jetzt können Sie den ACF auch in die Codebasis aufnehmen. Erneut überprüft, alle stimmt mit einer Genauigkeit von 8 Zeichen, aber es ist höchstwahrscheinlich auf den Eintrag in der Datei Werte von ACF in MQL berechnet.

 

Sergei, darüber bin ich schon vor ein paar Jahren gestolpert, als ich meine LR geschrieben habe. Der Ausweg ist einfach: Hören Sie auf die Empfehlung von Candid. Das Einzige, was ich in dieser Empfehlung angeben würde, ist, nicht Time[Bars-1], sondern die Zeit des ersten Wertes X[] zu subtrahieren. Erstens wird der Verfahrenscode universell, da der X-Start innerhalb des Verfahrens verschoben wird. Zweitens, wenn es viele Balken im Diagramm gibt (3 Jahre sind 1000000 Minuten, d.h. 60000000 Sekunden), dann wird die Subtraktion der Zeit des ersten Balkens im Diagramm die Situation nicht grundlegend ändern. Drittens können Sie zu Ihren ursprünglichen Formeln ohne MOs zurückkehren, was bedeutet, dass Sie Zykluswiederholungen beseitigen und gleichzeitig die Genauigkeit beibehalten können.

Noch eine Sache. Mir ist aufgefallen, dass Ihr X[] die Uhrzeit der Minuten ist. Das heißt, die X's sind äquidistant angeordnet. Das heißt, Sie können die Zeit ganz weglassen und die Taktzahl verwenden. Wenn Sie diese Umstellung vornehmen, wird alles genau und schnell gezählt. Das können Sie überprüfen. Dies ist auch unter dem Gesichtspunkt vorzuziehen, dass Ihre LR auf M1 und D1 gleich funktioniert (stellen Sie sich vor, wie unterschiedlich die X-Werte auf D1 sein werden, wenn es sich um die Zeit und nicht um die Taktnummer handelt).

 
Yurixx писал (а) >>

Sergej...

Danke. Ich habe alles ausprobiert.

Ich habe soeben meine Version der Berechnung gepostet, vielleicht findet sie jemand nützlich. Ich brauche nichts zu bewegen. Ich fühle mich nicht wohl dabei, X auf 0 zu setzen. Ich verwende diese Funktion zur Berechnung des ACF, sie sollte zeitgebunden sein (es gibt einige Abhängigkeiten).

 

Im Allgemeinen ist es nicht erforderlich, X selbst zum Punkt 0 zu bewegen. Dazu genügt es, in der LR-Funktion anstelle von X selbst ein um X[1] verschobenes internes Array zu verwenden. Sie können sogar auf ein Array verzichten - ziehen Sie einfach den Wert von X[1] zum Zeitpunkt der Berechnung der Summen ab.

Übrigens, wenn Sie es ausprobiert haben, hat es nicht geholfen?

 
Yurixx писал (а) >>

Im Allgemeinen ist es nicht erforderlich, X selbst zum Punkt 0 zu bewegen. Dazu genügt es, in der LR-Funktion anstelle von X selbst ein um X[1] verschobenes internes Array zu verwenden. Sie können sogar auf ein Array verzichten - ziehen Sie einfach den Wert von X[1] zum Zeitpunkt der Berechnung der Summen ab.

Übrigens, wenn Sie es ausprobiert haben, hat es funktioniert?

Ich habe es ausprobiert und es scheint zu funktionieren. Aber es gibt eine Nuance: Wenn der Algorithmus einen solchen Fehler für ein Feld von 6 Zahlen anzeigt, haben wir keine Garantie, dass der Fehler auch mit einem Offset nicht akkumuliert wird. Das Feld, mit dem ich arbeite, ist 7200 (Minuten). Deshalb habe ich diesen Algorithmus gefunden, und er funktioniert einwandfrei. Das andere musste ich aufgeben, weil ich ihm nicht mehr vertraue.

//+------------------------------------------------------------------+
//| Формула предлагаемая мной                                        |
//| Рассчет коэффициентов 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;
}

>> Ich brauche keine Verschiebungen.

 

Kein Problem, Sergei, nehmen Sie, was Sie wollen. Ich möchte Sie nur auf ein kleines Detail aufmerksam machen.

Wie Sie sicher verstehen, liegt MO für jede Zeile zwischen Max und Min. Der von Ihnen angegebene Code bedeutet eigentlich, dass der Startpunkt nach [mo_X, mo_Y] verschoben wird. Dazu müssen Sie eine Schleife durch alle 7200 Werte ziehen. Bei der Berechnung der Summen ziehen Sie dann die Nullpunktkoordinaten von den Zeilenkoordinaten ab. Man könnte auch einen beliebigen Punkt in einer Reihe [Xm, Ym] als Ursprung nehmen und die Berechnung des zweiten Zyklus durchführen, indem man [mo_X, mo_Y] durch [Xm, Ym] ersetzt.

Der Parameter A einer linearen Regression ist invariant in Bezug auf den Ursprungswechsel. MO hat damit nichts zu tun.

Sie können diese Tatsache in 3 Minuten auf dem Papier überprüfen.

Deshalb ist der Zyklus der IR-Berechnung unnötig. Wir müssen nur die Werte von X und Y in den Auftragsabschluss bringen.

 
Prival писал (а) >>

Wenn der Algorithmus einen solchen Fehler für ein Array von 6 Zahlen anzeigt, gibt es keine Garantie dafür, dass sich der Fehler auch mit einem Offset nicht kumuliert.

Das Problem ist hier nicht die Anzahl der Zahlen, sondern die Tatsache, dass in jeder dieser 6 Zahlen ein ständiger (nutzloser) Zusatz von 1216600000 enthalten ist. Sie enthält einfach keinerlei Informationen. Aber es sind 10 signifikante Ziffern. Lassen Sie es 9 sein, die letzte 0 ist nicht aussagekräftig, da alle 6 ebenfalls vorhanden sind. Bei der Quadrierung dieses Mülls werden 17 signifikante Stellen der Mantisse blockiert. Und es sind nur 15 darin. Das heißt, dass sie die niedrigsten Ziffern (in der Toilette) entsorgt. In der Zwischenzeit sind es diese verworfenen Ziffern, die die notwendigen Informationen enthalten (sie enthalten einen Teil der Informationen über die variable Komponente X).

 

Ich habe mir diese Formel also nicht ausgedacht. Es steht in den Büchern. Und aus dieser Formel, die Quadrate verwendet, wird diese Formel abgeleitet (ohne Quadrate). Setzen Sie sich einfach mit einem Bleistift hin. Wenn ich zum Scanner komme, werde ich eine Seite aus Tikhonov V.I. "Statistical Radio Engineering" S.446 einstellen.

 
Genau, setzen Sie sich einfach mit einem Bleistift hin und Sie werden sehen, dass, wenn Sie Xi -> Xi-X0 und Yi -> Yi-Y0 in Ihrer ursprünglichen Formel für die Steigung b ersetzen, diese neue Formel äquivalent zu der ursprünglichen Formel ist. Für beliebige Werte von X0 und Y0. Daher können die Summen Xi und Yi (d.h. die MO-Berechnung) in den zweiten Zyklus verschoben werden, wodurch sich die LR-Berechnungszeit halbiert. Und um Genauigkeit zu erreichen, sollten wir die richtigen X0 und Y0 wählen. Und es ist besser, dies so zu tun, dass die Aufträge der Serien X und Y näher beieinander liegen.
Grund der Beschwerde: