symbolics net mathnet .net math open-source statistics

.net - symbolics - mathnet



Recomiende una biblioteca de estadísticas.NET de código abierto (8)

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.


Eche un vistazo a MathNet, no es específicamente para estadísticas, pero puede haber una funcionalidad útil para lo que quiere



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]; } } }


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 tiene más probabilidades de dar malas respuestas. Lo usé yo mismo hasta que se estrelló contra mí.

Ver Comparación de tres métodos para calcular la desviación estándar .



AForge.NET tiene el espacio de nombres AForge.Math, que proporciona algunas funciones estadísticas básicas: Histograma, mean, median, stddev, entropy.


Si solo necesitas hacer un crujido de números únicos, una hoja de cálculo es tu mejor herramienta. Es trivial escupir un archivo CSV simple desde C #, que luego 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())); } }

Luego puede simplemente ''iniciar excel output.csv'' y usar funciones como "= MEDIAN (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.