【原創】開源Math.NET基礎數學類庫使用(10)C#進行基本資料統計

資料之巔發表於2015-03-08

               本部落格所有文章分類的總目錄:【總目錄】本部落格博文總目錄-實時更新 

開源Math.NET基礎數學類庫使用總目錄:【目錄】開源Math.NET基礎數學類庫使用總目錄

前言

  資料集的基本統計計算是應用數學,以及統計應用中最常用的功能。如計算資料集的均值,方差,標準差,最大值,最小值,熵等等。Math.NET中的MathNet.Numerics.Statistics名稱空間就包括了大量的這些統計計算的函式。今天就為大家介紹這方面的內容。這樣就可以使用C#進行資料集合的相關統計計算,以前在matlab中一個函式可以解決的問題,在C#裡面也可以一個函式解決。所以Math.NET很大程度上替代了Matlab的基礎資料計算功能,當然是不能和Matlab媲美的。

  如果本文資源或者顯示有問題,請參考 本文原文地址http://www.cnblogs.com/asxinyu/p/4301252.html

1.Math.NET的統計函式類

  Math.NET在MathNet.Numerics.Statistics名稱空間中的基本資料統計類及作用介紹如下,靜態類中的方法基本上都可以直接作為擴充套件方法使用:

1.Statistics類,基礎的資料集統計,如最小值,最大值,平均值,總體方差,標準差等等。為靜態類,注意Statistics是一個總體的統計類,其很多函式的呼叫都是根據資料集的型別分開呼叫StreamingStatistics和ArrayStatistics;

2.StreamingStatistics,靜態類,是流資料集的統計,適合於一些大資料集,不能一次性讀入記憶體的情況;

3.ArrayStatistics,靜態類,是普通的未排序陣列資料集的統計,一次性都載入在記憶體,因此計算比較方便;

4.SortedArrayStatistics,靜態類,是排序陣列資料集的統計;

5.DescriptiveStatistics,非靜態類,與Statistics類的功能類似,但不一樣的是Statistics是靜態方法,一一計算,而該類是初始化的時候,可以一次性計算所有的指標,直接通過屬性進行獲取。

6.RunningStatistics,非靜態類,和Statistics類功能差不多,但允許動態更新資料,進行再次計算;

2.統計函式類的實現

  上述有多個統計類,但核心的程式碼不多。上述多個實現,也只是為了滿足多種不同的需求。我們一起看一個基本實現:ArrayStatistics類,類的核心實現,程式碼過多,只列舉了程式碼原型,和註釋:

  1 /// <summary>
  2 /// 對未排序的陣列進行統計操作  警告: Methods with the Inplace-suffix may modify the data array by reordering its entries.
  3 /// </summary>
  4 public static class ArrayStatistics
  5 {
  6     /// <summary>返回未排序陣列的最小值,如果資料為空或者元素為NaN,則返回NaN.</summary>
  7     /// <param name="data">簡單的未排序陣列.</param>
  8     public static double Minimum(double[] data) 
  9 
 10     /// <summary>返回未排序陣列的最小值,如果資料為空或者元素為NaN,則返回NaN.</summary>
 11     /// <param name="data">簡單的未排序陣列.</param>
 12     public static float Minimum(float[] data) ;
 13 
 14     /// <summary>返回未排序陣列的最大值,如果資料為空或者元素為NaN,則返回NaN.</summary>
 15     /// <param name="data">簡單的未排序陣列.</param>
 16     public static double Maximum(double[] data) ;
 17 
 18     /// <summary>返回未排序陣列的最大值,如果資料為空或者元素為NaN,則返回NaN.</summary>
 19     /// <param name="data">簡單的未排序陣列.</param>
 20     public static float Maximum(float[] data);
 21 
 22     /// <summary>計算未排序陣列的算術平均值,如果資料是空的或者元素為NaN</summary>
 23     /// <param name="data">簡單的未排序陣列.</param>
 24     public static double Mean(double[] data) ;
 25 
 26     /// <summary>
 27     /// 計算未排序陣列的無偏總體方差:對大小為N的資料集,使用N-1進行標準化.
 28     ///  (Bessel's correction). 貝塞爾(無偏估計)校正係數
 29     /// 如果資料連小於2,或者資料為NaN,則返回NaN
 30     /// </summary>
 31     /// <param name="samples">簡單的未排序陣列.</param>
 32     public static double Variance(double[] samples) ;
 33     
 34     /// <summary>
 35     /// 計算為排序陣列的總體方差.對大小為N的資料集,使用N進行標準化.因此是有偏差的
 36     /// 如果資料為NaN,則返回NaN
 37     /// </summary>
 38     /// <param name="population">簡單的未排序陣列.</param>
 39     public static double PopulationVariance(double[] population) ;
 40 
 41     /// <summary>
 42     /// 計算無偏總體標準差:對大小為N的資料集,使用N-1進行標準化.
 43     /// 如果資料連小於2,或者資料為NaN,則返回NaN
 44     /// </summary>
 45     /// <param name="samples">簡單的未排序陣列.</param>
 46     public static double StandardDeviation(double[] samples)
 47     {
 48         return Math.Sqrt(Variance(samples));
 49     }
 50 
 51     /// <summary>
 52     /// 計算總體標準差:對大小為N的資料集,使用N進行標準化.
 53     /// 如果資料為NaN,則返回NaN.
 54     /// </summary>
 55     /// <param name="population">簡單的未排序陣列.</param>
 56     public static double PopulationStandardDeviation(double[] population)
 57     {
 58         return Math.Sqrt(PopulationVariance(population));
 59     }
 60 
 61     /// <summary>計算算術平均值和無偏總體偏差,是2個方法的綜合</summary>
 62     /// <param name="samples">簡單的未排序陣列.</param>
 63     public static Tuple<double, double> MeanVariance(double[] samples)
 64     {
 65         return new Tuple<double, double>(Mean(samples), Variance(samples));
 66     }
 67 
 68     /// <summary>計算算術平均值和無偏總體標準差,是2個方法的綜合</summary>
 69     /// <param name="samples">簡單的未排序陣列.</param>
 70     public static Tuple<double, double> MeanStandardDeviation(double[] samples)
 71     {
 72         return new Tuple<double, double>(Mean(samples), StandardDeviation(samples));
 73     }
 74 
 75     /// <summary>計算2個陣列的無偏協方差:對大小為N的資料集,使用N-1進行標準化.</summary>
 76     /// <param name="samples1">第一個陣列.</param>
 77     /// <param name="samples2">第二個陣列.</param>
 78     public static double Covariance(double[] samples1, double[] samples2) ;
 79 
 80     /// <summary>計算2個陣列的總體協方差:對大小為N的資料集,使用N進行標準化.</summary>
 81     /// <param name="population1">第一個陣列.</param>
 82     /// <param name="population2">第二個陣列.</param>
 83     public static double PopulationCovariance(double[] population1, double[] population2) ;
 84 
 85     /// <summary>計算陣列的均方根誤差(RMS).</summary>
 86     /// <param name="data">簡單的未排序陣列.</param>
 87     public static double RootMeanSquare(double[] data) ;
 88 
 89     /// <summary>計算未排序陣列的 順序統計量(1..N). 注意:會導致data陣列的值會重新排序.</summary>
 90     /// <param name="data">陣列,未排序,計算過程會被排序.</param>
 91     /// <param name="order">從1開始的順序統計,1 - N 之間.</param>
 92     public static double OrderStatisticInplace(double[] data, int order) ;
 93 
 94     /// <summary>計算未排序陣列的中位數:data陣列會被重新排序.</summary>
 95     /// <param name="data">陣列,未排序,計算過程會被排序.</param>
 96     public static double MedianInplace(double[] data)
 97     {
 98         var k = data.Length/2;
 99         return data.Length.IsOdd()
100             ? SelectInplace(data, k)
101             : (SelectInplace(data, k - 1) + SelectInplace(data, k))/2.0;
102     }
103 
104     /// <summary>
105     /// 計算未排序陣列的p百分位數:如果需要非整數百分比,使用分位數替代.  
106     /// Approximately median-unbiased regardless of the sample distribution (R8).
107     /// WARNING: 計算過程會對data排序.
108     /// </summary>
109     /// <param name="data">陣列,未排序,計算過程會被排序.</param>
110     /// <param name="p">p分為點,0 - 100 之間.</param>
111     public static double PercentileInplace(double[] data, int p)
112     {
113         return QuantileInplace(data, p/100d);
114     }
115 
116     /// <summary>
117     /// 計算未排序陣列的第一個四分位數的值
118     /// Approximately median-unbiased regardless of the sample distribution (R8).
119     /// WARNING: 計算過程會對data排序.
120     /// </summary>
121     /// <param name="data">陣列,未排序,計算過程會被排序.</param>
122     public static double LowerQuartileInplace(double[] data)
123     {
124         return QuantileInplace(data, 0.25d);
125     }
126 
127     /// <summary>
128     /// 計算未排序陣列的第三個四分位數的值
129     /// Approximately median-unbiased regardless of the sample distribution (R8).
130     /// WARNING: 計算過程會對data排序.
131     /// </summary>
132     /// <param name="data">陣列,未排序,計算過程會被排序.</param>
133     public static double UpperQuartileInplace(double[] data)
134     {
135         return QuantileInplace(data, 0.75d);
136     }

  當然不是所有人都會用到這些函式,一般人可能只會用到一些常用的,如均值,方差等等。詳細的使用,可以看下面的例子。

3.統計函式使用的例子1

  上面已經提到,對於靜態類中的方法,可以根據需要使用擴充套件方法,或者直接呼叫該函式進行計算相應的統計指標。這種事情是非常簡單的,看一個綜合的例子:

 1 //先生成資料集合
 2 var chiSquare = new ChiSquared(5);
 3 Console.WriteLine(@"2. Generate 1000 samples of the ChiSquare(5) distribution");
 4 var data = new double[1000];
 5 for (var i = 0; i < data.Length; i++)
 6 {
 7     data[i] = chiSquare.Sample();
 8 }
 9 
10 //使用擴充套件方法進行相關計算
11 Console.WriteLine(@"3.使用擴充套件方法獲取生成資料的基本統計結果");
12 Console.WriteLine(@"{0} - 最大值", data.Maximum().ToString(" #0.00000;-#0.00000"));
13 Console.WriteLine(@"{0} - 最小值", data.Minimum().ToString(" #0.00000;-#0.00000"));
14 Console.WriteLine(@"{0} - 均值", data.Mean().ToString(" #0.00000;-#0.00000"));
15 Console.WriteLine(@"{0} - 中間值", data.Median().ToString(" #0.00000;-#0.00000"));
16 Console.WriteLine(@"{0} - 有偏方差", data.PopulationVariance().ToString(" #0.00000;-#0.00000"));
17 Console.WriteLine(@"{0} - 無偏方差", data.Variance().ToString(" #0.00000;-#0.00000"));
18 Console.WriteLine(@"{0} - 標準偏差", data.StandardDeviation().ToString(" #0.00000;-#0.00000"));
19 Console.WriteLine(@"{0} - 標準有偏偏差", data.PopulationStandardDeviation().ToString(" #0.00000;-#0.00000"));
20 Console.WriteLine();

結果如下:

1 3.使用擴充套件方法獲取生成資料的基本統計結果
2  19.84215 - 最大值
3  0.20662 - 最小值
4  4.92818 - 均值
5  4.35988 - 中間值
6  9.34684 - 有偏方差
7  9.35619 - 無偏方差
8  3.05879 - 標準偏差
9  3.05726 - 標準有偏偏差

下面將介紹使用DescriptiveStatistics類直接進行所有指標計算的例子。 

4.統計函式使用的例子2

  使用DescriptiveStatistics的方法也很簡單,直接使用資料陣列進行初始化,然後根據屬性獲取對應的指標結果就可以了。如下程式碼:

 1 Console.WriteLine(@"4. 使用DescriptiveStatistics類進行基本的統計計算");
 2 var descriptiveStatistics = new DescriptiveStatistics(data);//使用資料進行型別的初始化
 3 //直接使用屬性獲取結果
 4 Console.WriteLine(@"{0} - Kurtosis", descriptiveStatistics.Kurtosis.ToString(" #0.00000;-#0.00000"));
 5 Console.WriteLine(@"{0} - Largest element", descriptiveStatistics.Maximum.ToString(" #0.00000;-#0.00000"));
 6 Console.WriteLine(@"{0} - Smallest element", descriptiveStatistics.Minimum.ToString(" #0.00000;-#0.00000"));
 7 Console.WriteLine(@"{0} - Mean", descriptiveStatistics.Mean.ToString(" #0.00000;-#0.00000"));
 8 Console.WriteLine(@"{0} - Variance", descriptiveStatistics.Variance.ToString(" #0.00000;-#0.00000"));
 9 Console.WriteLine(@"{0} - Standard deviation", descriptiveStatistics.StandardDeviation.ToString(" #0.00000;-#0.00000"));
10 Console.WriteLine(@"{0} - Skewness", descriptiveStatistics.Skewness.ToString(" #0.00000;-#0.00000"));
11 Console.WriteLine();

結果如下:

4. Compute the basic statistics of data set using DescriptiveStatistics class
 1.69649 - Kurtosis
 19.84215 - Largest element
 0.20662 - Smallest element
 4.92818 - Mean
 9.35619 - Variance
 3.05879 - Standard deviation
 1.15298 - Skewness

5.資源

  原始碼下載:http://www.cnblogs.com/asxinyu/p/4264638.html

  如果本文資源或者顯示有問題,請參考 本文原文地址http://www.cnblogs.com/asxinyu/p/4301252.html 

相關文章