2008-09-26 9 views
23

Ich muss Durchschnittswerte, Standardabweichungen, Mediane usw. für eine Reihe von numerischen Daten berechnen. Gibt es eine gute Open-Source-.NET-Bibliothek, die ich verwenden kann? Ich habe NMath gefunden, aber es ist nicht kostenlos und kann für meine Bedürfnisse übertrieben sein.Empfehlen Sie eine Open-Source-.NET-Statistikbibliothek

+12

Ich werde nie verstehen, warum einige Leute dies als "nicht konstruktiv" betrachten, angesichts seines Interesses und der Anzahl der Antworten! – Calanus

+1

@Calanus ja, bizarr. Viele gute Informationen in den Antworten. Wahrscheinlich ist es wegen des Wortes "empfehlen" im Titel. –

Antwort

7

Ich fand dies auf der CodeProject-Website. Es sieht nach einer guten C# -Klasse für die meisten grundlegenden statistischen Funktionen aus.

+8

Yuck! Warum bestehen einige Leute weiterhin darin, Methoden-/Klassennamen in Kleinbuchstaben und nicht in PascalCase zu schreiben; Es macht nur den Code falsch aussehen. –

7

Werfen Sie einen Blick auf MathNet es nicht speziell für die Statistik, aber es könnte sehr nützliche Funktionen für das, was Sie wollen

3

Ich entschied, dass es schneller war, mein eigenes zu schreiben, das gerade getan hat, was ich brauchte. Hier ist der Code ...

/// <summary> 
/// Very basic statistical analysis routines 
/// </summary> 
public class Statistics 
{ 
    List<double> numbers; 
    public double Sum { get; private set; } 
    public double Min { get; private set; } 
    public double Max { get; private set; } 
    double sumOfSquares; 

    public Statistics() 
    { 
     numbers = new List<double>(); 
    } 

    public int Count 
    { 
     get { return numbers.Count; } 
    } 

    public void Add(double number) 
    { 
     if(Count == 0) 
     { 
      Min = Max = number; 
     } 
     numbers.Add(number); 
     Sum += number; 
     sumOfSquares += number * number; 
     Min = Math.Min(Min,number); 
     Max = Math.Max(Max,number);    
    } 

    public double Average 
    { 
     get { return Sum/Count; } 
    } 

    public double StandardDeviation 
    { 
     get { return Math.Sqrt(sumOfSquares/Count - (Average * Average)); } 
    } 

    /// <summary> 
    /// A simplistic implementation of Median 
    /// Returns the middle number if there is an odd number of elements (correct) 
    /// Returns the number after the midpoint if there is an even number of elements 
    /// Sorts the list on every call, so should be optimised for performance if planning 
    /// to call lots of times 
    /// </summary> 
    public double Median 
    { 
     get 
     { 
      if (numbers.Count == 0) 
       throw new InvalidOperationException("Can't calculate the median with no data"); 
      numbers.Sort(); 
      int middleIndex = (Count)/2; 
      return numbers[middleIndex]; 
     } 
    } 
} 
+5

Dieser Algorithmus funktioniert in der Theorie und funktioniert oft in der Praxis. Aber sehen Sie sich in diesem Beitrag ein Beispiel dafür an, wo dieser Algorithmus fehlschlagen kann. http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ –

+0

@ JohnD.Cook danke für die nützlichen Informationen. Für die Daten, die ich verwendete, funktioniert die obige Methode gut. Wie wäre es mit der Veröffentlichung eines kurzen C# -Beispiels mit Ihrem empfohlenen Algorithmus? –

17

Sie müssen vorsichtig sein. Es gibt mehrere Möglichkeiten, die Standardabweichung zu berechnen, die die gleiche Antwort liefern würden, wenn die Gleitkommaarithmetik perfekt wäre. Sie sind alle für einige Datensätze genau, aber einige sind unter bestimmten Umständen viel besser als andere.

Die Methode, die ich hier vorgeschlagen habe, ist diejenige, die am wahrscheinlichsten schlechte Antworten gibt. Ich habe es selbst benutzt, bis es auf mir abgestürzt ist.

Siehe Comparing three methods of computing standard deviation.

+1

Gute Informationen, die eine Abstimmung wert sind. – mistrmark

5

Apache Maths.Common und führen Sie es durch IKVM.

+0

Apache Maths.Common ist so viel besser dokumentiert als jede andere Statistik-API, die ich gefunden habe. Das kompilieren zu einer .NET DLL über IKVM war ein Kinderspiel. Vielen Dank für den Vorschlag! –

1

AForge.NET hat AForge.Math Namespace, einige grundlegende Statistikfunktionen zur Verfügung stellen: Histogramm, Mittelwert, Median, Stddev, Entropie.

0

Wenn Sie nur eine einmalige Zahlenverarbeitung durchführen müssen, ist eine Tabellenkalkulation bei weitem das beste Werkzeug. Es ist trivial, eine einfache CSV-Datei aus C# auszuspucken, die Sie dann in Excel laden kann (oder was auch immer):

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (StreamWriter sw = new StreamWriter("output.csv", false, Encoding.ASCII)) 
     { 
      WriteCsvLine(sw, new List<string>() { "Name", "Length", "LastWrite" }); 

      DirectoryInfo di = new DirectoryInfo("."); 
      foreach (FileInfo fi in di.GetFiles("*.mp3", SearchOption.AllDirectories)) 
      { 
       List<string> columns = new List<string>(); 
       columns.Add(fi.Name.Replace(",", "<comma>")); 
       columns.Add(fi.Length.ToString()); 
       columns.Add(fi.LastWriteTime.Ticks.ToString()); 

       WriteCsvLine(sw, columns); 
      } 
     } 
    } 

    static void WriteCsvLine(StreamWriter sw, List<string> columns) 
    { 
     sw.WriteLine(string.Join(",", columns.ToArray())); 
    } 
} 

Dann können Sie einfach auf ‚Start Excel output.csv‘ und die Verwendung Funktionen wie „= MEDIAN (B: B) "," = DURCHSCHNITT (B: B) "," = STABW (B: B) ". Sie erhalten Diagramme, Histogramme (wenn Sie das Analysepaket installieren) usw.

Das oben genannte behandelt nicht alles; verallgemeinerte CSV-Dateien sind komplexer als Sie vielleicht denken. Aber es ist "gut genug" für einen Großteil der Analyse, die ich mache.

Verwandte Themen