7

我正在从用户评分数据(特别是 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)行中,我将NaNs 替换为 0。

4

1 回答 1

3

我最近为用户-用户和用户-项目矩阵开发了一个 Java 推荐系统。首先,您可能已经发现。RS很难。对于我的实现,我使用了很棒的 Apache Common Math Library,您使用的是 R,它在计算 Pearson 的方式上可能相对相似。

您的问题是:如何处理 NaN 值,然后进行编辑说您说 NaN 为 = 0。

我的回答是这样的:

您不应该真正将 NaN 值处理为 0,因为您所说的是用户或用户/项目之间绝对没有相关性。情况可能如此,但可能并非总是如此。忽略这一点扭曲您的建议。

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

可以返回 NaN 的操作有以下三种:

  1. 以 NaN 作为至少一个操作数的操作。

  2. 不定形式 除法 0/0 和 ±∞/±∞ 乘法 0×±∞ 和 ±∞×0 加法 ∞ + (−∞)、(−∞) + ∞ 和等效减法 该标准具有幂的替代函数:标准 pow 函数和整数指数 pown 函数将 00、1∞ 和 ∞0 定义为 1。 powr 函数将所有三种不确定形式定义为无效运算,因此返回 NaN。

  3. 具有复杂结果的实际运算,例如:负数的平方根。负数的对数小于 -1 或大于 +1 的数的反正弦或余弦。

您应该调试您的应用程序并逐步完成每个步骤,以查看上述哪个原因是有问题的原因。

其次,了解 Pearsons 相关性可以用多种不同的方式表示,您需要考虑是跨样本还是总体计算它,然后找到合适的计算方法,即针对总体:

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) 是标准差,标准差通常是方差的正平方根,方差 =总和((x_i - 平均值)^2)/(n - 1)

其中mean是平均值,n是样本观察的数量。

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

第三,站在推荐人的角度,从推荐的角度思考问题。如果您有 2 个用户并且他们只有 1 个共同评分,请在较小的数据集中为 I1 说 U1 和 U4。那一项共同点真的足以提供建议吗?答案是——当然不是。那么我也可以建议你设置一个最低的 ratingInCommon 阈值,以确保推荐的质量更好。您可以为此阈值设置的最小值为 2,但请考虑将其设置得更高一些。如果您阅读了 MovieLens 的研究,那么他们将其设置为 5-10 之间(不记得我的头顶)。您设置得越高,您获得的覆盖率就越低,但您将获得“更好”(错误分数越低)的建议。你'

就以上几点。查看 U4 并与其他用户进行比较。请注意 U4 如何与任何用户没有超过 1 项的共同点。现在希望您会注意到 NaN 仅出现在 U4 中。如果您遵循了这个答案,那么您现在希望看到获得 NaN 的原因是因为您实际上可以只用一个共同的项目来计算 Pearson :)。

最后,关于上面的示例数据集,让我有点困扰的一件事是 1 和 -1 的相关性的数量。想一想这些用户偏好的实际含义,然后根据实际评级检查它们。例如,查看 U1 和 U2 评级。对于项目 1,它们具有很强的正相关性 1(都将其评为 4)然后对于项目 3,它们具有很强的负相关性(U1 将其评为 5,U3 将其评为 1),这两个用户之间的 Pearson 相关性似乎很奇怪 - 1(即他们的偏好完全相反)。显然情况并非如此,Pearson 分数实际上应该略高于或略低于 0。这个问题链接回关于在量表上使用 0 以及仅比较少量项目的点。

现在,有一些策略可以“填写”用户未评分的项目。我不打算深入研究它们,您需要阅读它,但本质上它就像使用该项目的平均分数或该用户的平均评分。这两种方法都有其缺点,我个人不太喜欢其中任何一种。我的建议是仅在用户有 5 个或更多共同项目时计算用户之间的 Pearson 相关性,而忽略评分为 0(或更好 - 空)评分的项目。

所以总结一下。

  1. NaN 不等于 0,因此不要将其设置为 0。
  2. 比例中的 0 更好地表示为 null
  3. 仅当两个用户之间的共同项目数大于 1(最好大于 5/10)时,才应计算 Pearson 相关性。
  4. 仅计算两个用户共同评分项目的 Pearson 相关性,不要将其他用户未评分的项目包括在分数中。

希望有帮助,祝你好运。

于 2014-12-03T17:37:07.687 回答