开源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.前 ...
随机推荐
- 点击UITableView的cell展开收缩
在项目中有个需求,点击表视图的单元格展开,再点击另外一个单元格或者本身又收缩,经过一段时间尝试,实现了该功能,现在记录分享总结下. 首先要理解UITableView代理方法调用的先后顺序. 当 ...
- JavaWeb项目开发案例精粹-第4章博客网站系统-001设计
1. 2. 3. # MySQL-Front 5.0 (Build 1.0) /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */; /*!40101 SET SQL_MO ...
- 几个Unicode新知识:扩展ANSI有很多种(256个字符),Unicode表示ANSI字符时高字节为0,Unicode不包括古代字符
都是有些模糊的概念,特别是Unicode不包括古代字符让我有点惊讶.看来Unicode只适用于大多数情况,一旦有无法表示的字符,那该怎么办呢? ANSI针对英语设计的,当处理带有音调标号(形如汉语的拼 ...
- CreateFile,WriteFile,ReadFile
注意: CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式 ReadFile 或 WriteFile 都是对二进制数据进行操作 HANDLE WINAPI Cre ...
- Android 等比例缩放图片
// 缩放图片 public static Bitmap zoomImg(String img, int newWidth ,int newHeight){ // 图片源 Bitmap bm = Bi ...
- 忘记导入struts2-xxx-plugin-x.x.x.jar导致服务器启动报Unable to load configuration.Caused by: Parent package is not defined: xxx-default
今天做的一个Struts2+MyFaces(JSF)+Spring的应用,为了使用JSF,我的struts.xml中使用了如下代码 <package name="jsf" e ...
- 【图像算法】图像特征:GLCM灰度共生矩阵,纹理特征
[图像算法]图像特征:GLCM SkySeraph Aug 27th 2011 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modifie ...
- django中post方法和get方法的不同
当我们提交表单仅仅需要获取数据时就可以用GET: 而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST. 在这个搜索书籍的例子里,我们 ...
- 《OD大数据实战》Flume环境搭建
一.CentOS 6.4安装Nginx http://shiyanjun.cn/archives/72.html 二.安装Flume 1. 下载flume-ng-1.5.0-cdh5.3.6.tar. ...
- ImageView 设置图片
android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setIm ...