2011-10-19 43 views
1

我使用Mahout的EuclideanDistanceSimilarity類對給定以下用戶偏好數據集的幾個用戶的相似度進行排名。偏好的範圍目前是從1到5的所有整數。但是我控制了規模,所以如果它有幫助就可以改變。Apache Mahout + Euclidean距離:意外結果

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的偏好與用戶不相同,爲什麼我的相似度爲1.0?

如果歐幾里得不起作用,我願意使用不同的算法,但皮爾遜不適用於我,因爲我需要處理爲每個項目提交相同首選項的用戶,而且我不想糾正「通貨膨脹「。

回答

1

這有點奇怪,但我可以解釋發生了什麼。

歐幾里得距離d不能直接用作相似性度量,因爲它的「相似度越小」越大。你可以使用1/d,但是完美匹配會導致無窮大,而不是1.你可以使用1 /(1 + d)。

問題是距離只能計算在兩個用戶有共同的維度上。更多維度通常意味着更多的距離所以這是懲罰重疊,與你所期望的相反。

所以公式實際上是n /(1 + d),其中n是重疊維數。這導致大於1的相似性,在某些情況下,相似性被限制爲1。

n不是正確的因素。這是一個古老的簡單kludge。我會在郵件列表上詢問正確的表達方式。對於大數據,這往往工作確定。

+0

重疊的變化不應該成爲問題,我們試圖通過他們對幾個需要的配置文件問題的答案來匹配用戶,因此每個用戶都應該對同一組「項目」有偏好。另一方面,EuclideanDistanceSimilarity的javadocs(http://javasourcecode.org/html/open-source/mahout/mahout-0.5/index.html?org/apache/mahout/cf/taste/impl/similarity/GenericUserSimilarity.html )說:「相似性然後計算爲1 /(1 +距離),因此得到的值在範圍(0,1],」所以如果n = 1,大於1的相似性不應該是正確的? – 10GritSandpaper

+0

實際上文檔是錯誤的,因此值可能大於1,所以被封頂。我認爲更像sqrt(n)的因素是適當的。在這裏變化不起作用,是的;我是隻是解釋了爲什麼你會看到1.0這種明顯很高的相似性 –

+0

謝謝你的解釋,因此相似度超過1.0的概率隨着維數與偏好範圍的比值增加而增加。偏好值統一爲10和100的因子;而這似乎氾濫,我只得到1.0現在進行相同的比賽。如果是這樣的話,那麼我應該能夠通過擴大偏好範圍來解決我的問題。這看起來是否正確? – 10GritSandpaper