首页 文章

如何在推荐系统中的Pearson相关用户 - 用户相似度矩阵中处理NaN?

提问于
浏览
6

我正在从用户评级数据(特别是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值?

EDIT 这是一个代码,我在其中找到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 .

1 回答

  • 2

    我最近开发了一个Java用户用户和用户项目矩阵推荐系统 . 首先,你可能已经找到了 . RS很难 . 对于我的实现,我使用了Apache公共数学库这很棒,你使用的R在计算Pearson的方面可能比较相似 .

    你的问题是:我如何处理NaN值,然后编辑说你说NaN = 0 .

    我的答案是这样的:

    您不应该将NaN值真正处理为0,因为您所说的是用户或用户/项之间绝对存在 no 相关性 . 情况可能如此,但情况可能并非总是如此 . 忽略此 will 会扭曲您的建议 .

    首先你应该问自己,“为什么我会得到NaN的 Value ”?以下是来自NaN的Wiki页面的一些原因,详细说明了为什么您可能获得NaN值:

    有三种操作可以返回NaN:

    • 使用NaN作为至少一个操作数的操作 .

    • 不确定形式除法0/0和±∞/±∞乘法0×±∞和±∞×0加法∞(-∞),( - ∞)∞和等效减法标准具有权力的替代函数:标准pow函数和整数指数pown函数将00,1∞和∞0定义为1. powr函数将所有三个不确定形式定义为无效操作,因此返回NaN .

    • 具有复杂结果的实际操作,例如:负数的平方根 . 负数的对数数小于-1或大于1的反正弦或余弦 .

    您应该调试应用程序并逐步完成每个步骤,以查看上述哪个原因是违规原因 .

    其次要理解Pearsons Correlation可以用多种不同的方式表示,你需要考虑是否在样本或人口中计算它,然后找到适当的计算方法,即人口:

    cor(X,Y)=Σ[(xi - E(X))(yi - E(Y))] / [(n - 1)s(X)s(Y)]

    其中E(X)是X的平均值,E(Y)是Y值的平均值,s(X),s(Y)是标准偏差,标准偏差一般是方差的正平方根和方差= sum((x_i - mean)^ 2)/(n - 1)

    其中mean是Mean,n是样本观察的数量 .

    这可能是你的NaN出现的地方,即除以0而未评级 . 如果你能,我建议不要使用0的值来表示不评级,而是使用null . 我会这样做有两个原因:1 . 0可能是你的结果与NaNs,以及2.可读性/可理解性 . 你的比例是1 - 5,所以0不应该是功能,混淆事物 . 如果可能的话,尽量避免 .

    第三,从推荐者的角度出发,从推荐的角度思考问题 . 如果您有2个用户并且他们只有1个共同的评级,请在较小的数据集中为I1说U1和U4 . 这1个项目是否真的足以提供建议?答案是 - 当然不是 . 因此,我还可以建议您设置ratingInCommon的最低阈值,以确保推荐质量更好 . 您可以为此阈值设置的最小值为2,但请考虑将其设置为更高 . 如果您阅读了MovieLens研究,那么他们将其设置为5-10之间(不记得我的头顶) . 您设置的越高,您获得的覆盖范围就越少,但您将获得“更好”(更低的错误分数)建议 . 你可能已经完成了对学术文献的阅读,然后你可能会对这一点有所了解,但我想我还是会提到它 .

    关于以上几点 . 看在U4并与其他所有用户进行比较 . 请注意U4与任何用户的共同点是多少1项 . 现在希望你会注意到NaN只与U4一起出现 . 如果你已经按照这个答案,那么你现在可以看到你获得NaNs的原因是因为你实际上可以只用一个项目来计算Pearson's :) .

    最后,有一点让我对上面的样本数据集感到困扰的是1 's and -1' s的相关数 . 考虑一下这些用户偏好的实际说法,然后根据实际评级来检查它们 . 例如 . 看看U1和U2的评级 . 对于第1项,它们具有强烈的正相关性1(均为4),那么对于第3项,它们具有强烈的负相关性(U1将其评为5,U3将其评为1),这两个用户之间的Pearson相关性似乎很奇怪 - 1(即他们的偏好是 completely 相反) . 事实上并非如此,Pearson得分应该略高于或低于0.这个问题链接回到关于在比例上使用0并且仅将少量项目进行比较的要点 .

    现在,针对用户未评级的"filling in"项目制定了策略 . 我不打算进入他们,你需要阅读,但基本上就像使用该项目的平均分数或该用户的平均评分 . 这两种方法都有它们的缺点,我个人并不喜欢它们中的任何一种 . 我的建议是只计算用户之间共有5个或更多项时的Pearson相关性,并忽略评级为0(或更好 - 无效)评级的项目 .

    总结一下 .

    • NaN不等于0,因此不要将其设置为0 .
      您的比例中的

    • 0更好地表示为null

    • 当两个用户之间共同的项目数> 1,最好大于5/10时,您应该只计算Pearson Correlations .

    • 仅为具有通常评级项目的两个用户计算Pearson Correlation,不包括未被其他用户评分的分数中的项目 .

    希望有所帮助,祝你好运 .

相关问题