2011-10-19 24 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)); 
     } 
    } 
} 

:私はここで見つけるTestクラスに追加し、次のテストコードを実行すると

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になるのですか?

私はユークリッドがうまくいかない場合は別のアルゴリズムを使用していますが、ピアソンは私のためには機能しません。なぜなら、各アイテムに同じプリファレンスを提出するユーザーを処理する必要があり、グレード違反報告回答日時:

答えて

1

ちょっと変わったですが、何が起こっているのか説明できます。

ユークリッド距離dは、「類似度が低い」ほど大きくなるため、類似度メトリックとして直接使用することはできません。あなたは1/dを使うことができますが、完璧なマッチは1ではなく無限大になります。1 /(1 + d)を使うことができます。

距離が計算できるのは、両方のユーザーが共通する次元以上の場合のみです。より多くの次元は、通常、より多くの距離を意味する。だから、それはあなたが期待するものとは反対のペナルティオーバーラップです。

したがって、数式は実際にはn /(1 + d)です。ここでnは重なりの次元数です。その結果、1より大きい類似度が得られ、これは1にキャップされることもあります。

nは適切な要素ではありません。それは古い単純なクルージです。私はメーリングリストで正しい表現について質問します。大規模なデータの場合、これはうまくいく傾向があります。

+0

重複のバリエーションは問題ではありません。いくつかの必須のプロファイル質問に対する回答によってユーザーを照合しようとしているため、すべてのユーザーは「アイテム」のセットと同じ設定を使用する必要があります。別のノートでは、EuclideanDistanceSimilarity(http://javasourcecode.org/html/open-source/mahout/mahout-0.5/index.html?org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.html)のjavadoc )は、「類似性は1 /(1 +距離)として計算されるので、結果の値は範囲(0,1)にある」と言うので、n = 1の場合、1より大きい類似度は正しくないはずですか? – 10GritSandpaper

+0

docは実際には間違っていて、その結果、値は1以上になる可能性がありますので、sqrt(n)のような要素が適切だと思います。なぜそれほど明らかに高い1.0の類似点が見えるのかを説明してください。 –

+0

ありがとうございました。それで説明します。類似度が1.0を超える可能性は、次元の数と好みの範囲の比で増加します。 10と100の要素で一律に優先度の値;これはパンを外しているようだ。私は1.0今はまったく一致しているそのような場合は、嗜好の範囲を広げて私の問題を解決できるはずです。それは正しいようですか? – 10GritSandpaper