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