2008-09-26 8 views
23

J'ai besoin de calculer des moyennes, des écarts-types, des médianes etc. pour un tas de données numériques. Y at-il une bonne bibliothèque .NET que je peux utiliser? J'ai trouvé NMath mais ce n'est pas gratuit et peut être exagéré pour mes besoins.Recommander une bibliothèque de statistiques Open Source .NET

+12

Je ne comprendrai jamais pourquoi certaines personnes considèrent que ce n'est pas "constructif" étant donné son intérêt et son nombre de réponses! – Calanus

+1

@Calanus oui, bizarre. Beaucoup de bonnes infos dans les réponses aussi. Probablement c'est à cause du mot "recommander" dans le titre. –

Répondre

7

J'ai trouvé ceci sur le site Web CodeProject. Il ressemble à une bonne classe C# pour gérer la plupart des fonctions statistiques de base.

+8

Beurk! Pourquoi certaines personnes persistent-elles à écrire le nom de la méthode/classe en minuscules et pas PascalCase; ça donne juste l'impression que le code ne va pas. –

7

Jetez un oeil à MathNet il n'est pas spécifiquement pour les statistiques, mais il pourrait y avoir des fonctionnalités utiles pour ce que vous voulez

3

J'ai décidé qu'il était plus rapide d'écrire le mien, cela faisait juste ce dont j'avais besoin. Voici le 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

Cet algorithme fonctionne en théorie et fonctionne souvent dans la pratique. Mais voyez ce post pour un exemple où cet algorithme peut échouer. http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ –

+0

@ JohnD.Cook Merci pour les informations utiles. Pour les données que j'utilisais, la méthode ci-dessus fonctionne bien. Pourquoi ne pas nous envoyer un petit échantillon C# avec votre algorithme recommandé? –

17

Vous devez faire attention. Il existe plusieurs façons de calculer l'écart-type qui donnerait la même réponse si l'arithmétique en virgule flottante était parfaite. Ils sont tous précis pour certains ensembles de données, mais certains sont bien meilleurs que d'autres dans certaines circonstances.

La méthode que j'ai vu proposée ici est celle qui est la plus susceptible de donner de mauvaises réponses. Je l'ai utilisé moi-même jusqu'à ce qu'il s'écrase sur moi.

Voir Comparing three methods of computing standard deviation.

+1

Une bonne information vaut un vote. – mistrmark

5

Apache Maths.Common et de le faire passer par IKVM.

+0

Apache Maths.Common est tellement mieux documenté que toutes les API de statistiques que j'ai trouvées. Compiler vers une DLL .NET via IKVM était un jeu d'enfant. Merci beaucoup pour la suggestion! –

1

AForge.NET a l'espace de noms AForge.Math, fournissant quelques fonctions statistiques de base: Histogramme, moyenne, médiane, stddev, entropie.

0

Si vous avez juste besoin de faire quelques calculs ponctuels, une feuille de calcul est de loin votre meilleur outil. Il est trivial de cracher un simple fichier CSV à partir de C#, que vous pouvez ensuite charger dans Excel (ou autre):

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

Ensuite, vous pouvez simplement « démarrer Excel output.csv » et les fonctions d'utilisation comme « = MEDIAN (B: B) "," = MOYENNE (B: B) "," = STDEV (B: B) ". Vous obtenez des graphiques, des histogrammes (si vous installez le pack d'analyse), etc.

Ce qui précède ne gère pas tout; Les fichiers CSV généralisés sont plus complexes que vous ne le pensez. Mais c'est "assez bon" pour une grande partie de l'analyse que je fais.

Questions connexes