C#でMath.NET Numericsを使用する(統計計算編)

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

One thought on “C#でMath.NET Numericsを使用する(統計計算編)”

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください