Friday 6 January 2017

F # Exponentiell Gleitender Durchschnitt

Towards Math. NET Numerics Version 3 Math. NET Numerics ist auf dem Weg in die nächste große Version, v3.0. Eine erste Vorschau Alpha wurde bereits in die NuGet-Galerie geschoben, obwohl es noch viel zu tun gibt. Wenn Sie möchten ein bisschen besser zu verstehen, wo wir derzeit sind, wo waren auf dem Weg, und warum, dann lesen Sie weiter. Warum eine neue Hauptversion Wir wenden die Prinzipien der semantischen Versionierung an. Was bedeutet, dass wir keine Teile der öffentlichen Oberfläche der Bibliothek, die fast alles in unserem Fall ist, bei kleineren Releases (mit dem 3-teiligen Versionsformat major. minor. patch) brechen soll. Dies stellt sicher, dass Sie leicht aktualisieren können in kleinere Versionen ohne zweite Gedanken oder brechen alle Ihre Code. Dennoch, manchmal gibt es wirklich einen guten Grund, um das Design zu ändern, weil es Weg zu kompliziert zu verwenden, inkonsistent, führt zu schlechten Leistungen oder war nur nicht sehr gut durchdacht. Oder wir haben einfach gelernt, wie man das besser macht. Vielleicht haben Sie bemerkt, dass einige Mitglieder als veraltet in den letzten paar kleinere Versionen deklariert wurden, mit Anregungen, wie es stattdessen zu tun, obwohl die alte Implementierung intakt gehalten wurde. Im Laufe der Zeit all diese alten Code wurde ein Schmerz zu pflegen, und die Nutzung der Bibliothek war viel komplizierter als nötig. Also beschloss ich, endlich die meisten dieser Probleme zu beheben und aufzuräumen. Wir bewegen etwas Käse in dieser Version. Ihr Code wird in ein paar Gelegenheiten zu brechen. Aber in allen Fällen sollte ein Fix einfach sein, wenn nicht trivial. Auch einmal dort werden wir wieder durch semantische Versionierung gebunden, um die Bibliothek stabil über alle zukünftigen kleinere Versionen und damit wahrscheinlich für die kommenden Jahre zu halten. Auch können wir die Bereitstellung von Patches für die alte v2 Zweig, wenn nötig für eine Weile. Trotzdem empfehle ich dringend, ein Upgrade auf v3 durchzuführen. Feedback ist willkommen Eine erste Vorschau (v3.0.0-alpha1) wurde bereits bei NuGet veröffentlicht und ich plane, mindestens zwei weitere Preview-Releases durchzuführen, bevor wir die erste Version v3.0 erreichen. Bitte werfen Sie einen Blick darauf und geben Sie Feedback - jetzt ist eine einzigartige Möglichkeit, Änderungen zu brechen. Überblick über das bisher Erreichte Namespace Vereinfachungen. Zweckmäßigeres Design. Stellen Sie sicher, dass alles gut funktioniert und fühlt sich native sowohl in C und F. Verwenden Sie gemeinsame Kurznamen, wenn bekannt, anstatt sehr lange volle Namen (Trigonometrie). Lineare Algebra: Die Verwendung der generischen Typen ist der empfohlene Weg jetzt stellen Sie sicher, es funktioniert gut. Die IO-Klassen für die Matrixvektor-Serialisierung werden separate Pakete. Große Refactoring der iterativen Löser. Gefüllt einige fehlende Stücke, verschiedene Vereinfachungen, viele andere Änderungen. Ausschüttungen: Größere Aufräumarbeiten. Direkte Belichtung von Verteilungsfunktionen (pdf, cdf, etc). Parameterschätzung. Neue Distanzfunktionen Überblick, was geplant ist Iterative Löser brauchen mehr Arbeit. Id auch so zu gestalten, dass sie manuell, auf einfache Weise iteriert werden können. Integrale Transformationen (FFT etc.) benötigen große Refactoring. Unterstützt durch native Anbieter, wenn möglich. (FIR, IIR, gleitender Durchschnitt, etc.) Die aktuelle QR-Zersetzungs-basierte Kurvenanpassung ist für große Datensätze ineffizient, aber die Festsetzung ist eigentlich nicht sehr kompliziert. Untersuchen und beheben Sie eine Inkonsistenz in der Precision-Klasse. Drop redundante NULL-Checks Details zu Whats neu in Version 3 bisher Tropping. Algorithmen Namespaces Haben Sie schon einmal zu öffnen 10 verschiedene Math. NET Numerics Namespaces, um alles, was Sie brauchen Dies sollte etwas besser in v3, wie die statischen Fassaden wie Integrieren . Interpolieren. Fit oder FindRoots für einfache Fälle wurden direkt in den Root-Namensraum MathNet. Numerics und alle Algorithmen-Namespaces (für fortgeschrittene Anwendungen) des Formulars MathNet. Numerics. X.Algorithmen sind jetzt einfach MathNet. Numerics. X verschoben. Interpolation Zusätzlich zu den vereinfachten Namespaces wurde die letzte Differentiate-Overload, die den interpolierten Wert zurückliefert, und die erste und zweite Ableitung an einem Punkt x vereinfacht: Anstelle von zwei Out-Parametern in einer unerwarteten Reihenfolge gibt sie nun ein Tupel mit einer vernünftigen Reihenfolge zurück . Integration Das Design der doppelt-exponentiellen Transformation war eher komisch. Es wurde zu einer statischen Klasse vereinfacht und ist viel einfacher zu verwenden, explizit. Wahrscheinlichkeitsverteilungen Obwohl es immer möglich war, eine Zufallsquelle (RNG) einer Verteilung für die Zufallszahlenabtastung zuzuordnen, war sie etwas kompliziert und erforderte zwei Schritte. Jetzt haben alle Verteilerbauer eine Überlast, die eine kundenspezifische Zufallsquelle direkt beim Bau in einem einzigen Schritt akzeptiert. Einige Distributionen unterstützen nun die Maximum-Likelihood-Parameterschätzung und die meisten Distributionen implementieren eine inverse kumulative Verteilungsfunktion. Verteilungsfunktionen wie PDF. CDF und InvCDF werden nun direkt als statische Funktionen belichtet. Die Inline-Dokumentation und die Parameternamen wurden deutlich verbessert. ChiSquare wurde ChiSquared. Und die IDistribution-Schnittstelle wurde IUnivariateDistribution. Einfachere, mehr komposible Zufallsstichproben in F mit neuem Sample-Modul. New Distance-Funktionen Standardroutinen zur Auswertung der Euklidischen, Manhattan - und Chebyschev-Abstände zwischen Arrays oder Vektoren, auch für die gemeinsame Summe aus Absolute Difference (SAD), Mean-Absolute Error (MAE), Summe der Quadraturdifferenz (SSD) und Mean-Squared Fehler-MSE-Metriken. Hamming Entfernung. Nutzung von Anbietern, soweit angemessen. Weniger NULL-Prüfungen und ArgumentNullExceptions Wahrscheinlich als ein Nebeneffekt aus meiner Exposition gegenüber funktionalen Programmierung im letzten Jahr, ich nicht mehr folgen die Argumente, warum in C jede Routine muss explizit alle Argumente für null überprüfen. Ich habe schon ein paar dieser Schecks, aber es gibt noch mehr als 2000 Plätze, wo Math. NET Numerics wirft eine ArgumentNullException. Die meisten von ihnen werden wahrscheinlich weg sein. Es gibt einen Fall, in dem es sinnvoll ist, sie zu behalten: Wenn eine Routine ein Argument akzeptiert, aber es nicht sofort benutzt (und daher keine sofortige NullReferenceException verursacht), könnte ein Nullreferenz-Sneaking in schwer zu debuggen sein, also gut Behalten Sie den Scheck. Aber solche Fälle sind durch die Natur der Bibliothek ziemlich selten. IO-Bibliothek Die IO-Bibliothek, die als Teil des Kernpakets verteilt wurde, ist nun ein Satz von separaten NuGet-Paketen, z. B. MathNet. Numerics. Data. Text. Und lebt in einem separaten Repository. Bevorzugte generische lineare Algebra-Typen Da der generische Namensraum immer die ganze Zeit benötigt wurde und der empfohlene glückliche Pfad nun immer die generischen Typen verwendet, wurde alles aus dem. Generic-Namespace um einen Namensraum verschoben. Von nun an müssen Sie in der Regel nur zwei Namespaces öffnen, wenn Sie mit der linearen Algebra arbeiten, auch wenn Faktorisierungen erforderlich sind. Wenn Sie zum Beispiel den doppelten Typ verwenden, öffnen Sie MathNet. Numerics. LinearAlgebra und MathNet. Numerics. LinearAlgebra. Double. Da die Schreibweise in F stärker ist, erhalten alle Init-Funktionen im F-Modul jetzt direkt generische Typen zurück, so dass Sie nicht ständig manuell upgraden müssen. Die meisten Routinen wurden verallgemeinert, um auf generischen Typen zu arbeiten. Für Fälle, in denen Sie generische Algorithmen implementieren möchten, aber auch neue dichte oder spärliche Matrizen oder Vektoren erstellen müssen, wurde ein neuer generischer Builder hinzugefügt. Dies sollte nur selten in Benutzer-Code benötigt werden. Fehlende Skalar-Matrix-Routinen Ein paar fehlende Skalar-Matrix-Routinen wie das Hinzufügen oder Subtrahieren eines Skalars zu einer Matrix oder die Division eines Skalars durch eine Matrix wurden hinzugefügt, unterstützt von den Anbietern, wo möglich. Theres jetzt auch ein Modul-Routine. Point-weise Infix-Operatoren wo unterstützt (F) Weve Punkt-weise hinzugefügt .. und. Operatoren zu Matrizen und Vektoren in der Kernbibliothek. Dies ist nicht in allen. NET-Sprachen unterstützt, aber funktioniert gut in F, obwohl ohne Currying-Unterstützung. Natürlich in den anderen Sprachen können Sie weiterhin die normalen Methoden wie bisher verwenden. Faktorisierungs - und Iterationslöser Bisher war die Matrixfaktorisierung nur durch Erweiterungsmethoden oder explizite Schaffung zugänglich, was bei der Verwendung von generischen Typen nicht sehr gut funktionierte. Der generische Matrixtyp bietet nun Methoden zur direkten Erzeugung. Als solche wurden die tatsächlichen Implementierungen verinnerlicht, da kein direkter Zugriff mehr erforderlich ist. Die QR-Faktorisierung ist jetzt standardmäßig dünn, und factorizations nicht mehr klingen ihre Ergebnisse ohne praktischen Grund. Das iterative Lösungsdesign wurde wesentlich vereinfacht und ist nun generisch und geteilt, wo möglich und akzeptiert generische Typen überall. Die Namespaces sind jetzt viel flacher als die sehr detaillierte Struktur fügte keinen Wert aber bedeutete, musste man ein Dutzend Namespaces öffnen. Verschiedene lineare Algebra-Verbesserungen Vektoren verfügen jetzt zusätzlich zu DotProduct über eine ConjugateDotProduct-Routine. Vektoren bieten nun explizit richtige L1, L2 und Unendlich Normen Matrizen Vektoren haben nun konsistente Zähler, mit einer Variante, die überspringt Nullen (nützlich, wenn spärlich). Matrix Vektorerstellungsroutinen wurden vereinfacht und benötigen in der Regel keine expliziten Dimensionen mehr. Neue Varianten zur Erzeugung diagonaler Matrizen oder solche, bei denen alle Felder den gleichen Wert haben. Matrizen Vektoren stellen fest, ob Speicher mit einer neuen IsDense-Eigenschaft dicht ist. Provider wurden in einen Provider-Namespace verschoben und sind wieder vollständig generisch. Robuster komplexer Asin Acos für große reelle Zahlen. Trigonfunktionen: Gemeinsame Kurznamen anstelle von sehr langen Namen. Komplex: gemeinsame Kurznamen für Exp, Ln, Log10, Log. Statistik: Neue MeanVariance-Methode (wie häufig zusammen verwendet). Dieses Thema bei Mister Wong speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Dieses Thema bei YiGG. de speichern Ive vor kurzem denkend über die Fälle, in denen Sie nicht eine 1: 1 Karte zwischen vorher und nach haben. Fälle, in denen List. map fällt. Ein Beispiel hierfür sind gleitende Mittelwerte, wobei in der Regel len-n1 Ergebnisse für eine Liste der Länge len bei Mittelung über n Elemente. Für die Gurus da draußen, ist dies ein guter Weg, es zu tun (mit der Warteschlange gequetscht von Jomo Fisher) (Vielleicht ein besserer Weg wäre, eine MovingAverageQueue durch Erben von Fifo umzusetzen) fragte Nov 17 08 um 11:12 Ich hatte zu erklären Wie es MovingAverage n (s. Seqltfloatgt), um diese in einem Utility-Modul, weg von der Call-Site, um das Typ-System zu beruhigen. Soweit ich sagen kann, funktioniert dies nur mit Floats, aufgrund einer Einschränkung von Array. average. MSDN Ansprüche kann ich ersetzen, die mit Array. averageBy, um diese auf eine int-Sequenz verwenden, aber das gibt einen anderen Fehler. Brian, können Sie reformulieren diese Antwort, um in generischen Kontexten zu arbeiten, so dass es mit seq-of-any-arithmetic-type, ohne Typ-Schlußfolger funktionieren ndash Warren Young Ich sollte darauf hinweisen, dass meine Notwendigkeit für Diese gleitende Mittelfunktion ist, ein kurzes Fenster (30ish) über einer Folge der ganzen Zahlen zu erhalten, die fast alle in den Millionen sind, also I don39t Gleitkomma brauchen. Auch eine einzige Stelle rechts vom Dezimalpunkt ist in meiner Anwendung nicht praktikabel. Umwandlung meiner ganzen Zahlen in FP und das Ergebnis zurück zu int nur um die F-Standard-Bibliothek zu beschwichtigen doesn39t appellieren. Ndash Warren Young Wenn Sie kümmern sich um Leistung, dann können Sie berechnen einen gleitenden Durchschnitt effizient mit so etwas (vorausgesetzt waren die Berechnung eines gleitenden Durchschnitt über ein 3-Tage-Fenster) Der harte Teil über dieses hält Auf Ihrer vorherigen laufenden Gesamt - und Anzahl N-Fenster. Ich kam mit dem folgenden Code: Diese Version ist nicht so schön aussehende wie die Haskell-Code, aber es sollte Performance-Probleme mit der Neuberechnung Ihres Fensters bei jedem Lauf zu vermeiden. Es hält eine laufende Summe und hält zuvor verwendeten Zahlen in einer Warteschlange, so sollte es sehr schnell sein. Nur für Spaß, schrieb ich einen einfachen Benchmark: Wenn Sie über Leistung und wie eleganten Code dann versuchen Verwenden Sie FSUnit können wir es testen Der Trick des Algorithmus ist die erste Summe die ersten n-Zahlen und dann eine laufende Summe, indem Sie den Kopf Des Fensters und Subtrahieren des Schwanzes des Fensters. Das Schiebefenster wird erreicht, indem man einen Selbstzip auf der Sequenz ausführt, aber mit dem zweiten Argument zum Zip, das durch die Fenstergröße erweitert wird. Am Ende der Pipeline teilen wir die laufende Summe mit der Fenstergröße auf. Anmerkung scan ist gerade wie Falte aber liefert jede Version des Zustandes in eine Reihenfolge. Eine noch elegantere Lösung, obwohl possibley mit Performance-Hit ist es, die Beobachtung, dass, wenn wir Null-Pad die Sequenz brauchen wir nicht brauchen, um die anfängliche Summe zu berechnen. Es könnte ein Performance-Hit aufgrund der zweiten Indirektion im Zusammenhang mit der Umhüllung der beiden Sequenzen, aber vielleicht ist es nicht signifikant abhängig von der Größe des Fensters beantwortet Aug 31 12 bei 8:06


No comments:

Post a Comment