我使用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?
如果歐幾里得不起作用,我願意使用不同的算法,但皮爾遜不適用於我,因爲我需要處理爲每個項目提交相同首選項的用戶,而且我不想糾正「通貨膨脹「。
重疊的變化不應該成爲問題,我們試圖通過他們對幾個需要的配置文件問題的答案來匹配用戶,因此每個用戶都應該對同一組「項目」有偏好。另一方面,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
實際上文檔是錯誤的,因此值可能大於1,所以被封頂。我認爲更像sqrt(n)的因素是適當的。在這裏變化不起作用,是的;我是隻是解釋了爲什麼你會看到1.0這種明顯很高的相似性 –
謝謝你的解釋,因此相似度超過1.0的概率隨着維數與偏好範圍的比值增加而增加。偏好值統一爲10和100的因子;而這似乎氾濫,我只得到1.0現在進行相同的比賽。如果是這樣的話,那麼我應該能夠通過擴大偏好範圍來解決我的問題。這看起來是否正確? – 10GritSandpaper