为何R语言cor函数计算的相关系数与向量夹角余弦值存在差异?
问题原因与修正方案
皮尔逊相关系数(cor函数默认计算的是这个)的本质是中心化后向量的夹角余弦值,你直接用原始向量计算点积与范数的比值,没有做中心化处理,这是结果不一致的核心原因。
修正步骤
- 对原始向量做中心化处理:每个元素减去该向量的均值
- 用中心化后的向量计算点积除以范数乘积,结果就会和
cor函数的输出一致
修正后的代码
data("anscombe") x <- matrix(anscombe$x1) y <- matrix(anscombe$y1) # 输出皮尔逊相关系数 cor(x,y) # 中心化向量 x_centered <- x - mean(x) y_centered <- y - mean(y) # 计算中心化后向量的夹角余弦值,与cor结果一致 (t(x_centered) %*% y_centered) / (norm(x_centered, type = 'f') * norm(y_centered, type = 'f'))
补充说明
皮尔逊相关系数的公式为:cor(x,y) = cov(x,y) / (sd(x) * sd(y))
- 中心化后向量的点积等于
(n-1)*cov(x,y)(n为样本量) - 中心化后向量的F范数等于
sqrt((n-1)*var(x)),两个范数的乘积为(n-1)*sd(x)*sd(y) - 两者相除后,(n-1)项抵消,结果正好等于皮尔逊相关系数,也就是中心化向量的夹角余弦值
内容的提问来源于stack exchange,提问作者Kuru
相关产品推荐
相关产品推荐

