Math.NET Numericsは.NET Framework向けのオープンソースな数値計算用のライブラリです。基本的にはSystem.MathクラスなどのCLRが標準で用意している計算用ライブラリにない物やその拡張で、特殊関数、線形代数、確率モデル、乱数、補間、積分変換(FFT)を対象にしています。
Math.NET Numericsは.NET Framework 4.0, Mono 2.0, Silverlightで使用することが出来ます。
Math.NET NumericsのソースコードはGitHubでホストされ、MITライセンスの元公開されています。
git://github.com/mathnet/mathnet-numerics.git
(https://github.com/mathnet/mathnet-numerics)
詳しくは、Math.NET Numericsのサイトでご確認ください。
http://numerics.mathdotnet.com/
Math.NET Numericsの入手
一番手軽な入手方法はNuGetを使用する方法です。
GUIのNuGetパッケージの管理からMath.NETを検索する方法とパッケージマネージャーコンソールを使用する方法があります。
NuGetパッケージの管理を使用する方法

ソリューションエクスプローラーで参照設定を右クリックし、NuGetパッケージの管理を選択します。

①オンラインを選択
②検索ボックスに「Math.NET」と入力
③検索結果からMath.NET Numericsを選択し、表示されるInstallボタンをクリック。
※上図はインストール後の表示
パッケージマネージャーコンソールからのインストール
以下のように入力して、インストールします。
PM> Install-Package MathNet.Numerics
統計計算
C#でMath.NETを使用した統計計算関数の使用方法です。
使用方法としてはこれといって難しいところは無いので、以下のサンプルと、ヘルプを見ていただければ、だいたいわかると思います。
標準偏差計算といった統計計算のライブラリはMathNet.Numerics.StatisticsネームスペースのStatisticsクラスにまとめられています。(オンラインのヘルプ)
以下はそのサンプルコードです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MathNet.Numerics.Statistics;
using System.Diagnostics;
namespace MathNetStatisticsSample
{
class Program
{
static void Main(string[] args) {
var sw = new Stopwatch();
var rnd = new System.Random();
double[] data = new double[10000000];
int i;
for (i = 0; i < 10000000; i++) {
data[i] = rnd.NextDouble();
//Console.Write(data[i] + ",");
}
//標本標準偏差
sw.Start();
var stddiv = Statistics.StandardDeviation(data);
sw.Stop();
Console.WriteLine("Standard Deviation = {0}", stddiv);
Console.WriteLine("{1}件入力で標本標準偏差の計算時間: {0}", sw.Elapsed, i);
//母標準偏差
sw.Reset();
sw.Start();
var pstddiv = Statistics.PopulationStandardDeviation(data);
sw.Stop();
Console.WriteLine("Population Standard Deviation = {0}", pstddiv);
Console.WriteLine("{1}件入力で母標準偏差の計算時間: {0}", sw.Elapsed, i);
//標本分散
var variance = Statistics.Variance(data);
Console.WriteLine("Variance = {0}", variance);
//母分散
var pVariance = Statistics.PopulationVariance(data);
Console.WriteLine("Population Variance = {0}", pVariance);
//最大値・最小値
var max = Statistics.Maximum(data);
Console.WriteLine("Maximum = {0}", max);
var min = Statistics.Minimum(data);
Console.WriteLine("Minimum = {0}", min);
//平均
var mean = Statistics.Mean(data);
Console.WriteLine("Mean = {0}", mean);
//メジアン(中央値)
var median = Statistics.Median(data);
Console.WriteLine("Median = {0}", median);
//順序統計量
var orderStatistic = Statistics.OrderStatistic(data, 123);
Console.WriteLine("Order Statisitc(i-Order = 123) = {0}", orderStatistic);
Console.ReadLine();
}
}
}
※通常本サイトで公開されるソースコードライセンスはApache License v2.0ですが、上コードについてはMITライセンスとします。
コンパイルして実行してみていただきたいのですが、1000万件ぐらいだと標本標準偏差と、母標準偏差とではあまり計算時間に違いが無いというか、完全の誤差の範囲ですね。速いです。(さすがにメディアンの計算はちょっとかかります。)
ということで、Math.NETはF#との組み合わせで紹介される事が多いのですが、C#でもそれなりに使いやすく、高速な数値計算ライブラリです。
上のサンプルコードはGitHubにて公開しています。
https://github.com/ishisaka/MathNetSample
コメント
[…] C#でMath.NET Numericsを使用する(統計計算編2)前回の続き。 […]