开源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类,类的核心实现,代码过多,只列举了代码原型,和注释:
/// <summary>
/// 对未排序的数组进行统计操作 警告: Methods with the Inplace-suffix may modify the data array by reordering its entries.
/// </summary>
public static class ArrayStatistics
{
/// <summary>返回未排序数组的最小值,如果数据为空或者元素为NaN,则返回NaN.</summary>
/// <param name="data">简单的未排序数组.</param>
public static double Minimum(double[] data) /// <summary>返回未排序数组的最小值,如果数据为空或者元素为NaN,则返回NaN.</summary>
/// <param name="data">简单的未排序数组.</param>
public static float Minimum(float[] data) ; /// <summary>返回未排序数组的最大值,如果数据为空或者元素为NaN,则返回NaN.</summary>
/// <param name="data">简单的未排序数组.</param>
public static double Maximum(double[] data) ; /// <summary>返回未排序数组的最大值,如果数据为空或者元素为NaN,则返回NaN.</summary>
/// <param name="data">简单的未排序数组.</param>
public static float Maximum(float[] data); /// <summary>计算未排序数组的算术平均值,如果数据是空的或者元素为NaN</summary>
/// <param name="data">简单的未排序数组.</param>
public static double Mean(double[] data) ; /// <summary>
/// 计算未排序数组的无偏总体方差:对大小为N的数据集,使用N-1进行标准化.
/// (Bessel's correction). 贝塞尔(无偏估计)校正系数
/// 如果数据连小于2,或者数据为NaN,则返回NaN
/// </summary>
/// <param name="samples">简单的未排序数组.</param>
public static double Variance(double[] samples) ; /// <summary>
/// 计算为排序数组的总体方差.对大小为N的数据集,使用N进行标准化.因此是有偏差的
/// 如果数据为NaN,则返回NaN
/// </summary>
/// <param name="population">简单的未排序数组.</param>
public static double PopulationVariance(double[] population) ; /// <summary>
/// 计算无偏总体标准差:对大小为N的数据集,使用N-1进行标准化.
/// 如果数据连小于2,或者数据为NaN,则返回NaN
/// </summary>
/// <param name="samples">简单的未排序数组.</param>
public static double StandardDeviation(double[] samples)
{
return Math.Sqrt(Variance(samples));
} /// <summary>
/// 计算总体标准差:对大小为N的数据集,使用N进行标准化.
/// 如果数据为NaN,则返回NaN.
/// </summary>
/// <param name="population">简单的未排序数组.</param>
public static double PopulationStandardDeviation(double[] population)
{
return Math.Sqrt(PopulationVariance(population));
} /// <summary>计算算术平均值和无偏总体偏差,是2个方法的综合</summary>
/// <param name="samples">简单的未排序数组.</param>
public static Tuple<double, double> MeanVariance(double[] samples)
{
return new Tuple<double, double>(Mean(samples), Variance(samples));
} /// <summary>计算算术平均值和无偏总体标准差,是2个方法的综合</summary>
/// <param name="samples">简单的未排序数组.</param>
public static Tuple<double, double> MeanStandardDeviation(double[] samples)
{
return new Tuple<double, double>(Mean(samples), StandardDeviation(samples));
} /// <summary>计算2个数组的无偏协方差:对大小为N的数据集,使用N-1进行标准化.</summary>
/// <param name="samples1">第一个数组.</param>
/// <param name="samples2">第二个数组.</param>
public static double Covariance(double[] samples1, double[] samples2) ; /// <summary>计算2个数组的总体协方差:对大小为N的数据集,使用N进行标准化.</summary>
/// <param name="population1">第一个数组.</param>
/// <param name="population2">第二个数组.</param>
public static double PopulationCovariance(double[] population1, double[] population2) ; /// <summary>计算数组的均方根误差(RMS).</summary>
/// <param name="data">简单的未排序数组.</param>
public static double RootMeanSquare(double[] data) ; /// <summary>计算未排序数组的 顺序统计量(1..N). 注意:会导致data数组的值会重新排序.</summary>
/// <param name="data">数组,未排序,计算过程会被排序.</param>
/// <param name="order">从1开始的顺序统计,1 - N 之间.</param>
public static double OrderStatisticInplace(double[] data, int order) ; /// <summary>计算未排序数组的中位数:data数组会被重新排序.</summary>
/// <param name="data">数组,未排序,计算过程会被排序.</param>
public static double MedianInplace(double[] data)
{
var k = data.Length/;
return data.Length.IsOdd()
? SelectInplace(data, k)
: (SelectInplace(data, k - ) + SelectInplace(data, k))/2.0;
} /// <summary>
/// 计算未排序数组的p百分位数:如果需要非整数百分比,使用分位数替代.
/// Approximately median-unbiased regardless of the sample distribution (R8).
/// WARNING: 计算过程会对data排序.
/// </summary>
/// <param name="data">数组,未排序,计算过程会被排序.</param>
/// <param name="p">p分为点,0 - 100 之间.</param>
public static double PercentileInplace(double[] data, int p)
{
return QuantileInplace(data, p/100d);
} /// <summary>
/// 计算未排序数组的第一个四分位数的值
/// Approximately median-unbiased regardless of the sample distribution (R8).
/// WARNING: 计算过程会对data排序.
/// </summary>
/// <param name="data">数组,未排序,计算过程会被排序.</param>
public static double LowerQuartileInplace(double[] data)
{
return QuantileInplace(data, 0.25d);
} /// <summary>
/// 计算未排序数组的第三个四分位数的值
/// Approximately median-unbiased regardless of the sample distribution (R8).
/// WARNING: 计算过程会对data排序.
/// </summary>
/// <param name="data">数组,未排序,计算过程会被排序.</param>
public static double UpperQuartileInplace(double[] data)
{
return QuantileInplace(data, 0.75d);
}
当然不是所有人都会用到这些函数,一般人可能只会用到一些常用的,如均值,方差等等。详细的使用,可以看下面的例子。
3.统计函数使用的例子1
上面已经提到,对于静态类中的方法,可以根据需要使用扩展方法,或者直接调用该函数进行计算相应的统计指标。这种事情是非常简单的,看一个综合的例子:
//先生成数据集合
var chiSquare = new ChiSquared();
Console.WriteLine(@"2. Generate 1000 samples of the ChiSquare(5) distribution");
var data = new double[];
for (var i = ; i < data.Length; i++)
{
data[i] = chiSquare.Sample();
} //使用扩展方法进行相关计算
Console.WriteLine(@"3.使用扩展方法获取生成数据的基本统计结果");
Console.WriteLine(@"{0} - 最大值", data.Maximum().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 最小值", data.Minimum().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 均值", data.Mean().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 中间值", data.Median().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 有偏方差", data.PopulationVariance().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 无偏方差", data.Variance().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 标准偏差", data.StandardDeviation().ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - 标准有偏偏差", data.PopulationStandardDeviation().ToString(" #0.00000;-#0.00000"));
Console.WriteLine();
结果如下:
.使用扩展方法获取生成数据的基本统计结果
19.84215 - 最大值
0.20662 - 最小值
4.92818 - 均值
4.35988 - 中间值
9.34684 - 有偏方差
9.35619 - 无偏方差
3.05879 - 标准偏差
3.05726 - 标准有偏偏差
下面将介绍使用DescriptiveStatistics类直接进行所有指标计算的例子。
4.统计函数使用的例子2
使用DescriptiveStatistics的方法也很简单,直接使用数据数组进行初始化,然后根据属性获取对应的指标结果就可以了。如下代码:
Console.WriteLine(@"4. 使用DescriptiveStatistics类进行基本的统计计算");
var descriptiveStatistics = new DescriptiveStatistics(data);//使用数据进行类型的初始化
//直接使用属性获取结果
Console.WriteLine(@"{0} - Kurtosis", descriptiveStatistics.Kurtosis.ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - Largest element", descriptiveStatistics.Maximum.ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - Smallest element", descriptiveStatistics.Minimum.ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - Mean", descriptiveStatistics.Mean.ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - Variance", descriptiveStatistics.Variance.ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - Standard deviation", descriptiveStatistics.StandardDeviation.ToString(" #0.00000;-#0.00000"));
Console.WriteLine(@"{0} - Skewness", descriptiveStatistics.Skewness.ToString(" #0.00000;-#0.00000"));
Console.WriteLine();
结果如下:
. 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
开源Math.NET基础数学类库使用(10)C#进行基本数据统计的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【目录】开源Math.NET基础数学类库使用总目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.开源Math.NET数学组件文章 1.开源Math.NET基础数学类库使用(01)综合介绍 2.开源Math.NET ...
- 【原创】开源Math.NET基础数学类库使用(07)常用的数学物理常数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 1.前 ...
- 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 开源Math.NET基础数学类库使用(11)C#计算相关系数
阅读目录 前言 1.Math.NET计算相关系数的类 2.Correlation的实现 3.使用案例 4.资源 本博客所有文章分类的总目录:[总目录]本博客博文总目录-实 ...
- 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
随机推荐
- Spring集成XFire开发WebService
Spring是眼下最流行的JavaEE Framework,可是使用Spring的Spring-WS开发WebService却十分繁琐.XFire是一个简化WebService开发的开源项目.通过Sp ...
- Androidclient和server端数据交互的第一种方法
网上有非常多样例来演示Android客户端和server端数据怎样实现交互只是这些样例大多比較繁杂,对于刚開始学习的人来说这是不利的.如今介绍几种代码简单.逻辑清晰的交互样例,本篇博客介绍第一种: 一 ...
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes(后缀数组orKMP)
D. Prefixes and Suffixes time limit per test 1 second memory limit per test 256 megabytes input stan ...
- 收集经常使用的.net开源项目
Json.NET http://json.codeplex.com/ Json.Net是一个读写Json效率比較高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Lin ...
- shell命令批量杀死MySQL连接进程
(1)将全部的MySQL连接进程杀掉 for i in `mysql -uroot -pzhangyun -Bse "show processlist" | grep -v &qu ...
- UILabel iOS添加文本控件
UILabel这是iOS控制,这是UIView子类,只有在UIView文字显示功能的基础上加入.UILabel还查看课程和UIView类别似 //1.创建一个视图对象 //2.配置视图 ...
- java 短信验证码===随机数
生成验证码,验证码生成 String mobile = phone;// 手机号码,多个号码使用","分割 // 生成随机6位码 String s = ""; ...
- U8Linux磁盘与文件系统管理
1.扇区为最小的物理存储单位,每个扇区为512bytes;将扇区组成一个圆,那就是柱面,柱面是分区的最小单位.Linux系统的EX2文件系统:inode的内容用于记录文件的权限与相关属性. 至于blo ...
- MyBatis一级缓存引起的无穷递归
MyBatis一级缓存引起的无穷递归 引言: 最近在项目中参与了一个领取优惠劵的活动,当多个用户领取同一张优惠劵的时候,使用了数据库锁控制并发,起初的设想是:如果多个人同时领一张劵,第一个到达的人领取 ...
- 带鉴权信息的SIP呼叫
带鉴权信息的SIP呼叫 INVITE sip:1000@192.168.50.34SIP/2.0 Via: SIP/2.0/UDP192.168.50.32:2445;branch=z9hG4bK-d ...