Apache Mahout + евклидово расстояние: неожиданные результаты - PullRequest
1 голос
/ 19 октября 2011

Я использую класс Mahout EuclideanDistanceSimility для ранжирования сходства нескольких пользователей с учетом следующего набора данных пользовательских предпочтений.Диапазон предпочтений в настоящее время все целые числа от 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 и 5, так почему я получаю 1,0 за сходство?

Я открыт для использования другого алгоритма, если евклидов не сработает, однако Пирсон этого не делает.это не работает для меня, потому что мне нужно работать с пользователями, которые представляют одинаковые настройки для каждого элемента, и я не хочу исправлять «инфляцию».

1 Ответ

1 голос
/ 19 октября 2011

Это немного странно, но я могу объяснить, что происходит.

Евклидово расстояние d нельзя напрямую использовать в качестве метрики подобия, поскольку оно становится больше с "меньшим сходством".Вы можете использовать 1 / d, но тогда идеальные совпадения приводят к бесконечности, а не 1. Вы можете использовать 1 / (1 + d).

Проблема в том, что расстояние можно рассчитать только по измерениям, которые оба пользователяиметь общее.Больше размеров обычно означает большее расстояние.Таким образом, это штрафует наложение, противоположное тому, что вы ожидаете.

Таким образом, формула действительно n / (1 + d), где n - число измерений наложения.Это приводит к сходству больше 1, которое в некоторых случаях ограничивается 1.

n не правильный фактор.Это старый простой кладж.Я спрошу в списке рассылки о правильном выражении.Для больших данных это работает нормально.

...