我正在根据用户评级数据(特别是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
用户 - 用户Pearson相关性相似性矩阵
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
为了计算皮尔森相关性,在两个用户之间仅考虑经过指定的项目。 (见Toward the Next Generation of Recommender Systems: A Survey of the State-of-the-Art and Possible Extensions, 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
替换为0.