本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新
開源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