我需要计算一堆数值数据的平均值,标准差,中位数等。我可以使用一个很好的开源.NET库吗?我找到了NMath,但它不是免费的,可能对我的需求有点过分。
答案 0 :(得分:17)
你必须小心。如果浮点运算是完美的,有几种计算标准偏差的方法会给出相同的答案。它们对于某些数据集都是准确的,但在某些情况下,有些数据集远远优于其他数据集。
我在这里看到的方法是最有可能给出错误答案的方法。我自己用它直到它撞到我身上。
答案 1 :(得分:8)
答案 2 :(得分:7)
我在CodeProject网站上找到了这个。它看起来像是一个很好的C#类来处理大多数基本统计函数。
答案 3 :(得分:7)
查看MathNet它不是专门用于统计信息,但可能有适合您想要的功能
答案 4 :(得分:5)
Apache Maths.Common并通过IKVM运行。
答案 5 :(得分:3)
我决定写自己的更快,那就是我需要的。这是代码......
/// <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];
}
}
}
答案 6 :(得分:1)
AForge.NET具有AForge.Math命名空间,提供一些基本的统计功能:直方图,均值,中位数,stddev,熵。
答案 7 :(得分:0)
如果您只需要进行一次性数字运算,电子表格就是您最好的工具。从C#中吐出一个简单的CSV文件是很简单的,然后可以在Excel(或其他)中加载:
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()));
}
}
然后你可以'启动excel output.csv'并使用“= MEDIAN(B:B)”,“= AVERAGE(B:B)”,“= STDEV(B:B)”等函数。你得到图表,直方图(如果你安装分析包)等等。
以上并不能解决所有问题;广义CSV文件比您想象的更复杂。但对于我做的大部分分析,它“足够好”。