开源Math.NET基础数学类库使用(10)C#进行基本数据统计

原文:【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计

              本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

开源Math.NET基础数学类库使用总目录http://www.cnblogs.com/asxinyu/p/4329737.html

前言

  数据集的基本统计计算是应用数学,以及统计应用中最常用的功能。如计算数据集的均值,方差,标准差,最大值,最小值,熵等等。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

时间: 2024-10-11 12:57:27

开源Math.NET基础数学类库使用(10)C#进行基本数据统计的相关文章

【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计

1.开源Math.NET基础数学类库使用系列文章总目录: 链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4.其他开源的.NET组件文章:链接 5..NET平台机器学习组件-Infer.NET系列文章:链接 6.Matlab混合编程文章:链接 前言 数据集的基本统计计算是应用数学,以及统计应用中最常用的功能.如计算数据集的均值,方差,标准差,最大值,最小值,熵等等.Math.NET中的MathNet.Numerics.Statistics命名空间就包括

【原创】开源Math.NET基础数学类库使用(六)数值分析之线性方程直接求解

开源Math.NET基础数学类库使用系列文章总目录: 1.开源.NET基础数学计算组件Math.NET(一)综合介绍  2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算  3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式 4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式 5.开源.NET基础数学类库使用Math.NET(五)C#解析Delimited Formats数据格式 6.开源.NET基础

【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容.这个月接着深入发掘Math.NET的各种功能,并对

【原创】开源Math.NET基础数学类库使用(07)一些常用的数学物理常数

开源Math.NET基础数学类库使用系列文章总目录:   1.开源.NET基础数学计算组件Math.NET(一)综合介绍    2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算    3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式   4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式   5.开源.NET基础数学类库使用Math.NET(五)C#解析Delimited Formats数据格式

【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容.这个月接着深入发掘Math.NET的各种功能,并对

【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用

开源Math.NET基础数学类库使用系列文章总目录: 链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4.其他开源的.NET组件文章:链接 5..NET平台机器学习组件-Infer.NET系列文章:链接 6.Matlab混合编程文章:链接 前言 数论就是指研究整数性质的一门理论.数论=算术.不过通常算术指数的计算,数论指数的理论.整数的基本元素是素数,所以数论的本质是对素数性质的研究.它是与平面几何同样历史悠久的学科.它大致包括代数数论.解析数论.计算

【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 前言 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的.而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的.我们可以这样

开源Math.NET基础数学类库使用(02)矩阵向量计算

原文:[原创]开源Math.NET基础数学类库使用(02)矩阵向量计算 开源Math.NET基础数学类库使用系列文章总目录:   1.开源.NET基础数学计算组件Math.NET(一)综合介绍    2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算    3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式   4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式   5.开源.NET基础数学类库使用M

【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数

              本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 前言 数据集的基本统计计算是应用数学,以及统计应用中最常用的功能.如计算数据集的均值,方差,标准差,最大值,最小值,熵等等.Math.NET中的MathNet.Numerics.Statistics命名空间就包括了大