我正在从用户评分数据(特别是 MovieLens100K 数据)生成用户-用户相似度矩阵。计算相关性会导致一些 NaN 值。我在一个较小的数据集中进行了测试:
用户项目评分矩阵
I1 I2 I3 I4
U1 4 0 5 5
U2 4 2 1 0
U3 3 0 2 4
U4 4 4 0 0
用户-用户皮尔逊相关相似度矩阵
U1 U2 U3 U4 U5
U1 1 -1 0 -nan 0.755929
U2 -1 1 1 -nan -0.327327
U3 0 1 1 -nan 0.654654
U4 -nan -nan -nan -nan -nan
U5 0.755929 -0.327327 0.654654 -nan 1
为了计算 pearson 相关性,仅考虑两个用户之间的关联项目。(参见迈向下一代推荐系统:最新技术和可能扩展的调查,Gediminas Adomavicius,Alexander Tuzhilin
我如何处理 NaN 值?
编辑
这是我在 R 中找到 pearson 相关性的代码。R
矩阵是用户项目评级矩阵。包含 1 到 5 级评分 0 表示未评分。S
是用户-用户相关矩阵。
for (i in 1:nrow (R))
{
cat ("user: ", i, "\n");
for (k in 1:nrow (R))
{
if (i != k)
{
corated_list <- which (((R[i,] != 0) & (R[k,] != 0)) == TRUE);
ui <- (R[i,corated_list] - mean (R[i,corated_list]));
uk <- (R[k,corated_list] - mean (R[k,corated_list]));
temp <- sum (ui * uk) / sqrt (sum (ui^2) * sum (uk^2));
S[i,k] <- ifelse (is.nan (temp), 0, temp)
}
else
{
S[i,k] <- 0;
}
}
}
请注意,在该S[i,k] <- ifelse (is.nan (temp), 0, temp)
行中,我将NaN
s 替换为 0。