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


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

開源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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM