本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新
開源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>