我正在使用Mahout的EuclideanDistanceSimilarity类对给定以下用户首选项数据集的几个用户的相似性进行排名。偏好的范围目前是从1到5的所有整数。但是我可以控制比例,所以如果有帮助就可以改变。
User Preferences:
Item 1 Item 2 Item 3 Item 4 Item 5 Item 6
1 2 4 3 5 1 2
2 5 1 5 1 5 1
3 1 5 1 5 1 5
4 2 4 3 5 1 2
5 3 3 4 5 2 2
当我运行以下测试代码时,我得到了意想不到的结果,我将其添加到此处的Test类中:http://www.massapi.com/source/mahout-distribution-0.4/core/src/test/java/org/apache/mahout/cf/taste/impl/similarity/EuclideanDistanceSimilarityTest.java.html
@Test
public void testSimple2() throws Exception {
DataModel dataModel = getDataModel(
new long[]{1, 2, 3, 4, 5},
new Double[][]{
{2.0, 4.0, 3.0, 5.0, 1.0, 2.0},
{5.0, 1.0, 5.0, 1.0, 5.0, 1.0},
{1.0, 5.0, 1.0, 5.0, 1.0, 5.0},
{2.0, 4.0, 3.0, 5.0, 1.0, 2.0},
{3.0, 3.0, 4.0, 5.0, 2.0, 2.0},});
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
System.out.println( i + "," + j + ": " + new EuclideanDistanceSimilarity(dataModel).userSimilarity(i, j));
}
}
}
它产生以下结果:
1,1: 1.0
1,2: 0.7129109430106292
1,3: 1.0
1,4: 1.0
1,5: 1.0
2,1: 0.7129109430106292
2,2: 1.0
2,3: 0.5556605665978556
2,4: 0.7129109430106292
2,5: 0.8675434911352263
3,1: 1.0
3,2: 0.5556605665978556
3,3: 1.0
3,4: 1.0
3,5: 0.9683428667784535
4,1: 1.0
4,2: 0.7129109430106292
4,3: 1.0
4,4: 1.0
4,5: 1.0
5,1: 1.0
5,2: 0.8675434911352263
5,3: 0.9683428667784535
5,4: 1.0
5,5: 1.0
请有人帮我理解我在这里做错了什么吗?显然,用户1的偏好与用户3&amp; 5,为什么我得到相似的1.0?
如果Euclidean不起作用,我愿意使用不同的算法,但Pearson不适合我,因为我需要处理为每个项目提交相同偏好的用户,我不想更正“等级”胀“。
答案 0 :(得分:1)
这有点奇怪,但我可以解释发生了什么。
欧几里德距离d不能直接用作相似性度量,因为它随着“相似性较小”而变大。您可以使用1 / d,但完美匹配会产生无穷大,而不是1.您可以使用1 /(1 + d)。
问题是距离只能在两个用户共有的维度上计算。更多尺寸通常意味着更多距离。因此,这是对重叠的惩罚,与你期望的相反。
所以公式实际上是n /(1 + d),其中n是重叠维数。这导致相似度大于1,在某些情况下,其回限为1。
n不是正确的因素。这是一个古老的简单的kludge。我会在邮件列表上询问关于正确表达的内容。对于大数据,这往往可以正常工作。