使用eclipse+maven構建簡單的mahout項目

搭建mahout的eclipse環境不難,新建一個maven的quick-start java項目,在pom導入一些mahout的依賴便可,具體過程參考:用Maven構建Mahout項目
想要好好理解清楚,須要好好的研究代碼。例子中關鍵幾項內容解釋java

// DataModel,輸入數據模型,會自動把數據格式化成mahout須要的數據,更復雜格式的數據應該須要處理。
//類裏含有獲取全部user id,item id等等方法
DataModel model = new FileDataModel(new File(file));
// 一個用戶類似度的模型,相似二維數組,這裏使用歐氏距離來計算用戶的類似度。類裏含有查詢某兩個user的類似度。
UserSimilarity user = new EuclideanDistanceSimilarity(model);
// 知道用戶類似度,便可以知道全部用戶的最近鄰居,這裏求前幾個最近鄰居。類裏含有求某個user id的最近鄰居的方法
NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
// 根據最近鄰居看過哪些電影,而當前user沒看過,則能夠推薦給當前用戶某些電影。類裏含有求某用戶推薦幾個電影等等方法。
Recommender r = new GenericUserBasedRecommender(model, neighbor, user);

在使用歐氏距離計算類似度時,有一點點不一樣。
輸入圖片說明
開始理解歐氏距離公式是1 / ( 1 + d ),因而我經過手動計算2個用戶的歐式距離類似度,和程序裏面算得2個用戶的類似度不同(經過user.userSimilarity(1, 2)得到1和2的類似度),因而經過跟蹤代碼開始找緣由:數組

  • 歐氏距離,只算兩個用戶都有的維度,好比對比用戶1和用戶2,維度101,102,103他們都有值,可是1用戶104是沒有值,因此計算用戶1和用戶2的歐氏距離,是不算104這一項的,即(33+0.5.05+2.5*2.5)再開根。
  • 歐式距離在mahout實現中EuclideanDistanceSimilarity,公式有所修改,再也不是理論上的那個公式了,變成了1.0 / (1.0 + Math.sqrt(sumXYdiff2) / Math.sqrt(n)),Math.sqrt(sumXYdiff2)就是(33+0.5.05+2.5*2.5)再開根,這個時候還須要除以維度的開根,這裏維度n=3,後面仔細想了一下,這樣改確實更好一點。若是不改的話,就是維度越多,類似度越小,但這是明顯不對的。
相關文章
相關標籤/搜索