1

给定以下用户偏好数据集,我使用 Mahout 的 EuclideanDistanceSimilarity 类对几个用户的相似度进行排名。偏好的范围目前是从 1 到 5 的所有整数(包括 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

当我运行以下测试代码时,我得到了意想不到的结果,我将其添加到此处找到的测试类中: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 和 5 的偏好不同,那么为什么我的相似度为 1.0?

如果 Euclidean 不起作用,我愿意使用不同的算法,但是 Pearson 对我不起作用,因为我需要处理为每个项目提交相同偏好的用户,并且我不想纠正“等级膨胀”。

4

1 回答 1

1

这有点奇怪,但我可以解释发生了什么。

欧几里得距离 d 不能直接用作相似度度量,因为它会随着“相似度降低”而变大。您可以使用 1/d,但完美匹配会导致无穷大,而不是 1。您可以使用 1/(1+d)。

问题是距离只能在两个用户共有的维度上计算。更多的维度通常意味着更多的距离。所以这是惩罚重叠,这与你所期望的相反。

所以公式实际上是 n/(1+d),其中 n 是重叠的维数。这会导致相似度大于 1,在某些情况下会被限制为 1。

n 不是正确的因数。这是一个古老的简单kludge。我会在邮件列表中询问正确的表达方式。对于大数据,这往往可以正常工作。

于 2011-10-19T14:44:39.280 回答