将不同的相似度组合以建立一个最终的相似度。

8

我对于数据挖掘和推荐系统比较陌生,现在正试图为拥有以下参数的用户构建某种类型的推荐系统:

  • 城市
  • 教育程度
  • 兴趣

为了计算它们之间的相似度,我将应用余弦相似度和离散相似度。例如:

  • 城市:如果 x = y,则 d(x,y) = 0。否则,d(x,y) = 1。
  • 教育程度:我将使用余弦相似度,因为它们在专业或学士学位的名称中出现。
  • 兴趣:用户可以选择一定数量的兴趣并且将根据两个向量计算余弦相似度,如下所示:

1 0 0 1 0 0 ... n
1 1 1 0 1 0 ... n

其中,1 表示兴趣存在,n 是所有兴趣的总数。

我的问题是: 如何以适当的顺序组合这三个相似性?仅仅将它们相加听起来不太聪明,对吧?同时,我也想听听关于我的“新手相似性系统”的意见,哈哈。


有很多方法,你到目前为止读了多少文献? - Has QUIT--Anony-Mousse
2个回答

6
答案并不是固定的,因为这里的答案非常取决于您的输入和问题领域。因此,机器学习的许多工作就是准备好您的输入,这是一门艺术(而不是科学)。我可以给您一些一般性的想法。您有两个问题:将每个项目中的有意义的相似之处提取出来,然后将它们组合起来。

城市相似度听起来很合理,但实际上取决于您的领域。在同一个城市意味着一切,邻近城市一无是处吗?例如,是否在规模相似的城市中有任何意义?在同一个州内呢?如果是的话,您的相似性应该反映出这一点。

教育方面:我理解您为什么要使用余弦相似度,但这并不能解决真正的问题,即处理意义相同但表示不同的标记。您需要"eng"和"engineering"匹配,"ba"和"bachelors"等类似的东西。一旦您准备好这些标记,它可能会得到很好的结果。

兴趣方面:我不认为余弦相似度是最好的选择,在这里尝试使用简单的Tanimoto系数相似度(交集大小除以并集的大小)。

您不能只是将它们加起来,因为我想您仍然希望得到[0,1]范围内的值。您可以对它们进行平均处理。这意味着假设每个输出是直接可比较的,即它们是同一种“单位”。在这里它们不同;例如,并不像它们是概率。

在实践中它可能仍然可以正常工作,也许还可以加权。例如,在这里与具有完全相同兴趣相比,生活在同一个城市很重要。这是真的吗,还是应该更不重要?

您可以尝试测试不同的变化和权重,因为希望您有一些根据历史数据进行测试的方案。我会向您推荐我们的项目Mahout,因为它拥有完整的推荐系统和评估框架。

但是,所有这些解决方案都是hacky和启发式的。我认为您可能需要采取更正式的方法来进行特征编码和相似性。如果您愿意购买一本书并喜欢Mahout,Mahout in Action在聚类章节中涵盖了如何选择和编码特征,然后如何使它们成为一个相似性的好方法。


那么你会如何建议我对所有这些相似之处进行平均处理呢?例如,如果它们的重要性按降序排列,我就无法想象它。 - Leg0
没有排序的概念;您可以根据自己制定的权重计算相似性的加权平均值。 - Sean Owen

1

这是机器学习中的常用技巧。

城市:如果x = y,则d(x,y)= 0。否则,d(x,y)= 1。

我理解为您使用了一种一对K编码方法。很好。

教育:在这里,我将使用余弦相似度,因为单词出现在部门或学士学位的名称中

您也可以在此处使用一对K编码,以生成大小为| V |的向量,其中V是词汇表,即训练数据中的所有单词。

如果您现在规范化兴趣数字,使其始终落在[0,1]范围内,则可以在最终向量之间使用普通的L1(曼哈顿)或L2(欧几里得)距离度量。后者对应于信息检索的余弦相似度度量。

尝试使用L1和L2来决定哪个更好。


谢谢,但是我并不真正理解“one-of-K编码”这个短语。 - Leg0
@Leg0:在评论框中解释有点困难。请查看我的这个问题以获取示例。 - Fred Foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接