
資料集的基本統計計算是應用數學,以及統計應用中最常用的功能。如計算資料集的均值,方差,标準差,最大值,最小值,熵等等。Math.NET中的MathNet.Numerics.Statistics命名空間就包括了大量的這些統計計算的函數。今天就為大家介紹這方面的内容。這樣就可以使用C#進行資料集合的相關統計計算,以前在matlab中一個函數可以解決的問題,在C#裡面也可以一個函數解決。是以Math.NET很大程度上替代了Matlab的基礎資料計算功能,當然是不能和Matlab媲美的。
本部落格所有文章分類的總目錄:【總目錄】本部落格博文總目錄-實時更新
開源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
.NET資料挖掘與機器學習,作者部落格:
http://www.cnblogs.com/asxinyu
E-mail:[email protected]