Monday 13 February 2017

F # Moving Durchschnitt

Wenn Sie unbedingt eine Bibliothek wollen, können Sie sich diese Frage anschauen. Oder suchen Sie nach anderen Fragen über die Statistik Bibliotheken auf. Hier ist eine Implementierung von quickselect. Es hat die Zeit O (n) und die schlimmste Zeit O (n 2) erwartet. Die einzige Einschränkung für den Typ ist, dass sie vergleichbar sind. Ich habe Fortsetzungen, um es tail-recursive. Ich habe versucht, die Anrufe so zu schreiben, dass sie einem einfachen rekursiven Aufruf gleicht Anstelle von x, yf a b Körper habe ich f a b (fun x y - gt Körper) verwendet. Es könnte ein wenig mit der CPS-Monade vereinfacht werden. Ich arbeite immer noch an Groking der F-Sache - versuchen, herauszufinden, wie man in F zu denken, anstatt nur die Übersetzung von anderen Sprachen, die ich kenne. 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 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 der 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 at 08: 06Tomas Petricek Suchen nach neuen Denkweisen in der Programmierung amp Arbeitet mit Daten Ich glaube, dass die interessanteste Arbeit ist nicht die eine Lösung schwerer Probleme, sondern die eine Veränderung, wie wir über die Welt denken. Ich folge diesem Glauben an meine Arbeit an Data-Science-Tools, funktionale Programmierung und F-Lehre, in meiner Programmiersprachenforschung und ich versuche, es durch Philosophie der Wissenschaft zu verstehen. Ich arbeite daran, das datengesteuerte Geschichtenerzählen einfacher, offener und reproduzierbarer im Alan Turing Institute zu machen. Consulting Im Autor der endgültigen F Bücher und Open-soruce Bibliotheken. Ich biete meine F Schulung und Beratung als Teil von fsharpWorks an. Ich veröffentlichte Beiträge über Theorie der kontextbewussten Programmiersprachen, Typ-Provider, sondern auch Philosophie der Wissenschaft. Neue Funktionen und Verbesserungen in Deedle v1.0 Wie Howard Mansell bereits auf dem BlueMountain Tech-Blog angekündigt hat. Haben wir offiziell die Version 1.0 von Deedle veröffentlicht. Falls Sie noch nichts von Deedle gehört haben, ist es eine Bibliothek für interaktive Datenanalyse und Exploration. Deedle arbeitet großartig mit C und F. Es bietet zwei wichtige Datenstrukturen: Serie für die Arbeit mit Daten und Zeitreihen und Rahmen für die Arbeit mit Sammlungen von Serien (denken CSV-Dateien, Datentabellen etc.) Das große an Deedle ist, dass es Wurde zu einer Grundbibliothek, die es ermöglicht, eine breite Palette unterschiedlicher Datenwissenschaften zu integrieren. Zum Beispiel funktioniert der R-Typ-Anbieter gut mit Deedle und so auch F Charting. Weve arbeitet auch an der Integration all dieser in einem einzigen Paket namens FsLab. Aber mehr über das nächste Mal In diesem Blog-Post, Ill haben einen schnellen Blick auf ein paar neue Features in Deedle (und entsprechende R-Typ Anbieter-Version). Howards Ankündigung hat eine detaillierte Liste. Aber ich möchte nur ein paar Beispiele geben und kurz auf Leistung improvemens kommentieren, die wir getan haben. Was ist neu in Deedle Vielleicht ist der sichtbarste Unterschied in der neuen Version, dass viele der Funktionen umbenannt werden. Wir dachten, dass vor v1.0, hatten wir eine einzigartige Chance, die Benennung Recht zu bekommen, so dass wir eine Menge von Umbenennungen, um sicherzustellen, dass alles konsistent ist. Zum Beispiel, einige Funktionen verwendet Serie und einige Spalte. Einige benutzte Art und andere Ordnung und so weiter. Dies sollte nun aufgeräumt werden. Ebenso haben wir eine Reihe von Fehlanpassungen zwischen den Serien - und Rahmenmodulen festgelegt. Ergänzungen zu Deedle API Neben der Umbenennung haben wir auch einige nützliche Funktionen hinzugefügt. Zum Beispiel vergleicht die Homepage-Probe die Überlebensrate für verschiedene Passagierklassen. Dies kann nun noch einfacher mit PivotTable geschehen: Die Operation gruppiert die Zeilen nach den beiden Schlüsseln und führt dann Aggregation mit der angegebenen Funktion durch (hier Frame. countRows). Dies ist eine gemeinsame Operation und so wollten wir es so einfach wie möglich machen. Wir setzen auch weiterhin Operationen sowohl als F-Funktionen in Modulen als auch als C-freundliche Methoden. Ein weiteres Beispiel, in dem wir viele Verbesserungen vorgenommen haben, ist die Statistik: Die erste Verbesserung ist, dass man nun beim Laden von Daten aus einer CSV-Datei eine Schlüsselspalte angeben kann (dies ist sehr häufig). Das gleiche Feature ist verfügbar, wenn Sie Daten aus einer Sequenz von Objekten mit Frame. ofRows laden. Die nächste neue Sache ist das Modul Stats. Dies ist der neue Platz für alle Funktionen in Bezug auf Statistik und numerische Berechnungen. Wir fanden, dass das Hinzufügen weiterer Funktionen zu Series und Frame-Module ein wenig verwirrend war, so dass wir alle statistischen Funktionen an einem Ort verschoben. Dies ist umso wichtiger, da wir weitere Funktionen hinzugefügt haben (Kurtosis, Schiefe, Varianz), und wir haben mehr Möglichkeiten hinzugefügt, diese zu berechnen (Bewegen und Expandieren von Fenstern). Weitere Informationen finden Sie auf der Seite "Frame - und Serienstatistik". Verbesserte Dokumentation Schließlich ist eine der Stärken von Deedle, dass sie eine ausgezeichnete Dokumentation hat. Dies ist jetzt noch mehr der Fall, weil wir die Dokumentation automatisch aus Markdown Kommentare im Quellcode generiert. Insbesondere für die drei Core-Module bietet das Series-Modul Funktionen zum Arbeiten mit einzelnen Datenreihen und Zeitreihenwerten. Dazu gehören Operationen wie Sampling, Transformationen, Datenzugriff und vieles mehr. Frame-Modul bietet Funktionen, die denen des Series-Moduls ähnlich sind, aber auf ganzen Datenrahmen arbeiten. Stats-Modul implementiert standardmäßige statistische Funktionen (Mittelwert, Varianz, Kurtosis, Schiefe usw.) über Serien, bewegliche Fenster, expandierende Fenster und vieles mehr. Das Modul enthält Funktionen für Serien und Rahmen. Was ist neu im R-Anbieter Zusammen mit einem neuen Release von Deedle haben wir auch den R-Provider aktualisiert. Es gibt ein paar Verbesserungen, die es viel besser machen: Die Installation von NuGet nicht mehr auf PowerShell-Installationsskript verlassen, so kann es auf Mono und bei der Verwendung der Restore Packages Funktion zu arbeiten. Der Typ-Provider kommuniziert mit R über einen separaten Prozess, so dass es stabiler ist und es wird uns auch nennen 64-Bit-Version von R. Dies sind technische, aber sehr wichtige Verbesserungen. Allerdings haben wir auch eine nette neue Funktion hinzugefügt, die es noch einfacher macht, R - und F-RData-Provider zu mischen. In R können Sie Arbeitsbereiche (Umgebungen) in. rdata-Dateien speichern. Dies ist nützlich, wenn Sie Ergebnisse einer interaktiven Analyse in der R-Umgebung archivieren möchten. Aber, wäre es nicht schön, wenn Sie könnten einige Datenanalyse in R und dann speichern Sie die Daten in eine Datei und laden Sie es einfach aus F in einer Art-sicheren Weg Dies ist genau das, was Sie mit dem RData-Typ-Anbieter zu bekommen Haben Autos. rdata-Datei mit dem mtcars-Datensatz (gespeichert unter dem Namen Autos) zusammen mit einer Liste mpg und einem Wert mpgMean. Ich kann schreiben: Wenn Sie die Typen betrachten, sehen youll, dass file. mpg vom Typ float ist und file. cars vom Typ Frameltstring, stringgt ist. Der R-Provider verwendet die installierten Plugins (wie das Deedle-Plugin), um den passendsten F-Typ für die Belichtung der Daten zu finden, und so werden die R-Datenrahmen-Autos automatisch als Deedle-Rahmen belichtet. Auf diese Weise können wir die Werte schnell durch cyl (Anzahl der Zylinder) gruppieren und dann durchschnittliche Meilen pro Gallone mpg für jede der Gruppen berechnen. Mit F Charting sieht das Ergebnis so aus: Deedle Performance-Verbesserungen In dieser Version von Deedle verbrachten wir einige Zeit mit der Verbesserung der Performance. Die erste Version wurde unter Berücksichtigung der Leistungsfähigkeit entworfen, und die Internals ermöglichen es, Operationen effizient zu implementieren (z. B. in F, es ist ziemlich einfach, Code zu schreiben, so daß die Daten in kontinuierlichen Speicherblöcken gespeichert werden). Allerdings gab es eine Reihe von Orten, wo einige Deedle-Funktion nur die einfachste dumme Art und Weise, um Dinge zu erledigen verwendet. Das war schön, denn es ließ uns schnell eine anspruchsvolle und einfach zu bedienende API zu bauen, aber es gab Fälle, wo die Dinge waren einfach zu langsam. Also, die Verbesserung der Leistung ist eine kontinuierliche Anstrengung und wenn Sie einen Anwendungsfall finden, in dem Deedle langsam ist, senden Sie bitte ein Problem Messleistung Um sicherzustellen, dass wir die Leistung überwachen können, habe ich ein recht einfaches Tool, mit dem wir die Leistung messen können. Dies ist derzeit in meiner Branche verfügbar. Das Tool wird über ein FAKE-Skript gestartet und misst die Performance aller Tests in einer angegebenen Datei. Die Tests dienen auch als Einheitstests. Beispiel: Das PerfTest-Attribut gibt an, dass es sich bei der Funktion um einen Leistungstest handelt. Außerdem können Sie die Anzahl der Iterationen festlegen, sodass wir schnelle Tests wiederholt ausführen, aber nur wenige Male langsame Tests durchführen. Absolute Performance Ich habe zwei einfache Analysen der Performance. Das erste Diagramm vergleicht die neue Version von Deedle mit der vorherigen Version, die auf NuGet verfügbar ist: Die Zahlen stellen die Gesamtzahl der Millisekunden dar, die zum Ausführen des Tests benötigt werden. Beachten Sie, dass die X-Achse auf 10 Sekunden begrenzt ist, aber einige der Tests tatsächlich länger dauern, mit der alten Version. Auch einige Tests haben nur Wert, wenn Sie die neue Version verwenden - das ist, weil sie Funktion verwenden, die neu in v1.0 ist. Ein paar Punkte erwähnenswert: Einige der bemerkenswerten Verbesserungen sind beim Zusammenführen von Serien - dies gilt auch für die Verbindung von Rahmen (z. B. bei der Anwendung numerischer Operationen). Wir haben auch eine Überladung von Merge auf Frames hinzugefügt, die mehrere Serien gleichzeitig verschmelzen können, was bedeutend schneller ist (und Sie können z. B. 1000 Frames zusammenführen, die vorher zu langsam waren). Es gibt eine Reihe von Verbesserungen in Resample-Operationen. Auch dies ist nur ein Beispiel für eine allgemeinere Beschleunigung (die auch Auswirkungen auf Fenster-und Chunking-Funktionen). Relative Performance In der vorherigen Tabelle ist es ein bisschen schwierig zu sehen, was ist die größte Performance-Verbesserung. In der folgenden Tabelle werden die Tests skaliert, so dass die Leistung, die die ursprüngliche Version (0.9.12) verwendet, als 100 verwendet wird und die Leistung, die die neue Version verwendet, als Prozentsatz angezeigt wird (so schneiden 10sec bis 5sec zeigt als 50) Können Sie eine Reihe von interessanten Dingen zu sehen: Der größte Speedup ist auf Zugreifen auf Float-Serie über Objekt-Serie. Dies ist der Fall, wenn Sie eine Spalte auf einem Rahmen mit df. Columns (die eine Reihe von ObjectSeriesltKgt-Werten zurückgibt) zugreifen. Da wir die Art der einzelnen Spalten nicht kennen, geben wir sie als Serie mit obj-Werten zurück. In der neuen Version, dies nicht wirklich Box die Werte und so die Umwandlung der Serie zurück zu SeriesltK, ist Floatgt im Wesentlichen no-op. Wir haben auch einige Arbeiten zur Verbesserung der Gruppierung (und verwandte) Operationen, so, zum Beispiel die Homepage-Probe ist jetzt etwa doppelt so schnell. Es gibt noch (viel) Raum für Verbesserungen, aber wie Sie sehen können, waren hart daran arbeiten. Die Beitritts - und Zusammenführungsoperationen sind etwa 6x schneller, aber für Merge ist dies umso bedeutsamer, wenn man mehrere Frames zusammenführt. Die Tests, die ich hier aufgenommen habe, sind keineswegs umfassend. Sie stellen einfach ein paar Testfälle dar, an denen ich gearbeitet habe. Allerdings mit der Performance-Messungen vorhanden, sollten wir in der Lage, diese immer öfter verwenden Also, wenn Sie einen interessanten Anwendungsfall haben, senden Sie eine Pull-Anforderung Hinzufügen eines Leistungstests Die Version 1.0 von Deedle ist ein wichtiger Meilenstein. Obwohl Deedle seit November ist (und es wurde intern von BlueMountain verwendet), bedeutet die Version 1.0, dass die Bibliothek wird immer stabiler und bereit für andere zu übernehmen. Natürlich gibt es immer Raum für Verbesserungen. Es gibt Operationen, die schneller (bitte melden Sie sie), gibt es Funktionen, die hinzugefügt werden sollten (bitte vorschlagen) und es gibt wahrscheinlich einige Bugs. Ich markierte einige Probleme als up-for-Grabs, falls Sie direkt beitragen wollten. Eine weitere wichtige Sache über Deedle ist, dass es eine grundlegende Komponente ist, um die wir einen genialen Data Science Stack erstellen können. Wenn Sie interessiert sind, registrieren Sie sich bei fslab. org und folgen Sie diesem Blog für weitere Informationen. Es gibt viele Leute, die zu Deedle (und R-Anbieter) beigetragen haben, aber die Projekte würden nicht ohne Howard Mansell und Adam Klein bei BlueMountain existieren. Eine Menge der R-Anbieter Arbeit wurde von David Charboneau. Danke Art Umfeld 160160Statisches Mitglied CommandLine. Zeichenfolge 160160static member CurrentDirectory. Zeichenfolge mit get, set 160160static member Exit. ExitCode: int - gt Einheit 160160static Member ExitCode. Int mit get, set 160160static Member ExpandEnvironmentVariables. Name: Zeichenfolge - gt string 160160static member FailFast. Message: string - gt Einheit 1 Überladung 160160static member GetCommandLineArgs. Einheit - gt string 160160static member GetEnvironmentVariable. Variable: string - gt string 1 Überladung 160160static member GetEnvironmentVariables. Einheit - gt IDictionary 1 overload 160160static member GetFolderPath. Folder: SpecialFolder - gt string 1 overload 160160. 160160nested type SpecialFolder 160160nested Typ SpecialFolderOption Vollständiger Name: System. Environment-Eigenschaft System. Environment. CurrentDirectory: string Mehrere Elemente namespace FSharp val shouldEqual. A: 39a - gt b: 39b - gt Einheit val titanic. Frameltint, stringgt Vollständiger Name: Deedle-v1.titanic Mehrere Elemente module Frame -------------------- type Frame 160160static member ReadReader. Leser: IDataReader - gt Frameltint, stringgt 160160static Mitglied CustomExpanders. DictionaryltType, Funcltobj, seqltstring Typ objgtgtgt 160160Statistisches Mitglied NonExpandableInterfaces. ListltTypegt 160160Statistisches Mitglied NonExpandableTypes. HashSetltTypegt Vollständiger Name: Deedle. Frame -------------------- type Framelt39TRowKey, 39TColumnKey (erfordert Gleichheit und Gleichheit) gt 160160interface IDynamicMetaObjectProvider 160160interface INotifyCollectionChanged 160160interface IFsiFormattable 160160interface IFrame 160160new. Namen: seqlt39TColumnKeygt Spalten: seqltISerieslt39TRowKeygtgt - gt Framelt39TRowKey, 39TColumnKeygt 160160private neu. RowIndex: IIndexlt39TRowKeygt columnIndex: IIndexlt39TColumnKeygt-Daten: IVectorltIVectorgt - gt Framelt39TRowKey, 39TColumnKeygt 160160member AddColumn. Spalte: 39TColumnKey-Serie: ISerieslt39TRowKeygt - gt Einheit 160160Mit AddColumn. Säule: 39TColumnKey Serie: seqlt39Vgt - gt Einheit 160160Mit AddColumn. Column: 39TColumnKey-Serie: ISerieslt39TRowKeygt Nachschlagen: Lookup - gt Einheit 160160member AddColumn. Spalte: 39TColumnKey-Serie: seqlt39Vgt Lookup: Lookup - gt Einheit 160160. Vollständiger Name: Deedle. Framelt, gt -------------------- neu. Namen: seqlt39TColumnKeygt Spalten: seqltISerieslt39TRowKeygtgt - gt Framelt39TRowKey, 39TColumnKeygt statischer Member Frame. ReadCsv. Pfad: string hasHeaders: bool inferTypes: bool inferRows: int Schema: String-Trennzeichen: String-Kultur: string maxRows: int - gt Frameltint, stringgt statischer Member Frame. ReadCsv. Stream: IO. Stream hasHeaders: bool inferTypes: bool inferRows: int Schema: String-Trennzeichen: String-Kultur: string maxRows: int - gt Frameltint, stringgt statischen Member Frame. ReadCsv. Pfad: String indexCol: String hasHeaders: bool inferTypes: bool inferRows: int Schema: String-Trennzeichen: String-Kultur: String maxRows: int - gt Framelt39R, stringgt (erfordert Gleichheit) val pivotTable. RowGrp: (39R - gt ObjectSerieslt39Cgt - gt 39RNew) - gt colGrp: (39R - gt ObjectSerieslt39Cgt - gt 39CNew) - gt auf: (Framelt39R, 39Cgt - gt 39T) - gt Rahmen: Framelt39R, 39Cgt - gt Framelt39RNew, 39CNewgt (erfordert Gleichheit und Gleichheit und Gleichheit und Gleichheit) Vollständiger Name: Deedle. Frame. pivotTable val row. ObjectSeriesltstringgt Member ObjectSeries. GetAs. Spalte: 39K - gt 39R Member ObjectSeries. GetAs. Column: 39K fallback: 39R - gt 39R Mehrere Elemente val string. Value: 39T - gt string Vollständiger Name: Microsoft. FSharp. Core. Operators. string Vollständiger Name: Microsoft. FSharp. Core. string Typ bool Boolean Vollständiger Name: Microsoft. FSharp. Core. bool val countRows. Frame: Framelt39R, 39Cgt - gt int (erfordert Gleichheit und Gleichheit) Vollständiger Name: Deedle. Frame. countRows statischer Member FrameExtensions. PivotTable. Rahmen: Framelt39R, 39Cgt r: 39C c: 39C op: FuncltFramelt39R, 39Cgt, 39Tgt - gt Framelt39R, 39Cgt (erfordert Gleichheit und Gleichheit) member Frame. PivotTable. R: 39TColumnKey c: 39TColumnKey op: (Framelt39TRowKey, 39TColumnKeygt - gt 39T) - gt Framelt39R, 39Cgt (erfordert Gleichheit und Gleichheit und Gleichheit und Gleichheit) val msft. FrameltDateTime, stringgt Vollständiger Name: Deedle-v1.msft Mehrere Elemente Typ DateTime 160160struct 160160160160new. Ticks: int64 - gt DatumTime 10 Überladungen 160160160160member Hinzufügen. Wert: TimeSpan - gt DatumTime 160160160160Member AddDays. Wert: float - gt DatumTime 160160160160Mit AddHours. Wert: float - gt DatumTime 160160160160Member AddMilliseconds. Wert: float - gt DateTime 160160160160Mitglieder hinzufügen AddMinutes. Wert: float - gt DatumTime 160160160160member AddMonths. Monate: int - gt DatumTime 160160160160Member AddSeconds. Wert: float - gt DatumTime 160160160160Mit AddTicks. Wert: int64 - gt DatumTime 160160160160Member AddJahre. Wert: int-Date Datum 160160160160. 160160end Vollständiger Name: System. DateTime -------------------- DateTime () 160160160 (0 andere Überladungen) DateTime (ticks: int64) . Einheit 160160160 (0 andere Überladungen) DateTime (ticks: int64, art: DateTimeKind). Einheit 160160160 (0 andere Überladungen) DateTime (Jahr: int, Monat: int, Tag: int). Einheit 160160160 (0 andere Überladungen) DateTime (Jahr: int, Monat: int, Tag: int, Kalender: Globalization. Calendar). Einheit 160160160 (0 andere Überladungen) DatumTime (Jahr: int, Monat: int, Tag: int, Stunde: int, minute: int, second: int). Einheit 160160160 (0 andere Überladungen) DateTime (Jahr: int, Monat: int, Tag: int, Stunde: int, minute: int, second: int, kind: DateTimeKind). Einheit 160160160 (0 andere Überladungen) DateTime (Jahr: int, Monat: int, Tag: int, Stunde: int, minute: int, second: int, calendar: Globalization. Calendar). Einheit 160160160 (0 andere Überladungen) DatumTime (Jahr: int, Monat: int, Tag: int, Stunde: int, minute: int, second: int, millisecond: int). Einheit 160160160 (0 andere Überladungen) DatumTime (Jahr: int, Monat: int, Tag: int, Stunde: int, minute: int, second: int, millisecond: int, kind: DateTimeKind). Einheit 160160160 (0 Andere Überladungen) type Statistiken 160160static member count. Rahmen: Framelt39R, 39Cgt - gt Serieslt39C, intgt (erfordert Gleichheit und Gleichheit) 160160static Member count. Serie: Serieslt39K, 39Vgt - gt int (erfordert Gleichheit) 160160static member expandingCount. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static member expandingKurt. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static Member expandingMax. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static Member expandingMean. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static Member expandingMin. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static Mitglied expandingSkew. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static Member expandingStdDev. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160static member expandingSum. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) 160160. Vollständiger Name: Deedle. Stats statisches Mitglied Stats. movingVariance. Größe: int - gt-Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) statisches Mitglied Stats. expandingMean. Serie: Serieslt39K, floatgt - gt Serieslt39K, floatgt (erfordert Gleichheit) statisches Mitglied Stats. kurt. Rahmen: Framelt39R, 39Cgt - gt Serieslt39C, floatgt (erfordert Gleichheit und Gleichheit) statisches Mitglied Stats. kurt. Serie: Serieslt39K, floatgt - gt float (erfordert Gleichheit) Vollständiger Name: Deedle-v1.file Vollständiger Name: Deedle-v1.mean1 Typ Array 160160member Clone. Einheit - gt obj 160160Member CopyTo. Array: Array-Index: int - gt Einheit 1 Überlast 160160Member GetEnumerator. Einheit - gt IEnumerator 160160member GetLength. Dimension: int - gt int 160160Member GetLongLength. Größe: int - gt int64 160160Member GetLowerBound. Dimension: int - gt int 160160Member GetUpperBound. Dimension: int - gt int 160160member GetValue. LtParamArraygt-Indizes: int - gt obj 7 Überladungen 160160member Initialisieren. Einheit - gt Einheit 160160Mit IsFixedSize. Bool 160160. Vollständiger Name: System. Array val Durchschnitt. Array: 39T - gt 39T (erfordert Member () und Member DivideByInt und Member getZero) Vollständiger Name: Microsoft. FSharp. Collections. Array. average Vollständiger Name: Deedle-v1.mean2 val groupRowsByInt. Spalte: 39C - gt Rahmen: Framelt39R, 39Cgt - gt Framelt (int 39R), 39Cgt (erfordert Gleichheit und Gleichheit) Vollständiger Name: Deedle. Frame. groupRowsByInt val getCol. Spalte: 39C - gt Rahmen: Framelt39R, 39Cgt - gt Serieslt39R, 39Vgt (erfordert Gleichheit und Gleichheit) Vollständiger Name: Deedle. Frame. getCol statisches Mitglied Stats. levelMean. Ebene: (39K - gt 39L) - gt Serie: Serieslt39K, floatgt - gt Serieslt39L, floatgt (erfordert Gleichheit und Gleichheit) val fst. Tuple: (39T1 39T2) - gt 39T1 Vollständiger Name: Microsoft. FSharp. Core. Operators. fst Mehrere Elemente Modul Serie -------------------- Typ Serie 160160static Mitglied vonNullables . Werte: seqltNullablelt39a0gtgt - gt Seriesltint, 39a0gt (benötigt Standardkonstruktor und Werttyp und 39a0: gt ValueType) 160160static Member ofObservations. Beobachtungen: seqlt39a0 39a1gt - gt Serieslt39a0,39a1gt (erfordert Gleichheit) 160160static member ofOptionalObservations. Beobachtungen: seqlt39K 39a1 optiongt - gt Serieslt39K, 39a1gt (erfordert Gleichheit) 160160static Mitglied vonValues. Werte: seqlt39a0gt - gt Seriesltint, 39a0gt Vollständiger Name: Deedle. FSharpSeriesExtensions. Series -------------------- type Serieslt39K, 39V (erfordert Gleichheit) gt 160160interface IFsiFormattable 160160interface ISerieslt39Kgt 160160new . Paare: seqltKeyValuePairlt39K, 39Vgtgt - gt Serieslt39K, 39Vgt 160160new. Tasten: seqlt39Kgt Werte: seqlt39Vgt - gt Serieslt39K, 39Vgt 160160new. Index: IIndexlt39Kgt Vektor: IVectorlt39Vgt VektorBuilder: IVectorBuilder indexBuilder: IIndexBuilder - gt Serieslt39K, 39Vgt 160160Member Nachher. LowerExclusive: 39K - gt Serieslt39K, 39Vgt 160160Member Aggregate. Aggregation: Aggregationlt39Kgt BeobachtungSelector: FuncltDataSegmentltSerieslt39K, 39Vgtgt, KeyValuePairlt39TNewKey, OptionalValuelt39Rgtgtgt - gt Serieslt39TNewKey, 39Rgt (erfordert Gleichheit) 160160Member Aggregate. Aggregation: Aggregationlt39Kgt keySelector: FuncltDataSegmentltSerieslt39K, 39Vgtgt, 39TNewKeygt WertSelector: FuncltDataSegmentltSerieslt39K, 39Vgtgt, OptionalValuelt39Rgtgt - gt Serieslt39TNewKey, 39Rgt (erfordert Gleichheit) 160160member AsyncMaterialize. Einheit - gt AsyncltSerieslt39K, 39Vgtgt 160160Member vorher. UpperExclusive: 39K - gt Serieslt39K, 39Vgt 160160. Vollständiger Name: Deedle. Serieslt, gt -------------------- neu. Paare: seqltCollections. Generic. KeyValuePairlt39K, 39Vgtgt - gt Serieslt39K, 39Vgt neu. Tasten: seqlt39Kgt Werte: seqlt39Vgt - gt Serieslt39K, 39Vgt neu. Index: Indices. IIndexlt39Kgt Vektor: IVectorlt39Vgt vectorBuilder: Vectors. IVectorBuilder indexBuilder: Indices. IIndexBuilder - gt Serieslt39K, 39Vgt val-Beobachtungen. Serie: Serieslt39K, 39Tgt - gt seqlt39K 39Tgt (erfordert Gleichheit) Vollständiger Name: Deedle. Series. observations val r1. Seriesltint, floatgt Vollständiger Name: Deedle-v1.r1 val Serie. Beobachtungen: seqlt39a 39bgt - gt Serieslt39a, 39bgt (erfordert Gleichheit) Vollständiger Name: Deedle. FSharpSeriesExtensions. series val r2. Seriesltint, floatgt Vollständiger Name: Deedle-v1.r2 val r3. Seriesltint, floatgt Vollständiger Name: Deedle-v1.r3 val (Merge 3 ungeordnete 300k lange Serie (wiederholen Merge)). Unit - gt unit Vollständiger Name: Deedle-v1 (Merge 3 ungeordnete 300k lange Serie (wiederholen Merge)) member Series. Merge. LtParamArraygt otherSeries: Serieslt39K, 39Vgt - gt Serieslt39K, 39Vgt Mitglied Series. Merge. OtherSeries: seqltSerieslt39K, 39Vgtgt - gt Serieslt39K, 39Vgt Mitglied Series. Merge. OtherSeries: Serieslt39K, 39Vgt - gt Serieslt39K, 39Vgt Mitglied Series. Merge. Andere: Serieslt39K, 39Vgt Verhalten: UnionBehavior - gt Serieslt39K, 39VgtTowards Math Numerics Version 3 Math Numerics ist auf dem besten Weg zur nächsten großen Version, v3.0. Ein erster 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 zu machen, 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 Solver 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 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 functions Standard routines for evaluating the Euclidean, Manhattan and Chebychev distances between arrays or vectors, also for the common Sum of Absolute Difference (SAD), Mean-Absolute Error (MAE), Sum of Squared Difference (SSD) and Mean-Squared Error (MSE) metrics. Hamming distance. Leveraging providers where appropriate. Less null checks and ArgumentNullExceptions Likely as a side effect from my exposure to functional programming over the last year, I no longer follow the arguments why in C every routine must explicitly check all arguments for null. Ive already dropped a few of these checks, but there are still more than 2000 places where Math Numerics throws an ArgumentNullException. Most of these will likely be gone. There is one case where it does make sense to keep them though: when a routine accepts an argument but does not use it immediately (and therefore does not cause an immediate NullReferenceException ), a null reference sneaking in could be hard to debug, so well keep the check. But such cases are quite rare given the nature of the library. IO Library The IO library that used to be distributed as part of the core package is now a set of separate NuGet packages, e. g. MathNet. Numerics. Data. Text. and lives in a separate repository . Favoring generic linear algebra types Since the generic namespace was required all the time anyway and the recommended happy path is now to always use the generic types, everything from the. Generic namespace has been moved one namespace up. From now on you usually only need to open two namespaces when working with linear algebra, even if factorizations are needed. For example, when using the double type, youd open MathNet. Numerics. LinearAlgebra and MathNet. Numerics. LinearAlgebra. Double . Since typing is stronger in F, all the initcreate functions in the F module now directly return generic types so you dont have to upcast manually all the time. Most routines have been generalized to work on generic types. For cases where you want to implement generic algorithms but also need to create new dense or sparse matrices or vectors a new generic builder has been added. This should rarely be needed in user code though. Missing scalar-matrix routines A few missing scalar-matrix routines like adding or subtracting a scalar to a matrix or dividing a scalar by a matrix have been added, backed by providers where possible. Theres now also a modulus routine. Point-wise infix operators where supported (F) Weve added point-wise .. and . operators to matrices and vectors in the core library. This is not supported in all languages yet, but works fine in F even though without currying support. Of course in the other languages you can continue to use the normal methods as before. Factorization and Iterative Solvers Previously matrix factorization was only accessible by extension methods or explicit creation, which did not work very well when using generic types. The generic matrix type now provides methods to create them directly. As such, the actual implementations have been internalized as there is no longer any need for direct access. The QR factorization is now thin by default, and factorizations no longer clone their results for no practical reason. The iterative solver design has been significantly simplified and is now generic and shared where possible and accepts generic types everywhere. The namespaces are now much more flat as the very detailed structure did not add any value but meant you had to open a dozen namespaces. Misc linear algebra improvements Vectors now have a ConjugateDotProduct routine in addition to DotProduct . Vectors now explicitly provide proper L1, L2 and infinity norms MatricesVectors now have consistent enumerators, with a variant that skips zeros (useful if sparse). MatrixVector creation routines have been simplified and usually no longer require explicit dimensions. New variants to create diagonal matrices, or such where all fields have the same value. MatricesVectors expose whether storage is dense with a new IsDense property. Providers have been moved to a Providers namespace and are fully generic again. More robust complex AsinAcos for large real numbers. Trig functions: common short names instead of very long names. Complex: common short names for Exp, Ln, Log10, Log. Statistics: new single-pass MeanVariance method (as used often together). Share this post


No comments:

Post a Comment