You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何R语言cor函数计算的相关系数与向量夹角余弦值存在差异?

问题原因与修正方案

皮尔逊相关系数(cor函数默认计算的是这个)的本质是中心化后向量的夹角余弦值,你直接用原始向量计算点积与范数的比值,没有做中心化处理,这是结果不一致的核心原因。

修正步骤

  1. 对原始向量做中心化处理:每个元素减去该向量的均值
  2. 用中心化后的向量计算点积除以范数乘积,结果就会和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:33:13