如何计算 2 个给定向量之间的 Pearson 相关性?
How to compute Pearson Correlation between 2 given vectors?
我必须用 C# 编写代码
你能在下面给出的例子中逐步解释吗?
vector 1 : [0.3, 0, 1.7, 2.2]
vector 2 : [0, 3.3, 1.2, 0]
很喜欢
这将用于文档聚类
这是我在 Java 版本
上的回答的 改编
How to find correlation between two integer arrays in java
对于 C#。首先,皮尔逊相关系数为
http://en.wikipedia.org/wiki/Correlation_and_dependence
前提是两个向量(设IEnumerable<Double>
)长度相同
private static double Correlation(IEnumerable<Double> xs, IEnumerable<Double> ys) {
// sums of x, y, x squared etc.
double sx = 0.0;
double sy = 0.0;
double sxx = 0.0;
double syy = 0.0;
double sxy = 0.0;
int n = 0;
using (var enX = xs.GetEnumerator()) {
using (var enY = ys.GetEnumerator()) {
while (enX.MoveNext() && enY.MoveNext()) {
double x = enX.Current;
double y = enY.Current;
n += 1;
sx += x;
sy += y;
sxx += x * x;
syy += y * y;
sxy += x * y;
}
}
}
// covariation
double cov = sxy / n - sx * sy / n / n;
// standard error of x
double sigmaX = Math.Sqrt(sxx / n - sx * sx / n / n);
// standard error of y
double sigmaY = Math.Sqrt(syy / n - sy * sy / n / n);
// correlation is just a normalized covariation
return cov / sigmaX / sigmaY;
}
测试:
// -0.539354840012899
Double result = Correlation(
new Double[] { 0.3, 0, 1.7, 2.2 },
new Double[] { 0, 3.3, 1.2, 0 });
我必须用 C# 编写代码
你能在下面给出的例子中逐步解释吗?
vector 1 : [0.3, 0, 1.7, 2.2]
vector 2 : [0, 3.3, 1.2, 0]
很喜欢
这将用于文档聚类
这是我在 Java 版本
上的回答的 改编How to find correlation between two integer arrays in java
对于 C#。首先,皮尔逊相关系数为
http://en.wikipedia.org/wiki/Correlation_and_dependence
前提是两个向量(设IEnumerable<Double>
)长度相同
private static double Correlation(IEnumerable<Double> xs, IEnumerable<Double> ys) {
// sums of x, y, x squared etc.
double sx = 0.0;
double sy = 0.0;
double sxx = 0.0;
double syy = 0.0;
double sxy = 0.0;
int n = 0;
using (var enX = xs.GetEnumerator()) {
using (var enY = ys.GetEnumerator()) {
while (enX.MoveNext() && enY.MoveNext()) {
double x = enX.Current;
double y = enY.Current;
n += 1;
sx += x;
sy += y;
sxx += x * x;
syy += y * y;
sxy += x * y;
}
}
}
// covariation
double cov = sxy / n - sx * sy / n / n;
// standard error of x
double sigmaX = Math.Sqrt(sxx / n - sx * sx / n / n);
// standard error of y
double sigmaY = Math.Sqrt(syy / n - sy * sy / n / n);
// correlation is just a normalized covariation
return cov / sigmaX / sigmaY;
}
测试:
// -0.539354840012899
Double result = Correlation(
new Double[] { 0.3, 0, 1.7, 2.2 },
new Double[] { 0, 3.3, 1.2, 0 });