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
Respuesta
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.
¡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. –
Tenga una mirada en MathNet no es específicamente para las estadísticas, pero puede haber una buena funcionalidad para lo que quieres
¿Qué tal http://ilnumerics.net/ o http://numerics.mathdotnet.com/ (fusión de http://www.codeplex.com/dnAnalytics)
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];
}
}
}
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/ –
@ 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? –
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.
Buena información vale la pena una votación. – mistrmark
Apache Maths.Common y ejecutarlo a través de IKVM.
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! –
AForge.NET tiene el espacio de nombres AForge.Math, que proporciona algunas funciones estadísticas básicas: Histograma, media, mediana, stddev, entropía.
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.
- 1. biblioteca zip de código abierto para .NET?
- 2. Python: estadísticas de código
- 3. subclases de una biblioteca de código abierto
- 4. Recomiende una biblioteca de programación de tareas C#
- 5. Biblioteca de diseño de gráficos de código abierto
- 6. Biblioteca C++ de código abierto para matemáticas vectoriales
- 7. OCR de código abierto
- 8. ¿La mejor biblioteca para estadísticas en C++?
- 9. Recomiende .NET ORM para desarrollo de N niveles
- 10. Libre/de código abierto Aplicación Skinning Solutions for .Net?
- 11. Recomiende un patrón de diseño
- 12. estadísticas de código de cupón
- 13. ¿Cuál es tu biblioteca libre o de código abierto favorita para .NET Charts and Gauges?
- 14. ¿Existe una biblioteca de registro distribuido de código abierto?
- 15. de código abierto C++ exploración de la biblioteca
- 16. ¿Hay alguna biblioteca de memoria temporal jerárquica de código abierto?
- 17. Implementación de biblioteca de código abierto: cómo manejar el registro?
- 18. Biblioteca de reconocimiento de voz de código abierto en Java
- 19. ¿Cómo transfieres un proyecto de código abierto?
- 20. Biblioteca de dibujo de código abierto (dwg) en C#
- 21. ¿Biblioteca Java de código abierto para leer datos de ECG?
- 22. biblioteca de texto a voz de código abierto
- 23. Biblioteca de CoverFlow de código abierto para iPhone
- 24. ¿Existe una biblioteca de código abierto WebSockets (JavaScript) XMPP?
- 25. Pequeña biblioteca Unicode de código abierto para C/C++
- 26. ¿Cómo teclear correctamente una biblioteca de código abierto?
- 27. ¿Hay una biblioteca de estadísticas para PHP?
- 28. . Motor de búsqueda de código abierto basado en .Net
- 29. Sistema de gestión de documentos de código abierto en .net?
- 30. .NET Biblioteca de Venn Diagrama
Nunca entenderé por qué algunas personas consideran que esto "no es constructivo" dado su interés y número de respuestas. – Calanus
@Calanus sí, extraño. Mucha información buena en las respuestas también. Probablemente sea por la palabra "recomendar" en el título. –