用户KNN -如何获取生成推荐的用户ID列表?

RionArisuRionArisu 成员职位:13贡献我
2021年1月编辑 帮助
以用户图书评价数据集为例:
用户|图书|评分
用户1 |图书1 | 5
用户2 |图书1 |图书4
用户2 |图书3 | 3


我们可以使用推荐扩展下的用户k-NN算子,根据与其他用户的图书偏好相似度,找出我们应该向用户推荐哪本书,输出如下:
用户|推荐图书
用户1 |图书3
用户1 |图书5
用户2 |图书6


然而,有什么方法可以找出谁是这些“相似”的用户,推荐来自哪里?
电流输出:我们向用户1推荐Book 3
预期输出:我们向用户1推荐书3,因为它与用户X有85%的相似度

我尝试使用Cross distance算子计算不同用户之间的距离,找出距离最短的用户。然而,跨距离者认为这两种情况是相似的:
1.读过同一本书的两个用户
2.两个没有读过同一本书的用户
而用户knn的相似性仅仅基于#1,两个用户读过同一本书。
因此,事实证明,图书推荐并不总是来自欧几里得距离最短的用户。
标记:

答案

  • jacobcybulskijacobcybulski 委员、大学教授职位:391独角兽
    当你应用k-NN模型时,你不仅会得到分类(预测),还会得到每个类的置信度。您可以使用这些属性来找出用户和图书之间的多对多关系,例如使用聚合操作符。
  • RionArisuRionArisu 成员职位:13贡献我
    2021年1月编辑
    标准的k-NN模型将为每个类提供置信度,然而,我在这个用例中使用的运算符是在推荐人扩展下的“用户k-NN”,如果我没有弄错的话,默认输出只提供推荐列表,但不提供每个类的置信度。

    P/S:对不起,我之前没有在描述中清楚地提到它是“用户k-NN”,现在已经重新编辑了描述。
  • jacobcybulskijacobcybulski 委员、大学教授职位:391独角兽
    好的,我知道这不是一个很优雅的技巧但是在你得到你的推荐之后,你可以用它们作为标签来训练一个标准的kNN模型它可以给你每个标签的置信因子而不是计算一个单独的距离矩阵。
  • RionArisuRionArisu 成员职位:13贡献我
    谢谢你的建议。
    我尝试执行以下步骤:
    1.使用“用户k- nn”(k=3,未加权)生成推荐
    2.在相同的数据集上使用“k- nn”(k=3,不加权,余弦相似度),使用用户列作为标签

    然而,在我从步骤2中获得3个具有最高置信度因子的用户之后,似乎我无法与步骤1中生成的结果相匹配。

    例如,步骤1向用户1推荐图书5。
    然而,在第二步中,所有3个最相似的用户都没有给第5本书打分。

    你知道是什么原因导致了这种差异吗?
  • jacobcybulskijacobcybulski 委员、大学教授职位:391独角兽
    2021年1月编辑
    我相信你有很好的理由使用推荐扩展,但如果它没有给你需要的东西,也许你可以简单地使用k-NN,如果这是你正在使用的推荐模型,它会在一次点击中返回你需要的所有信息。

    然而,如果你决定使用两个k- nn的两步解决方案,一个用于推荐,另一个用于识别可能的推荐者,那么你得到的差异可能是由于几个问题。

    (1)似乎最初的k-NN使用欧几里得度量,后来的k-NN依赖于余弦度量,这两个度量是非常不同的(如果你要测量两颗恒星之间的相似性,第一个测量每颗恒星与观察者之间的物理距离,而后者测量观察者眼中两颗恒星之间的角距离)。因此,如果你使用不同的相似度测量方法,你最终会得到不同的最近邻居——我认为这解释了你的结果。

    (2)假设两个k- nn使用相同的相似性度量。如果在几个可能的答案之间存在混淆,您可以决定在后一种情况下使用1-NN来为您的推荐人获得最佳匹配。

    (3)也有可能有几个邻居到你的解的距离相同,并且可能返回一个随机的等距离邻居,而不是两个模型都相同。

    (4)也有可能你在两个模型中得到不同的答案,因为模型可能会进行不同的预处理步骤,例如消除缺失值,将标称值转换为数值或值的规范化/标准化。因此,如果两者都有任何可用的预处理选项,请关闭它们并手动进行预处理。

    请注意,在系统中使用k-NN测量距离的典型过程(不像RapidMiner返回邻居推荐的可能性)是首先创建k-NN模型,然后将其应用于训练集以返回可能性测量(通常单独出现)。
  • jacobcybulskijacobcybulski 委员、大学教授职位:391独角兽
    我怀疑推荐器中的k-NN使用了混合度量,因为你的数据是数值属性和名义属性的混合。
  • RionArisuRionArisu 成员职位:13贡献我
    非常感谢你的见解。
    从“用户k-NN”的描述来看,它似乎也在使用余弦相似度。我对两者都使用了相同的预处理步骤,除了在将数据提供给“k-NN”时还有一个额外的步骤(枢轴数据)。但是,尽管如此,我理解你的观点,即使其他步骤相同,(3)仍然可能发生。

    如果我想从头开始构建一个基于用户的协同过滤推荐系统,以对齐两个结果(推荐和最近邻居),这是要遵循的步骤吗?或者有没有更简单的方法?
    步骤1。使用k-nn或余弦相似算子为每个用户找出最接近的邻居
    步骤2。循环所有用户,对于所有未被每个用户评价的物品,计算其邻居评价的平均分
    步骤3。循环所有用户,从步骤2的结果中选择得分最高的项目

    P / S:
    我使用“用户k-NN”扩展的关键原因是它能够直接提供推荐结果(步骤3),而使用“k-NN”只会提供最相似用户的结果(步骤1)。然而在我的情况下,两个结果都是必需的。
登录注册置评。