基于c#的相关性分析_开源Math.NET基础数学类库使用(11)C#计算相关系数
數據集的基本統計計算是應用數學,以及統計應用中最常用的功能。如計算數據集的均值,方差,標準差,最大值,最小值,熵等等。Math.NET中的MathNet.Numerics.Statistics命名空間就包括了大量的這些統計計算的函數。今天就為大家介紹的是使用Math.NET計算相關系數的類:Correlation。
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類型的實現和源碼。該類型是靜態類,其中的靜態方法都是每一個類型的相關系數的計算,因此在使用的時候,根據需要進行調用即可。其包含的內容如下,為了方便大家觀看,已經將其中的注釋翻譯為英文了,也相對于說明吧。
/// 2個數據集的相關度計算類
public static classCorrelation
{
/// 計算皮爾遜積差相關系數
/// 數據樣本A.
/// 數據樣本B.
/// 返回皮爾遜積差相關系數.
public static double Pearson(IEnumerable dataA, IEnumerabledataB)
{
int n = 0;
double r = 0.0;
double meanA = 0;
double meanB = 0;
double varA = 0;
double varB = 0;
using (IEnumerator ieA =dataA.GetEnumerator())
using (IEnumerator 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);
}
/// 計算加權皮爾遜積差相關系數.
/// 數據樣本A.
/// 數據樣本B.
/// 數據權重.
/// 加權皮爾遜積差相關系數.
public static double WeightedPearson(IEnumerable dataA, IEnumerable dataB, IEnumerableweights)
{
int n = 0;
double meanA = 0;
double meanB = 0;
double varA = 0;
double varB = 0;
double sumWeight = 0;
double covariance = 0;
using (IEnumerator ieA =dataA.GetEnumerator())
using (IEnumerator ieB =dataB.GetEnumerator())
using (IEnumerator 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);
}
/// 計算皮爾遜積差相關矩陣
/// 數據矩陣
/// 皮爾遜積差相關矩陣.
public static Matrix PearsonMatrix(params double[][] vectors)
{
var m = Matrix.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);
}
}
returnm;
}
/// 計算皮爾遜積差相關矩陣
總結
以上是生活随笔為你收集整理的基于c#的相关性分析_开源Math.NET基础数学类库使用(11)C#计算相关系数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elisa标准曲线怎么做_ELISA标准
- 下一篇: 一个电脑能装几块固态_装上固态SSD的电