2008-09-26 16 views
23

Muszę obliczyć średnie, standardowe odchylenia, mediany itp. Dla wielu danych liczbowych. Czy istnieje dobra biblioteka .NET z otwartym kodem źródłowym, z której mogę korzystać? Znalazłem NMath, ale nie jest za darmo i może być przesadą dla moich potrzeb.Polecam bibliotekę statystyczną Open Source .NET

+12

Nigdy nie zrozumiem, dlaczego niektórzy ludzie uważają to za "nie konstruktywne", biorąc pod uwagę zainteresowanie i liczbę odpowiedzi! – Calanus

+1

@Calanus tak, dziwaczne. Mnóstwo dobrych informacji również w odpowiedziach. Prawdopodobnie jest to spowodowane słowem "polecam" w tytule. –

Odpowiedz

7

Znalazłem to na stronie CodeProject. Wygląda to na dobrą klasę C# do obsługi większości podstawowych funkcji statystycznych.

+8

Fuj! Dlaczego niektórzy ludzie nadal piszą nazwę metody/klasy małymi literami, a nie PascalCase; po prostu sprawia, że ​​kod wygląda źle. –

7

spojrzeć MathNet nie jest specjalnie do celów statystycznych, ale nie może być przydatna funkcjonalność, co chcesz

3

Uznałem, że szybciej napisałem własną, że zrobiłem to, czego potrzebowałem. Oto kod ...

/// <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

Algorytm ten działa w teorii i często działa w praktyce. Zobacz ten post, aby dowiedzieć się, gdzie ten algorytm może zawieść. http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ –

+0

@ JohnD. Dziękujemy za przydatne informacje. Dla danych, których używałem, powyższa metoda działa dobrze. Co powiesz na przesłanie nam krótkiej próbki C# z zalecanym algorytmem? –

17

Musisz być ostrożny. Istnieje kilka sposobów obliczenia odchylenia standardowego, które dałoby tę samą odpowiedź, gdyby arytmetyka zmiennoprzecinkowa była doskonała. Wszystkie są dokładne dla niektórych zestawów danych, ale niektóre są znacznie lepsze niż inne w pewnych okolicznościach.

Zaproponowana przeze mnie metoda to ta, która najprawdopodobniej da złe odpowiedzi. Używałem go sam, dopóki się nie pomylił.

Zobacz Comparing three methods of computing standard deviation.

+1

Dobre informacje warte oddania głosu. – mistrmark

5

Apache Maths.Common i uruchomić go przez IKVM.

+0

Apache Maths.Common jest o wiele bardziej dobrze udokumentowany niż jakikolwiek inny API statystyki, który znalazłem. Kompilowanie go do biblioteki .NET DLL przez IKVM było bardzo proste. Wielkie dzięki za sugestię! –

1

AForge.NET ma przestrzeń nazw AForge.Math, udostępniając podstawowe funkcje statystyczne: Histogram, średnia, mediana, stddev, entropia.

0

Jeśli potrzebujesz tylko jednorazowego zgrywania, arkusz kalkulacyjny jest zdecydowanie najlepszym narzędziem. To trywialne wypluć prosty plik CSV z C#, które można następnie załadować w programie Excel (lub cokolwiek):

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())); 
    } 
} 

Następnie można po prostu „start excel output.csv” i wykorzystanie funkcje, takie jak „= MEDIAN (B: B) "," = ŚREDNIA (B: B) "," = STDEV (B: B) ". Otrzymasz wykresy, histogramy (jeśli zainstalujesz pakiet analityczny), itp.

Powyższe nie obsługuje wszystkiego; uogólnione pliki CSV są bardziej złożone niż mogłoby się wydawać. Ale to jest "wystarczająco dobre" dla większości analiz, które wykonuję.

Powiązane problemy