Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 211

 
Renat Fatkhullin:

1) Leider haben Sie die Frage unvollständig formuliert und eine ungeprüfte und kurze, höfliche "Das ist egal"-Antwort erhalten.

Sie wollten eine "so vereinbarte/konventionelle" Antwort, indem Sie sie in der Frage selbst formulierten. Aber Duncan kam beim ersten Mal mit dem "Richtigen" davon und wiederholte es beim zweiten Mal.

2) Sie haben keine Bestätigung für die Genauigkeit in R erhalten und keine Antwort auf die Frage, warum das Ergebnis in anderen Paketen anders ist. Die Analyse der Frage "warum ist die Antwort in anderen Paketen anders" ist wichtiger und kann das Thema aufdecken.


3) Unser Standpunkt:

выражение для dgamma

(x)= 1/(s^a Gamma(a)) x^(a-1) e^-(x/s)

for x ≥ 0, a > 0 and s > 0


в точке 0 является неопределенным.

R geht davon aus, dass Sie diesen Punkt in die Berechnung einbeziehen können, aber die Grenzwerte nehmen, auch wenn sie unendlich sind, wie im Fall von dgamma(0,0.5,1).

Berechnet man jedoch Wahrscheinlichkeiten, die im Nullpunkt unendlich sind, werden alle Integrale von dgamma formal unendlich, und nach dieser Logik müsste pgamma für alle Werte von x gleich unendlich sein.

Dies steht jedoch im Widerspruch zu den Ergebnissen von pgamma, wo sich alle Werte als endlich erweisen. Sie sind richtig, denn im Punkt x=0 wird die Dichte als =0 angenommen.

1) Ja, ich habe keine detaillierte Antwort erhalten. Obwohl ich es auf den Punkt gebracht habe... Ich will meine Meinung nicht aufdrängen, ich bin es auch leid, zu streiten, um ehrlich zu sein. Ich möchte Sie darauf aufmerksam machen, dass die Worte dieser Person fast wortwörtlich mit unserer ursprünglichen Nachricht übereinstimmen. Wie man die Dichte am Extrempunkt bestimmt, ist nicht wichtig, die Hauptsache ist, dass man die Integrale richtig berechnet:

Wir erklären, dass die Dichte der Gamma-Verteilung am Punkt Null streng genommen undefiniert ist. Nimmt man den Grenzwert auf der rechten Seite, so ist die Dichte gleich eins.

Vor diesem Hintergrund halten wir die Aussage "Berechnungsfehler in R" für nicht korrekt. Genauer gesagt handelt es sich um eine Frage der Konvention: Was ist als gleich dem Ausdruck Null hoch Null zu betrachten? Die Gleichsetzung der Dichte der Gamma-Verteilung mit Null am Punkt Null scheint keine bedingte Praxis zu sein.

2) Es war nicht einmal die Rede von Genauigkeit meinerseits. Bei der Dichte am Punkt Null geht es nicht um Präzision, sondern darum, wie man sie als Ergebnis der Funktion ableitet - Nicht-Konvergenz (NaN) oder Gleichsetzung mit dem Grenzwert oder mit Null. Die Hauptsache ist, dass es für die Berechnung des Integrals keine Rolle spielt.

3) Ich habe den korrigierten Text des Artikels noch einmal gelesen. Und ich bin froh, dass Sie beschlossen haben, das Verhalten von dgamma nicht als Fehler zu betrachten.

Aber das :

werden alle Integrale von dgamma formal unendlich und nach dieser Logik müsste pgamma für alle Werte von x gleich unendlich sein.

Seltsam, Renat.

pgamma kann im Prinzip nicht unendlich sein, da das Ingegral von oben durch den Wert 1 begrenzt wird.

Nehmen wir die Normalverteilung. Sie ist für [-inf,+inf] definiert. Integral der Verteilungsfunktion = 1 in diesem Intervall. Aber irgendwie stellt sich heraus, dass die Summierung (Integration) der Dichte auf einem unendlich großen Saport nicht zu einer unendlichen Summe führt. Obwohl die Dichte auf dem gesamten Keepport != 0 in jeder Region ist.

Und wie oft kommt bei dgmamma der Punkt x ==0 mit seiner Dichte == inf vor (den Fall, dass die Dichte an diesem Punkt gegen 1 tendiert, haben Sie übrigens nicht berücksichtigt, und welche Schlüsse über die Integration ziehen Sie daraus...)? Ich würde sagen, dass dies nicht der Fall ist. Die Wahrscheinlichkeit, eine Zufallsvariable an einem beliebigen Punkt == 0 in einer kontinuierlichen Verteilung zu realisieren... Alle Statistiker wissen das. Die Dichte wird als eine Annäherung der Wahrscheinlichkeit an einen infinitesimalen Bereich um x betrachtet.

Daraus folgt, dass unabhängig davon, wie groß die Dichte am Extrempunkt sein mag, ihre Auswirkung auf den Gesamtwert = 0 ist. Denken Sie darüber nach...

Ich glaube, Sie machen sich zu viele Gedanken. ) Aber ich werde mich nicht streiten und es herausfinden. Vielleicht merke ich es eines Tages und antworte selbst anstelle von Duncan. )

Ich danke Ihnen.

 

R ist ein erstaunliches System, das mir persönlich die Augen geöffnet hat, wie weit wir in MetaTrader/MQL von den wirklichen Bedürfnissen des "komplexe Berechnungen einfach und sofort machen" entfernt waren.

Wir (C++-Entwickler) haben den Ansatz "Sie können alles selbst machen, und wir geben Ihnen die niedrige Basis und die Geschwindigkeit der Berechnungen" in unserem Blut. Wir sind fanatisch, wenn es um Leistung geht, und wir sind gut darin - MQL5 ist großartig auf 64 Bit.

Als ich anfing, selbst mit R zu arbeiten, wurde mir klar, dass ich so viele leistungsstarke Funktionen wie möglich in einer Zeile benötigte, um allgemein forschen zu können.

Wir haben also eine Kehrtwende vollzogen und mit dem Upgrade von MetaTrader 5 begonnen:

  • Aufnahme der zuvor umgeschriebenen mathematischen Bibliotheken Alglib und Fuzzy in die Standardauslieferung, versehen mit Unit-Tests
  • ein Analogon der statistischen Funktionen von R entwickelt, Tests durchgeführt und sie mit Tests abgedeckt. Die Arbeit ist noch im Gange und die Bibliothek wird erweitert
  • entwickelte die erste Beta-Version der Grafikbibliothek als Analogon zu plot in R. fügte einzeilige Funktionen für schnelle Ausgaben hinzu
  • Änderung der Schnittstellen in Terminal-Ausgabefenstern, um den Umgang mit tabellarischen Daten zu ermöglichen, Änderung der Ausgaberichtung, Hinzufügen der Deaktivierung nicht benötigter Spalten, Änderung der Schriftart auf Monospaced im Ausgabefenster des Expert Advisors
  • eine leistungsfähige ArrayPrint-Funktion zum automatischen Drucken von Arrays, einschließlich Strukturen, wurde hinzugefügt.
  • Hinzufügen der Funktionen FileLoad und FileSave zum schnellen Speichern/Lesen von Arrays auf einer Festplatte.


Natürlich stehen wir noch am Anfang des Weges, aber die richtige Richtung der Bemühungen ist bereits klar.

 

7 Schritte zur Integration sind sicherlich nicht genug. Hier sind 1.000:

> pgamma(0.8, 0.5, 1)
[1] 0.7940968

#а теперь велосипедное интегрирование:
> integration_steps <- seq(0, 0.8, length.out=1001)
> integration_result <- 0
> for(i in 2:length(integration_steps)){
+ integration_result <- integration_result + dgamma(integration_steps[i], 0.5, 1) * (integration_steps[i] - integration_steps[i-1])
+ }
> integration_result
[1] 0.7709089
#погрешность ~0.02, но тут способ уже проще некуда, и так сойдёт :) . Бесконечность при x=0 не мешает.
 
Alexey Burnakov:

1) Ja, ich habe keine detaillierte Antwort erhalten. Obwohl ich es zusammenfassen wollte... Ich will meine Meinung nicht aufdrängen, ich bin es auch leid, zu streiten, um ehrlich zu sein. Ich möchte Sie darauf aufmerksam machen, dass die Worte dieser Person fast wortwörtlich mit unserer ursprünglichen Nachricht übereinstimmen.

Es war eine höfliche Antwort ohne Einzelheiten oder Überprüfung. Und die Antwort stimmte nicht mit Wolfram Alpha und Matlab überein, was ein Problem darstellt.

Es ist nicht nötig, auszuweichen - die eigentliche Frage war klar formuliert.

 
Dr. Trader:


#погрешность ~0.02, но тут способ уже велосипедней некуда, и так сойдёт :) . Бесконечность при x=0 не мешает.

Integrieren Sie die Funktion 1/x von 0 bis 1, einschließlich der Randpunkte, und vergleichen Sie mit dem Ergebnis der analytischen Berechnungen.

Wolfram sagt, dass das Integral wegen der Singularität bei x=0 nicht konvergieren wird.

 
Quantum:

Integrieren Sie die Funktion 1/x von 0 bis 1, einschließlich der Randpunkte, und vergleichen Sie mit dem Ergebnis der analytischen Berechnungen.

Mit dem gleichen Code - 7.485471. R kam bei 76,3342 an und sagte, dass es nicht weitergehen würde, und das ist kein genaues Ergebnis und falsch. Wolfram sagte einfach sofort, dass das Ergebnis nicht stimmt, und antwortete nicht.
Die richtige Antwort: Ich weiß nicht, wie viel?

Sagen Sie mir nicht, dass das Integral von 1/x nicht gefunden werden kann und das Integral von dgamma(x) auch nicht. Die beiden Funktionen tendieren bei x -> 0+ gegen unendlich, aber sie tendieren mit unterschiedlicher Geschwindigkeit, und diese Geschwindigkeit beeinflusst, ob das Integral gefunden werden kann oder nicht.

 

Es gibt eine Funktion -log(x). Sie tendiert bei x->0 ins Unendliche. Man kann es auch ohne Minus machen, dann tendiert sie nach unten, aber das ist mir nicht recht.

Und sie hat ein Integral von 0 bis 1. Die Unendlichkeit stört nicht.


 
Renat Fatkhullin:

R ist ein erstaunliches System, das mir persönlich die Augen geöffnet hat, wie weit wir in MetaTrader/MQL von der wirklichen Notwendigkeit entfernt waren, "komplexe Berechnungen jetzt einfach und unkompliziert durchzuführen".

...

Also haben wir eine Kehrtwende vollzogen und mit dem Upgrade von MetaTrader 5 begonnen:

  • die zuvor neu geschriebenen Bibliotheken Alglib und Fuzzy math als Standard enthalten, Einheitstests abgedeckt
  • ein Analogon der statistischen Funktionen von R entwickelt, Tests durchgeführt und diese mit Tests abgedeckt. Die Arbeit ist noch nicht abgeschlossen und die Bibliothek wird erweitert
  • entwickelte die erste Beta-Version der Grafikbibliothek als Analogon zu plot in R. fügte einzeilige Funktionen für schnelle Ausgaben hinzu
  • Änderung der Schnittstellen in den Terminal-Ausgabefenstern, um mit tabellarischen Daten arbeiten zu können. Änderung der Ausgaberichtung, Hinzufügen der Deaktivierung unnötiger Spalten, Ersetzen der Schriftart durch eine einzeilige Schrift im Ausgabefenster des Expert Advisors
  • eine leistungsfähige ArrayPrint-Funktion zum automatischen Drucken von Arrays, einschließlich Strukturen, wurde hinzugefügt.
  • Hinzufügen der Funktionen FileLoad und FileSave zum schnellen Laden/Entladen von Arrays auf der Festplatte.


Natürlich stehen wir noch am Anfang des Weges, aber die richtige Richtung der Bemühungen ist bereits klar.

R, wie auch viele andere Programmiersprachen, ist für das maschinelle Lernen weitaus geeigneter als MQL, da es einen eingebauten Funktionssatz für die Verarbeitung von Array-Daten hat. Ein Beispiel für maschinelles Lernen ist meist ein zweidimensionales Datenarray, so dass eine Funktion für die Arbeit mit Arrays erforderlich ist:

  1. Einfügen von Zeilen und Spalten als Arrays kleinerer Dimension in ein anderes Array
  2. Ersetzen von Zeilen und Spalten in einem Array durch Arrays mit geringerer Größe
  3. Löschen von Zeilen und Spalten aus einem Array (z. B. um unwichtige Prädiktoren oder Beispiele mit offensichtlichen "Ausreißern" aus einer Auswahl zu entfernen)
  4. Aufteilung von Feldern in Teile, was zu zwei oder mehr Feldern führt, die Teile des ursprünglichen Feldes sind (erforderlich für die Aufteilung einer Probe in Trainings- und Testteile oder in mehrere Teile, z. B. für Walling Forward).
  5. Zufälliges Mischen von Zeilen und Spalten in einem Array mit gleichmäßiger Verteilung (es ist notwendig, dass diese oder andere Beispiele aus der Stichprobe in verschiedene Teile gelangen, vorzugsweise gleichmäßig verteilt in diesen Teilen).
  6. Verschiedene Funktionen für die Datenverarbeitung pro Zeile oder Spalte (z. B. Berechnung des arithmetischen Mittels pro Zeile oder pro Spalte, Varianz oder Ermittlung des Maximal- oder Minimalwerts in einer Zeile zur weiteren Normalisierung).
  7. Und so weiter und so fort.

Bis MQL die oben erwähnten Funktionen für die Handhabung von Mustern in Arrays implementiert hat, werden die meisten Entwickler von Algorithmen für maschinelles Lernen andere Programmiersprachen bevorzugen, die bereits über all dies verfügen. Oder sie verwenden das einfache MLP (Algorithmus aus den 1960er Jahren) aus der AlgLib-Bibliothek, in der, wenn ich mich recht erinnere, zweidimensionale Felder der Einfachheit halber als eindimensional dargestellt werden.

Natürlich sind auch Funktionen für Dichten von Zufallsverteilungen eine notwendige Funktionalität. Aber solche Funktionen werden bei Aufgaben des maschinellen Lernens nicht immer benötigt, und bei einigen Aufgaben werden sie überhaupt nicht verwendet. Aber Operationen mit Stichproben, wie bei mehrdimensionalen Arrays, sind etwas, auf das die Implementierung von Algorithmen für maschinelles Lernen bei keiner Aufgabe verzichten kann, es sei denn natürlich, es handelt sich um die Aufgabe, ein Gitter zu trainieren, um die bekannten normalisierten Daten aus trivialen CWR zu lernen.

 
Renat Fatkhullin:

R ist ein erstaunliches System, das mir persönlich die Augen geöffnet hat, wie weit wir in MetaTrader/MQL von den wirklichen Bedürfnissen des "komplexe Berechnungen einfach und sofort machen" entfernt waren.

Wir (C++-Entwickler) haben den Ansatz "Sie können alles selbst machen, und wir geben Ihnen die niedrige Basis und die Geschwindigkeit der Berechnungen" in unserem Blut. Wir sind fanatisch, wenn es um Leistung geht, und wir sind gut darin - MQL5 ist großartig auf 64 Bit.

Als ich anfing, selbst mit R zu arbeiten, wurde mir klar, dass ich so viele leistungsstarke Funktionen wie möglich in einer Zeile benötigte, um allgemein forschen zu können.

Wir haben also eine Kehrtwende vollzogen und mit dem Upgrade von MetaTrader 5 begonnen:

  • Aufnahme der zuvor umgeschriebenen mathematischen Bibliotheken Alglib und Fuzzy in die Standardauslieferung, versehen mit Unit-Tests
  • ein Analogon der statistischen Funktionen von R entwickelt, Tests durchgeführt und sie mit Tests abgedeckt. Die Arbeit ist noch im Gange und die Bibliothek wird erweitert
  • entwickelte die erste Beta-Version der Grafikbibliothek als Analogon zu plot in R. fügte einzeilige Funktionen für schnelle Ausgaben hinzu
  • Wir haben damit begonnen, die Schnittstellen in den Terminal-Ausgabefenstern zu ändern, um mit tabellarischen Daten arbeiten zu können. Wir haben die Ausgaberichtung geändert, die Deaktivierung nicht benötigter Spalten hinzugefügt und die Schriftart im Ausgabefenster des Expert Advisors auf monospaced geändert
  • eine leistungsfähige ArrayPrint-Funktion zum automatischen Drucken von Arrays, einschließlich Strukturen, wurde hinzugefügt.
  • FileLoad und FileSave hinzugefügt, um Arrays schnell auf die Festplatte zu schreiben/lesen.


Natürlich stehen wir noch am Anfang des Weges, aber der richtige Vektor der Bemühungen ist bereits klar.

Dies ist eine ausgewogene und erstaunlich objektive Bewertung von R.

Der konstruktive Teil der Diskussion war nicht umsonst. Sie hören sich die Kommentare und Vorschläge der R-Nutzer an. Auch wir sind daran interessiert, die Plattform zu verbessern.

Natürlich stehen Sie noch am Anfang, aber auf jeden Fall werden die R-Impfstoffe die MCL stärken.

Viel Glück bei Ihrer harten Arbeit.

 

Zu den Konventionen, von denen Burnakov gesprochen hat.

Betrachten wir drei sehr unterschiedliche Fälle.

1. Division durch eine Konstante, die gleich Null ist.

In R haben wir das Ergebnis

> 1/0
[1] Inf

Ist das Ergebnis korrekt?

Für den Interpreter ist dieses Ergebnis als korrekt zu betrachten, denn wir können R

Für den Compiler ist dieses Ergebnis korrekt. Wenn eine Ausnahmesituation eintritt, wird die Programmausführung unterbrochen und die Kontrolle über die Behandlung dieser Ausnahmesituation übernommen, andernfalls kommt es zum Absturz.

Beachten Sie, wie unterschiedlich sie ist!

2. Division durch eine Variable, die gleich Null ist.

> a<-0
> 1/a
[1] Inf

Streng genommen unterscheidet sich diese Variante von der vorherigen.

Die Funktion 1/a ist überall stetig, außer bei a=0. An diesem Punkt ist der linke Grenzwert = -Inf und der rechte Grenzwert = +Inf.

R versteht dies nicht, aber Sie können es akzeptieren, da der Unterschied zwischen minus unendlich und plus unendlich in der Mathematik einen Sinn ergibt, nicht im Programmcode


3. Division zweier infinitesimaler Mengen in ihrem Streben nach Null

> sin(a)/a
[1] NaN

Die Bedeutung von NaN ist mir völlig unklar. Unter Punkt 2 wird jedoch deutlich, dass R die Grenzen als solche nicht versteht.

Sind dies Fehler von R als Programmiersystem? Ich weiß es nicht. Wahrscheinlich hätte die R-Dokumentation über solche Nuancen informieren sollen, aber wie soll man das dann bei einer dezentralen Entwicklung von derzeit etwa 130.000 Funktionen umsetzen? Müssen wir das?

Was folgt daraus im Sinne der entstandenen Diskussion?

Die Entscheidungen werden an Land getroffen.

1. Wir nehmen R und übertragen den Code unverblümt auf MKL. Gleichzeitig müssen wir uns darüber im Klaren sein, dass die oben genannten Varianten in verschiedenen Funktionen von R unterschiedliche Interpretationen haben können

2. erklären Sie Vereinbarungen, welche Werte in den genannten Fällen akzeptiert werden (die Liste kann unvollständig sein). Wir prüfen den R-Code gründlich, und wenn er nicht mit unseren Einstellungen übereinstimmt, portieren wir ihn von R nach MCL und korrigieren ihn entsprechend unseren Vereinbarungen. In diesem Fall setzen wir aufgrund der zentralisierten Entwicklung die angenommenen Konventionen konsequent um und haben in diesem Sinne ein besseres System.

Grund der Beschwerde: