2011-10-19 3 views
1

다음 사용자 환경 설정 데이터가있는 경우 Mahout의 EuclideanDistanceSimilarity 클래스를 사용하여 여러 사용자의 유사성 순위를 매기고 있습니다. 환경 설정의 범위는 현재 모두 1에서 5까지의 정수입니다. 그러나 나는 규모에 대한 통제권을 가지므로 도움이된다면 그것을 바꿀 수 있습니다.Apache Mahout + 유클리드 거리 : 예기치 않은 결과

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 
: 그것은 다음과 같은 결과를 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)); 
     } 
    } 
} 

: 내가 여기에있는 테스트 클래스에 추가 한 다음 테스트 코드를 실행하면

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 

나는 예기치 않은 결과를 얻고있다

누군가 내가 여기서 잘못하고있는 것을 이해할 수 있도록 도와 주시겠습니까? 분명히 사용자 1의 기본 설정은 사용자 3 & 5와 동일하지 않으므로 유사성 때문에 1.0을 얻는 이유는 무엇입니까?

유클리드가 작동하지 않으면 다른 알고리즘을 사용할 수 있습니다. 그러나 각 항목에 대해 동일한 환경 설정을 제출하는 사용자를 처리해야하기 때문에 Pearson이 작동하지 않아 " 급료 인플레이션. "

답변

1

좀 이상하지만 상황을 설명 할 수 있습니다.

유클리드 거리 (유클리드 거리)는 "유사성이 낮아"더 커지기 때문에 유사성 척도로 직접 사용할 수 없습니다. 1/d를 사용할 수 있지만 완벽한 일치는 1이 아니라 무한대가됩니다. 1/(1 + d)를 사용할 수 있습니다.

거리는 두 사용자가 공통으로 갖고있는 차원에 대해서만 계산할 수 있다는 점이 문제입니다. 더 많은 치수는 일반적으로 더 먼 거리를 의미합니다. 그래서 그것은 당신이 기대하는 것의 반대편 인 페널티 겹침입니다.

그래서 공식은 실제로 n/(1 + d)입니다. 여기서 n은 겹치는 차원의 수입니다. 결과적으로 1보다 큰 유사도를 가지게되는데, 이는 1로 제한됩니다.

n은 올바른 요소가 아닙니다. 그것은 오래된 단순한 kludge입니다. 메일 링리스트에서 올바른 표현에 대해 물어볼 것입니다. 대용량 데이터의 경우이 작업은 괜찮습니다.

+0

겹침의 변형은 문제가 아니어야합니다. 사용자가 여러 가지 필수 프로필 질문에 대한 답변으로 사용자를 검색하려고하므로 모든 사용자는 정확하게 동일한 '항목'집합에 대한 환경 설정을 가져야합니다. 또 다른 참고로, EuclideanDistanceSimilarity (http://javasourcecode.org/html/open-source/mahout/mahout-0.5/index.html?org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.html)에 대한 javadocs)는 "유사도가 1/(1 + 거리)로 계산되므로 결과 값이 범위 (0,1)에 있습니다"라고 말합니다. 따라서 n = 1 인 경우 1보다 큰 유사성은 올바르지 않아야합니다. – 10GritSandpaper

+0

의사가 실제로 잘못되어 결과 값이 1보다 커질 수 있습니다. sqrt (n)과 같은 요소가 적절하다고 생각합니다. 변형은 여기에 적용되지 않습니다. 그렇습니다. 단지 왜 그렇게 높은 1.0의 유사점을 보았는지 설명해주십시오. –

+0

고맙습니다. 그 점에 대해 설명해 드리겠습니다. 유사성 확률이 1.0을 초과하면 선호도 범위에 대한 차원 수의 비율이 증가합니다. 10과 100의 요인에 의해 일률적으로 선호도 값; 그리고 이것은 팬 아웃 것 같습니다. 난 단지 1.0 똑같은 성냥 이군. 그렇다면 환경 설정 범위를 확장하여 문제를 해결할 수 있어야합니다. 그게 맞는 것 같니? – 10GritSandpaper

관련 문제