2008-09-26 20 views
23

Necesito calcular promedios, desviaciones estándar, medianas, etc. para un conjunto de datos numéricos. ¿Hay una buena biblioteca .NET de código abierto que pueda usar? He encontrado a NMath pero no es gratuito y puede ser excesivo para mis necesidades.Recomiende un código abierto Biblioteca de estadísticas .NET

+12

Nunca entenderé por qué algunas personas consideran que esto "no es constructivo" dado su interés y número de respuestas. – Calanus

+1

@Calanus sí, extraño. Mucha información buena en las respuestas también. Probablemente sea por la palabra "recomendar" en el título. –

Respuesta

7

Encontré esto en el sitio web de CodeProject. Parece una buena clase de C# para manejar la mayoría de las funciones estadísticas básicas.

+8

¡Yuck! ¿Por qué algunas personas persisten en escribir el nombre del método/clase en minúsculas y no en PascalCase? solo hace que el código se vea mal. –

7

Tenga una mirada en MathNet no es específicamente para las estadísticas, pero puede haber una buena funcionalidad para lo que quieres

3

Decidí que era más rápido escribir el mío, que acababa de hacer lo que necesitaba. Aquí está el código ...

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

Ese algoritmo funciona en teoría, y a menudo funciona en la práctica. Pero mira esta publicación para ver un ejemplo de dónde puede fallar ese algoritmo. http://www.johndcook.com/blog/2008/09/26/comparing-three-methods-of-computing-standard-deviation/ –

+0

@ JohnD.Cook gracias por la información útil. Para los datos que estaba usando, el método anterior funciona bien. ¿Qué le parece publicarnos una muestra corta de C# con su algoritmo recomendado? –

17

Tienes que tener cuidado. Hay varias formas de calcular la desviación estándar que daría la misma respuesta si la aritmética de punto flotante fuera perfecta. Todos son precisos para algunos conjuntos de datos, pero algunos son mucho mejores que otros en algunas circunstancias.

El método que he visto propuesto aquí es el que probablemente dé respuestas erróneas. Lo usé yo mismo hasta que se estrelló contra mí.

Ver Comparing three methods of computing standard deviation.

+1

Buena información vale la pena una votación. – mistrmark

5

Apache Maths.Common y ejecutarlo a través de IKVM.

+0

Apache Maths.Common está mucho más documentado que cualquier otra API de estadísticas que he encontrado. Compilarlo a .NET DLL a través de IKVM fue muy fácil. ¡Muchas gracias por la sugerencia! –

1

AForge.NET tiene el espacio de nombres AForge.Math, que proporciona algunas funciones estadísticas básicas: Histograma, media, mediana, stddev, entropía.

0

Si solo tiene que hacer algunos cálculos de números únicos, una hoja de cálculo es de lejos su mejor herramienta. Es trivial para escupir un simple archivo CSV desde C#, que luego se puede cargar en Excel (o lo que sea):

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

A continuación, sólo puede 'iniciar Excel OUTPUT.CSV' y utilizar las funciones como "= MEDIANA (B: B) "," = PROMEDIO (B: B) "," = STDEV (B: B) ". Obtiene gráficos, histogramas (si instala el paquete de análisis), etc.

Lo anterior no maneja todo; los archivos CSV generalizados son más complejos de lo que piensas. Pero es "lo suficientemente bueno" para la mayor parte del análisis que hago.

Cuestiones relacionadas