K最近邻居与基于用户的最近邻居

时间:2011-10-12 15:38:51

标签: algorithm

我正在阅读wikipedia上的推荐系统,而“算法”部分似乎暗示K最近邻和基于协作过滤的用户算法是两回事。它是否正确?鉴于我的理解,他们俩都不一样吗?如果没有,它们之间有什么区别?感谢。

3 个答案:

答案 0 :(得分:15)

不完全是。它们是相似的(它们有相同的想法),但它们之间有几个主要的区别。事实上,维基百科上的文章仅描述了实现推荐系统的两种最不同的方式,但是有更多的方法使用这两种方式的想法。

所以这就是我对维基百科文章的理解。

第一种方法(KNN /概况相似性)

首先,KNN不是第一种方法的主要特征。它只是一个在整个集合中查找最近项的算法,因此它也可以用于协同过滤。最重要的想法在于术语“相似性”。要向相关用户推荐某些内容,您会发现他所在社区中有类似个人资料的人。例如,您想在Facebook上为用户John推荐。你看看他的Fb个人资料,然后看看他朋友的个人资料。你找到10个有相似个人资料的人,并检查他们喜欢什么。如果10个人中有8个像新电影一样有类似的配置文件,那么John很可能也喜欢它。

所以,这里有两个要点:

  • 您查看用户的邻居
  • 您衡量个人资料
  • 相似性

维基百科的文章不包括如何找到相似性度量的问题,但有很多方法,包括在配置文件的文本中搜索常用术语,找到最好的朋友(我之间的消息数量,连接图分析等)和许多其他人。

第二种方法(协同过滤)

在第二种方法中,您不需要分析邻域并找到类似的配置文件,但您需要收集用户选择。让我们回想一下Facebook用户John的一个例子。想象一下,我们可以获得所有Fb用户的所有“喜欢”,包括John的用户。使用它们,您可以构建非常大的相关矩阵,其中行是用户ID,列是他们可能“喜欢”的所有可能项目。如果实际“喜欢”某个项目,则当前用户和当前项目的单元格设置为1,否则为0。

使用这样的矩阵(构建或抽象),您可以使用association mining来查找最强大的关联。例如,喜欢“加勒比海盗2”的10000人也喜欢“加勒比海盗3”,但只有500人喜欢“Saw”。所以我们可以假设2集“海盗”之间的联系更强。请注意,我们既没有分析用户,也没有分析电影本身(我们没有考虑电影名称,情节,演员或类似的东西 - 只有“喜欢”)。这是协同过滤相对于基于相似性的方法的主要优点。

最后,为了向用户John推荐电影,你只需迭代他的“喜欢”并找到与当前关联最强的其他项目。

所以,重要的一点是:

  • 您不使用邻域,而是完整所有用户的数据库
  • 您使用人们的选择并找到关联

这两种方法都有其优点和缺点。第一种方法基于人们之间的某种联系(例如Facebook上的朋友),几乎不能用于像亚马逊这样的服务。同时,第二种方法基于所有用户的平均偏好,因此对于具有高度不同优惠的系统而言不是好的选择。

答案 1 :(得分:0)

我将举例说明两种方法:

询问你的朋友相比,这两种方法的区别与询问你的neigbhbours 几乎相同:

  • 协同过滤的2人之间的相似性是 按优先顺序定义你分享
  • K-最近邻居的相似性由距离定义(但是 距离可以与协同过滤相同)

此外,在第一种情况下,您会看到K neighbourgh(这是一个固定号码),在第二种情况下,您会查看所有数据集。

在某些情况下,可以提供比另一种更好的建议:

例如:

如果我想买一台电视,我问我的朋友住在一个大房子里,他会建议我一个大屏幕。但是住在我旁边公寓的邻居会给我一个小小的建议,因为他的公寓里不适合他。 (与我的相似)。 所以我的邻居建议在这种情况下更好。

如果我想买一部电影,我最好的朋友会比我的邻居更明智地给我一个更好的建议。

答案 2 :(得分:0)

k最近邻居算法是更通用算法且与域无关,而基于用户的方法是特定于域的,并且可以被视为k最近邻方法的一个实例。

k个最近邻居方法中,您可以使用特定的相似性度量来确定与某个数据点 x 的k个最接近的数据点。然后,您可以使用该本地社区对 x 的某些(未知)属性进行一些预测,例如,它是class-label(分类)或某个属性值(回归)。数据点和 x 之间的接近度可以使用您定义的任何相似度函数进行测量(例如,欧几里得距离,余弦相似度)。此外,距离 x 较远的点对 x 感兴趣值的预测影响较小。例如,通过一些加权函数,您可以定义 x 附近的数据点的权重,与它们与 x 的距离成反比。直觉是, x 的点越远,对 x 的预测的影响就越小,因为它不太相似。最后,参数 k 确定要为构建该本地邻居而考虑的数据点数。

基于用户的最近邻居 是一种协作过滤方法,来自信息检索(IR)领域。您在问题中使用“基于用户”的事实意味着您引用的是特定域,通常基于某些用户行为,例如用户对哪些电影/产品进行了高评价/购买,以及该人可能会因此而喜欢其他电影。在此域中,丢失多个值的频率更高,例如几乎没有人评级或购买了大多数产品/服务。但是,您可以以等效于k最近邻居方法的方式来实现基于用户的最近邻居算法。再一次,您可以基于某些相似度函数计算 x (用户)与所有其他数据点(用户)之间的相似度,并使用< strong>加权功能。 x和其他数据点的相似性仅在非缺失值上定义,并且可以将k设置为包括所有数据点(但不是必需的)。为了加快计算x的局部邻域的速度,您可以使用诸如 Locality Sensitive Hashing 之类的技术,并且仅使用邻域的一个子集,其中k <<总数据集大小。在实践中,您可能希望预测 x 中的缺失值,表明用户以前从未购买/使用过服务。如果基于x的本地邻域,则预测缺少的值会很高,您可以使用它来向用户宣传该商品。

简而言之,基于用户的方法只是k-最近邻居算法的一个实例,该算法在信息检索的特定域中最常用。