【问题标题】:Apache Mahout + Euclidean Distance: Unexpected ResultsApache Mahout + 欧几里得距离:意外结果
【发布时间】:2011-10-19 22:44:39
【问题描述】:

在给定以下用户偏好数据集的情况下,我正在使用 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 不适合我,因为我需要处理为每个项目提交相同偏好的用户,并且我不想更正“等级”通货膨胀。”

【问题讨论】:

    标签: mahout euclidean-distance


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 重叠变化不应该成为问题,我们正在尝试通过用户对几个必需的个人资料问题的回答来匹配用户,因此每个用户都应该对完全相同的“项目”集有偏好。另一方面,EuclideanDistanceSimilarity (javasourcecode.org/html/open-source/mahout/mahout-0.5/…) 的 javadocs 说“然后将相似度计算为 1 / (1 + 距离),因此结果值在 (0,1] 范围内”,因此如果 n = 1 , 相似度应该不可能大于 1 吧?
    • 文档实际上是错误的,因此该值可能> 1,因此有上限。我认为更像 sqrt(n) 的因素是合适的。变化在这里不起作用,是的;我只是在解释为什么你看到如此明显的 1.0 相似性。
    • 谢谢,这就解释了。因此,相似度超过 1.0 的概率随着维度数与偏好范围的比率而增加。我做了几个测试,将偏好值均匀地增加了 10 和 100 倍;这似乎成功了。我现在只得到 1.0 相同的比赛。如果是这样的话,那么我应该能够通过扩大偏好范围来解决我的问题。这看起来对吗?
    • 确实如此,但在与更了解的人交谈后,我可能会进一步更改指标。这是一个需要替换的旧启发式方法。例如,似乎 1/(1+d/sqrt(n)) 可能是最好的。那么它永远不会超过 1。
    • PS 我今天将更改提交给 Mahout。
    猜你喜欢
    • 2013-03-02
    • 2015-07-15
    • 2014-02-04
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多