本博客所有文章分类的总目录:
开源Math.NET基础数学类库使用总目录:
前言
数据集的基本统计计算是应用数学,以及统计应用中最常用的功能。如计算数据集的均值,方差,标准差,最大值,最小值,熵等等。Math.NET中的MathNet.Numerics.Statistics命名空间就包括了大量的这些统计计算的函数。今天就为大家介绍这方面的内容。这样就可以使用C#进行数据集合的相关统计计算,以前在matlab中一个函数可以解决的问题,在C#里面也可以一个函数解决。所以Math.NET很大程度上替代了Matlab的基础数据计算功能,当然是不能和Matlab媲美的。
如果本文资源或者显示有问题,请参考 :
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 ///2 /// 对未排序的数组进行统计操作 警告: Methods with the Inplace-suffix may modify the data array by reordering its entries. 3 /// 4 public static class ArrayStatistics 5 { 6 ///返回未排序数组的最小值,如果数据为空或者元素为NaN,则返回NaN. 7 /// 简单的未排序数组. 8 public static double Minimum(double[] data) 9 10 ///返回未排序数组的最小值,如果数据为空或者元素为NaN,则返回NaN. 11 /// 简单的未排序数组. 12 public static float Minimum(float[] data) ; 13 14 ///返回未排序数组的最大值,如果数据为空或者元素为NaN,则返回NaN. 15 /// 简单的未排序数组. 16 public static double Maximum(double[] data) ; 17 18 ///返回未排序数组的最大值,如果数据为空或者元素为NaN,则返回NaN. 19 /// 简单的未排序数组. 20 public static float Maximum(float[] data); 21 22 ///计算未排序数组的算术平均值,如果数据是空的或者元素为NaN 23 /// 简单的未排序数组. 24 public static double Mean(double[] data) ; 25 26 ///27 /// 计算未排序数组的无偏总体方差:对大小为N的数据集,使用N-1进行标准化. 28 /// (Bessel's correction). 贝塞尔(无偏估计)校正系数 29 /// 如果数据连小于2,或者数据为NaN,则返回NaN 30 /// 31 /// 简单的未排序数组. 32 public static double Variance(double[] samples) ; 33 34 ///35 /// 计算为排序数组的总体方差.对大小为N的数据集,使用N进行标准化.因此是有偏差的 36 /// 如果数据为NaN,则返回NaN 37 /// 38 /// 简单的未排序数组. 39 public static double PopulationVariance(double[] population) ; 40 41 ///42 /// 计算无偏总体标准差:对大小为N的数据集,使用N-1进行标准化. 43 /// 如果数据连小于2,或者数据为NaN,则返回NaN 44 /// 45 /// 简单的未排序数组. 46 public static double StandardDeviation(double[] samples) 47 { 48 return Math.Sqrt(Variance(samples)); 49 } 50 51 ///52 /// 计算总体标准差:对大小为N的数据集,使用N进行标准化. 53 /// 如果数据为NaN,则返回NaN. 54 /// 55 /// 简单的未排序数组. 56 public static double PopulationStandardDeviation(double[] population) 57 { 58 return Math.Sqrt(PopulationVariance(population)); 59 } 60 61 ///计算算术平均值和无偏总体偏差,是2个方法的综合 62 /// 简单的未排序数组. 63 public static TupleMeanVariance(double[] samples) 64 { 65 return new Tuple (Mean(samples), Variance(samples)); 66 } 67 68 /// 计算算术平均值和无偏总体标准差,是2个方法的综合 69 /// 简单的未排序数组. 70 public static TupleMeanStandardDeviation(double[] samples) 71 { 72 return new Tuple (Mean(samples), StandardDeviation(samples)); 73 } 74 75 /// 计算2个数组的无偏协方差:对大小为N的数据集,使用N-1进行标准化. 76 /// 第一个数组. 77 /// 第二个数组. 78 public static double Covariance(double[] samples1, double[] samples2) ; 79 80 ///计算2个数组的总体协方差:对大小为N的数据集,使用N进行标准化. 81 /// 第一个数组. 82 /// 第二个数组. 83 public static double PopulationCovariance(double[] population1, double[] population2) ; 84 85 ///计算数组的均方根误差(RMS). 86 /// 简单的未排序数组. 87 public static double RootMeanSquare(double[] data) ; 88 89 ///计算未排序数组的 顺序统计量(1..N). 注意:会导致data数组的值会重新排序. 90 /// 数组,未排序,计算过程会被排序. 91 /// 从1开始的顺序统计,1 - N 之间. 92 public static double OrderStatisticInplace(double[] data, int order) ; 93 94 ///计算未排序数组的中位数:data数组会被重新排序. 95 /// 数组,未排序,计算过程会被排序. 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 ///105 /// 计算未排序数组的p百分位数:如果需要非整数百分比,使用分位数替代. 106 /// Approximately median-unbiased regardless of the sample distribution (R8).107 /// WARNING: 计算过程会对data排序.108 /// 109 /// 数组,未排序,计算过程会被排序.110 /// p分为点,0 - 100 之间.111 public static double PercentileInplace(double[] data, int p)112 {113 return QuantileInplace(data, p/100d);114 }115 116 ///117 /// 计算未排序数组的第一个四分位数的值118 /// Approximately median-unbiased regardless of the sample distribution (R8).119 /// WARNING: 计算过程会对data排序.120 /// 121 /// 数组,未排序,计算过程会被排序.122 public static double LowerQuartileInplace(double[] data)123 {124 return QuantileInplace(data, 0.25d);125 }126 127 ///128 /// 计算未排序数组的第三个四分位数的值129 /// Approximately median-unbiased regardless of the sample distribution (R8).130 /// WARNING: 计算过程会对data排序.131 /// 132 /// 数组,未排序,计算过程会被排序.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.资源
源码下载:
如果本文资源或者显示有问题,请参考 :