用户KNN -如何获取生成推荐的用户ID列表?
以用户图书评价数据集为例:
用户|图书|评分
用户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,两个用户读过同一本书。
因此,事实证明,图书推荐并不总是来自欧几里得距离最短的用户。
用户|图书|评分
用户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,两个用户读过同一本书。
因此,事实证明,图书推荐并不总是来自欧几里得距离最短的用户。
0
答案
P/S:对不起,我之前没有在描述中清楚地提到它是“用户k-NN”,现在已经重新编辑了描述。
我尝试执行以下步骤:
1.使用“用户k- nn”(k=3,未加权)生成推荐
2.在相同的数据集上使用“k- nn”(k=3,不加权,余弦相似度),使用用户列作为标签
然而,在我从步骤2中获得3个具有最高置信度因子的用户之后,似乎我无法与步骤1中生成的结果相匹配。
例如,步骤1向用户1推荐图书5。
然而,在第二步中,所有3个最相似的用户都没有给第5本书打分。
你知道是什么原因导致了这种差异吗?
然而,如果你决定使用两个k- nn的两步解决方案,一个用于推荐,另一个用于识别可能的推荐者,那么你得到的差异可能是由于几个问题。
(1)似乎最初的k-NN使用欧几里得度量,后来的k-NN依赖于余弦度量,这两个度量是非常不同的(如果你要测量两颗恒星之间的相似性,第一个测量每颗恒星与观察者之间的物理距离,而后者测量观察者眼中两颗恒星之间的角距离)。因此,如果你使用不同的相似度测量方法,你最终会得到不同的最近邻居——我认为这解释了你的结果。
(2)假设两个k- nn使用相同的相似性度量。如果在几个可能的答案之间存在混淆,您可以决定在后一种情况下使用1-NN来为您的推荐人获得最佳匹配。
(3)也有可能有几个邻居到你的解的距离相同,并且可能返回一个随机的等距离邻居,而不是两个模型都相同。
(4)也有可能你在两个模型中得到不同的答案,因为模型可能会进行不同的预处理步骤,例如消除缺失值,将标称值转换为数值或值的规范化/标准化。因此,如果两者都有任何可用的预处理选项,请关闭它们并手动进行预处理。
请注意,在系统中使用k-NN测量距离的典型过程(不像RapidMiner返回邻居推荐的可能性)是首先创建k-NN模型,然后将其应用于训练集以返回可能性测量(通常单独出现)。
从“用户k-NN”的描述来看,它似乎也在使用余弦相似度。我对两者都使用了相同的预处理步骤,除了在将数据提供给“k-NN”时还有一个额外的步骤(枢轴数据)。但是,尽管如此,我理解你的观点,即使其他步骤相同,(3)仍然可能发生。
如果我想从头开始构建一个基于用户的协同过滤推荐系统,以对齐两个结果(推荐和最近邻居),这是要遵循的步骤吗?或者有没有更简单的方法?
步骤1。使用k-nn或余弦相似算子为每个用户找出最接近的邻居
步骤2。循环所有用户,对于所有未被每个用户评价的物品,计算其邻居评价的平均分
步骤3。循环所有用户,从步骤2的结果中选择得分最高的项目
P / S:
我使用“用户k-NN”扩展的关键原因是它能够直接提供推荐结果(步骤3),而使用“k-NN”只会提供最相似用户的结果(步骤1)。然而在我的情况下,两个结果都是必需的。