开源Math.NET基础数学类库使用(11)C#计算相关系数
本博客所有文章分类的总目录:【总目录】本博客博文总目录-实时更新
开源Math.NET基础数学类库使用总目录:【目录】开源Math.NET基础数学类库使用总目录
前言
数据集的基本统计计算是应用数学,以及统计应用中最常用的功能。如计算数据集的均值,方差,标准差,最大值,最小值,熵等等。Math.NET中的MathNet.Numerics.Statistics命名空间就包括了大量的这些统计计算的函数。今天就为大家介绍的是使用Math.NET计算相关系数的类:Correlation。
如果本文资源或者显示有问题,请参考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4301519.html
1.Math.NET计算相关系数的类
Correlation类在Math.NET在MathNet.Numerics.Statistics的命名空间下:
Correlation,静态类,计算2个数据集的相关度,如皮尔逊积差相关系数,加权皮尔逊积差相关系数,皮尔逊积差相关矩阵等;
相关系数的定义如下:
相关系数,或称线性相关系数、皮氏积矩相关系数(Pearson product-moment correlation coefficient, PPCC)等,是衡量两个随机变量之间线性相关程度的指标。它由卡尔·皮尔森(Karl Pearson)在1880年代提出[1],现已广泛地应用于科学的各个领域。 相关系数计算公式中,取值范围为[-1,1],r>0表示正相关,r<0表示负相关,|r|表示了变量之间相关程度的高低。特殊地,r=1称为完全正相关,r=-1称为完全负相关,r=0称为不相关。通常|r|大于0.8时,认为两个变量有很强的线性相关性。
Correlation类中的相关系数类型,如加权皮尔逊积差相关系数,皮尔逊积差相关矩阵的含义大家自己进行百度或者根据需要选择阅读。
2.Correlation的实现
在介绍其使用之前,还是介绍一下Correlation类型的实现和源码。该类型是静态类,其中的静态方法都是每一个类型的相关系数的计算,因此在使用的时候,根据需要进行调用即可。其包含的内容如下,为了方便大家观看,已经将其中的注释翻译为英文了,也相对于说明吧。

- /// <summary>2个数据集的相关度计算类</summary>
- public static class Correlation
- {
- /// <summary>计算皮尔逊积差相关系数</summary>
- /// <param name="dataA">数据样本A.</param>
- /// <param name="dataB">数据样本B.</param>
- /// <returns>返回皮尔逊积差相关系数.</returns>
- public static double Pearson(IEnumerable<double> dataA, IEnumerable<double> dataB)
- {
- int n = 0;
- double r = 0.0;
- double meanA = 0;
- double meanB = 0;
- double varA = 0;
- double varB = 0;
- using (IEnumerator<double> ieA = dataA.GetEnumerator())
- using (IEnumerator<double> ieB = dataB.GetEnumerator())
- {
- while (ieA.MoveNext())
- {
- if (!ieB.MoveNext())
- {
- throw new ArgumentOutOfRangeException("dataB", Resources.ArgumentArraysSameLength);
- }
- double currentA = ieA.Current;
- double currentB = ieB.Current;
- double deltaA = currentA - meanA;
- double scaleDeltaA = deltaA/++n;
- double deltaB = currentB - meanB;
- double scaleDeltaB = deltaB/n;
- meanA += scaleDeltaA;
- meanB += scaleDeltaB;
- varA += scaleDeltaA*deltaA*(n - 1);
- varB += scaleDeltaB*deltaB*(n - 1);
- r += (deltaA*deltaB*(n - 1))/n;
- }
- if (ieB.MoveNext())
- {
- throw new ArgumentOutOfRangeException("dataA", Resources.ArgumentArraysSameLength);
- }
- }
- return r/Math.Sqrt(varA*varB);
- }
- /// <summary>计算加权皮尔逊积差相关系数.</summary>
- /// <param name="dataA">数据样本A.</param>
- /// <param name="dataB">数据样本B.</param>
- /// <param name="weights">数据权重.</param>
- /// <returns>加权皮尔逊积差相关系数.</returns>
- public static double WeightedPearson(IEnumerable<double> dataA, IEnumerable<double> dataB, IEnumerable<double> weights)
- {
- int n = 0;
- double meanA = 0;
- double meanB = 0;
- double varA = 0;
- double varB = 0;
- double sumWeight = 0;
- double covariance = 0;
- using (IEnumerator<double> ieA = dataA.GetEnumerator())
- using (IEnumerator<double> ieB = dataB.GetEnumerator())
- using (IEnumerator<double> ieW = weights.GetEnumerator())
- {
- while (ieA.MoveNext())
- {
- if (!ieB.MoveNext())
- {
- throw new ArgumentOutOfRangeException("dataB", Resources.ArgumentArraysSameLength);
- }
- if (!ieW.MoveNext())
- {
- throw new ArgumentOutOfRangeException("weights", Resources.ArgumentArraysSameLength);
- }
- ++n;
- double xi = ieA.Current;
- double yi = ieB.Current;
- double wi = ieW.Current;
- double temp = sumWeight + wi;
- double deltaX = xi - meanA;
- double rX = deltaX*wi/temp;
- meanA += rX;
- varA += sumWeight*deltaX*rX;
- double deltaY = yi - meanB;
- double rY = deltaY*wi/temp;
- meanB += rY;
- varB += sumWeight*deltaY*rY;
- sumWeight = temp;
- covariance += deltaX*deltaY*(n - 1)*wi/n;
- }
- if (ieB.MoveNext())
- {
- throw new ArgumentOutOfRangeException("dataB", Resources.ArgumentArraysSameLength);
- }
- if (ieW.MoveNext())
- {
- throw new ArgumentOutOfRangeException("weights", Resources.ArgumentArraysSameLength);
- }
- }
- return covariance/Math.Sqrt(varA*varB);
- }
- /// <summary>计算皮尔逊积差相关矩阵</summary>
- /// <param name="vectors">数据矩阵</param>
- /// <returns>皮尔逊积差相关矩阵.</returns>
- public static Matrix<double> PearsonMatrix(params double[][] vectors)
- {
- var m = Matrix<double>.Build.DenseIdentity(vectors.Length);
- for (int i = 0; i < vectors.Length; i++)
- {
- for (int j = i + 1; j < vectors.Length; j++)
- {
- var c = Pearson(vectors[i], vectors[j]);
- m.At(i, j, c);
- m.At(j, i, c);
- }
- }
- return m;
- }
- /// <summary> 计算皮尔逊积差相关矩阵</summary>
- /// <param name="vectors">数据集合.</param>
- /// <returns>皮尔逊积差相关矩阵.</returns>
- public static Matrix<double> PearsonMatrix(IEnumerable<double[]> vectors)
- {
- return PearsonMatrix(vectors as double[][] ?? vectors.ToArray());
- }
- /// <summary>
- /// 斯皮尔曼等级相关系数
- /// </summary>
- /// <param name="dataA">数据集A.</param>
- /// <param name="dataB">数据集B.</param>
- /// <returns>斯皮尔曼等级相关系数.</returns>
- public static double Spearman(IEnumerable<double> dataA, IEnumerable<double> dataB)
- {
- return Pearson(Rank(dataA), Rank(dataB));
- }
- /// <summary>
- /// 斯皮尔曼等级相关矩阵
- /// Computes the Spearman Ranked Correlation matrix.
- /// </summary>
- /// <param name="vectors">数据集.</param>
- /// <returns>斯皮尔曼等级相关矩阵.</returns>
- public static Matrix<double> SpearmanMatrix(params double[][] vectors)
- {
- return PearsonMatrix(vectors.Select(Rank).ToArray());
- }
- /// <summary>计算斯皮尔曼等级相关矩阵</summary>
- /// <param name="vectors">数据集合.</param>
- /// <returns>斯皮尔曼等级相关矩阵.</returns>
- public static Matrix<double> SpearmanMatrix(IEnumerable<double[]> vectors)
- {
- return PearsonMatrix(vectors.Select(Rank).ToArray());
- }
- static double[] Rank(IEnumerable<double> series)
- {
- if (series == null)
- {
- return new double[0];
- }
- // WARNING: do not try to cast series to an array and use it directly,
- // as we need to sort it (inplace operation)
- var data = series.ToArray();
- return ArrayStatistics.RanksInplace(data, RankDefinition.Average);
- }
- }

3.使用案例
使用非常简单,看下面代码,随便生成的一个数据,没有啥意思,实际中,大家按需进行吧。

- 1 //先生成数据集合data
- 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 //生成数据集合dataB
- 11 var chiSquareB = new ChiSquared(2);
- 12 var dataB = new double[1000];
- 13 for (var i = 0; i < data.Length; i++)
- 14 {
- 15 dataB[i] = chiSquareB.Sample();
- 16 }
- 17
- 18 // 5. 计算data和dataB的相关系数
- 19 var r1 = Correlation.Pearson(data, dataB);
- 20 var r2 = Correlation.Spearman(data, dataB);

4.资源
源码下载:http://www.cnblogs.com/asxinyu/p/4264638.html
如果本文资源或者显示有问题,请参考 本文原文地址:http://www.cnblogs.com/asxinyu/p/4301519.html
开源Math.NET基础数学类库使用(11)C#计算相关系数的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- 开源Math.NET基础数学类库使用(16)C#计算矩阵秩
原文:[原创]开源Math.NET基础数学类库使用(16)C#计算矩阵秩 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...
- 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
原文:[原创]开源Math.NET基础数学类库使用(15)C#计算矩阵行列式 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 【原创】开源Math.NET基础数学类库使用(15)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.前 ...
随机推荐
- 模拟登陆115网盘(MFC版)
[cpp] view plain copy // 模拟登陆115网盘 #include <afxinet.h> // 包含相关的头文件 /* 用抓包工具抓包可得到需要提交的数据,然后模拟提 ...
- ssh2框架搭建
原文:ssh2框架搭建 struts2+spring4.0+hibernate4.0 4.x版本与3.x版本有较大区别,要配置方法须要注意,用到的jar包如下 文件结构 src/application ...
- C#中检测某个类(方法、程序集等各种部分)是否应用了指定的特性以及对特性的一些简单操作
前言:不管是自定义的一些特性,或者是C#中内置的特性,均继承自Attribute这个类,这个类也提供了一些方法,方便我们使用. Attribute类有三个静态方法:1.IsDefined,如果有指定的 ...
- JVM内存区域划分
前言 Java程序的运行是通过Java虚拟机来实现的.通过类加载器将class字节码文件加载进JVM,然后根据预定的规则执行.Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同 ...
- wrong number of arguments,java方法反射时数组参数的坑
java方法中只有一个参数是数组,反射的时候我们不能想当然的传歌数组进去,传数组进去的时候表示多个参数. 两个数组不是一个意思啊. 我们应该把数组转为objet,这样才表示一个参数. import j ...
- <转Tanky Woo> 字典树
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀 ...
- Android实现网络多线程文件下载
实现原理 (1)首先获得下载文件的长度,然后设置本地文件的长度. (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置. 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M ...
- Spring高级事务管理难点剖析
1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没 ...
- leetcode:Multiply Strings
Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...
- Machine Learning for hackers读书笔记_一句很重要的话
为了培养一个机器学习领域专家那样的直觉,最好的办法就是,对你遇到的每一个机器学习问题,把所有的算法试个遍,直到有一天,你凭直觉就知道某些算法行不通.