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)前回の続き。 […]