一連の数値データの平均、標準偏差、中央値などを計算する必要があります。使用できる優れたオープンソースの.NETライブラリはありますか?私はNMathを見つけましたが、それは無料ではなく、私のニーズにはやり過ぎかもしれません。
8 に答える
あなたは注意する必要があります。浮動小数点演算が完全である場合に同じ答えを与える標準偏差を計算する方法はいくつかあります。一部のデータセットではすべて正確ですが、状況によっては他のものよりはるかに優れているものもあります。
ここで提案されている方法は、悪い答えを出す可能性が最も高い方法です。クラッシュするまで自分で使用しました。
標準偏差を計算する 3 つの方法の比較を参照してください。
http://ilnumerics.net/またはhttp://numerics.mathdotnet.com/はどうですか( http://www.codeplex.com/dnAnalyticsからマージ)
これは CodeProject の Web サイトで見つけました。基本的な統計関数のほとんどを処理するのに適した C# クラスのようです。
MathNetを見てください。 統計専用ではありませんが、必要なものに役立つ機能があるかもしれません
Apache Maths.Commonを開き、 IKVM を介して実行します。
私は自分で書いたほうが早いと判断しました。これがコードです...
/// <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];
}
}
}
AForge.NETには AForge.Math 名前空間があり、いくつかの基本的な統計関数 (ヒストグラム、平均、中央値、stddev、エントロピー) を提供します。
1 回限りの数値計算を行う必要がある場合は、スプレッドシートが最適なツールです。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 ファイルは、想像以上に複雑です。しかし、私が行う分析の多くには「十分」です。