base R cor()与recommenderlab包similarity()结果差异原因咨询
为什么base R的
cor()和recommenderlab的similarity()计算的相关矩阵结果不同? 这是个很常见的疑惑!两者结果不一致的核心原因是计算皮尔逊相关时的预处理逻辑完全不同,具体拆解如下:
1. recommenderlab::similarity()的皮尔逊计算逻辑
当你设置method="pearson"且which="items"时,这个函数是按照推荐系统的标准逻辑来计算物品相似度的:
- 首先对每个用户的评分做中心化处理:把每个用户的所有评分减去该用户的平均评分(只计算该用户有打分的项的均值),这一步是为了消除用户的打分偏倚(比如有的用户习惯打高分,有的用户天生严苛爱打低分)。
- 之后再计算两两物品之间的皮尔逊相关,仅考虑同时给这两个物品打过分的用户数据。
2. base R::cor()的计算逻辑
你调用的cor(as(MovieLense, "matrix"), use = "pairwise.complete.obs")是直接计算原始评分向量的皮尔逊相关:
- 没有做任何用户层面的中心化,完全基于用户的原始打分值计算物品之间的相关性。
- 虽然同样使用
pairwise.complete.obs来处理缺失值,但因为没有消除用户打分偏倚,结果和similarity()自然会有差异。
验证:手动对齐逻辑后结果一致
如果我们手动给原始矩阵做用户中心化,再用base R的cor()计算,结果就会和similarity()完全匹配:
library(recommenderlab) data(MovieLense) # 转换为普通矩阵 movie_mat <- as(MovieLense, "matrix") # 计算每个用户的平均评分(忽略缺失值) user_avg <- rowMeans(movie_mat, na.rm = TRUE) # 对每个用户的评分做中心化:评分 - 用户均值 centered_movie_mat <- sweep(movie_mat, 1, user_avg, "-") # 计算中心化后的相关矩阵 cor_mat_centered <- suppressWarnings(cor(centered_movie_mat, use = "pairwise.complete.obs")) # 对比recommenderlab的结果 cor_mat <- as(similarity(MovieLense, method = "pearson", which = "items"), "matrix") all.equal(cor_mat, cor_mat_centered, check.attributes = FALSE) # 输出会是TRUE
简单来说,similarity()是为推荐系统场景优化过的皮尔逊相似度,而base R的cor()是通用的统计相关计算,两者的适用场景和预处理步骤不同,所以结果自然不一样。
内容的提问来源于stack exchange,提问作者Miles Coltrane
相关产品推荐
相关产品推荐

