Mahout - 推薦系統



本章涵蓋了流行的機器學習技術,稱為推薦系統,其機制以及如何編寫實現 Mahout 推薦系統的應用程式。

推薦系統

您是否曾經想過亞馬遜是如何提出推薦商品列表,以吸引您關注您可能感興趣的特定產品的!

假設您想從亞馬遜購買“Mahout in Action”這本書

Mahout in Action

除了所選產品外,亞馬遜還會顯示相關推薦商品的列表,如下所示。

Items

此類推薦列表是在推薦引擎的幫助下生成的。Mahout 提供了幾種型別的推薦引擎,例如

  • 基於使用者的推薦器,
  • 基於專案的推薦器,以及
  • 其他多種演算法。

Mahout 推薦引擎

Mahout 擁有一個非分散式、非基於 Hadoop 的推薦引擎。您應該傳遞一個包含使用者對商品偏好的文字文件。此引擎的輸出將是特定使用者對其他商品的估計偏好。

示例

考慮一個銷售消費品(如手機、電子產品及其配件)的網站。如果我們想在這樣的網站上實現 Mahout 的功能,那麼我們可以構建一個推薦引擎。此引擎分析使用者的過去購買資料,並根據這些資料推薦新產品。

Mahout 提供以下元件來構建推薦引擎

  • 資料模型 (DataModel)
  • 使用者相似度 (UserSimilarity)
  • 專案相似度 (ItemSimilarity)
  • 使用者鄰域 (UserNeighborhood)
  • 推薦器 (Recommender)

從資料儲存中準備資料模型,並將其作為輸入傳遞給推薦引擎。推薦引擎為特定使用者生成推薦。以下是推薦引擎的架構。

推薦引擎架構

Recommender Engine

使用 Mahout 構建推薦系統

以下是開發簡單推薦系統的步驟

步驟 1:建立 DataModel 物件

PearsonCorrelationSimilarity 類的建構函式需要一個數據模型物件,該物件儲存一個包含產品的使用者、商品和偏好詳細資訊的檔案。以下是示例資料模型檔案

1,00,1.0
1,01,2.0
1,02,5.0
1,03,5.0
1,04,5.0

2,00,1.0
2,01,2.0
2,05,5.0
2,06,4.5
2,02,5.0

3,01,2.5
3,02,5.0
3,03,4.0
3,04,3.0

4,00,5.0
4,01,5.0
4,02,5.0
4,03,0.0

DataModel 物件需要檔案物件,其中包含輸入檔案的路徑。如下所示建立 DataModel 物件。

DataModel datamodel = new FileDataModel(new File("input file"));

步驟 2:建立 UserSimilarity 物件

如下所示,使用 PearsonCorrelationSimilarity 類建立 UserSimilarity 物件

UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);

步驟 3:建立 UserNeighborhood 物件

此物件計算與給定使用者類似的“使用者鄰域”。鄰域有兩種型別

  • NearestNUserNeighborhood - 此類計算一個鄰域,該鄰域包含與給定使用者最近的 n 個使用者。“最近”由給定的 UserSimilarity 定義。

  • ThresholdUserNeighborhood - 此類計算一個鄰域,該鄰域包含所有與給定使用者的相似度達到或超過某個閾值的使用者的相似度。相似度由給定的 UserSimilarity 定義。

這裡我們使用 ThresholdUserNeighborhood 並將偏好限制設定為 3.0。

UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0, similarity, model);

步驟 4:建立 Recommender 物件

建立 UserbasedRecomender 物件。將所有上述建立的物件傳遞給其建構函式,如下所示。

UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

步驟 5:向用戶推薦商品

使用 Recommender 介面的 recommend() 方法向用戶推薦產品。此方法需要兩個引數。第一個表示需要向其傳送推薦的使用者 ID,第二個表示要傳送的推薦數量。以下是 recommender() 方法的用法

List<RecommendedItem> recommendations = recommender.recommend(2, 3);

for (RecommendedItem recommendation : recommendations) {
   System.out.println(recommendation);
 }

示例程式

下面是一個設定推薦的示例程式。為使用者 ID 為 2 的使用者準備推薦。

import java.io.File;
import java.util.List;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;

import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;

import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;

import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class Recommender {
   public static void main(String args[]){
      try{
         //Creating data model
         DataModel datamodel = new FileDataModel(new File("data")); //data
      
         //Creating UserSimilarity object.
         UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);
      
         //Creating UserNeighbourHHood object.
         UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(3.0, usersimilarity, datamodel);
      
         //Create UserRecomender
         UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);
        
         List<RecommendedItem> recommendations = recommender.recommend(2, 3);
			
         for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
         }
      
      }catch(Exception e){}
      
   }
  }

使用以下命令編譯程式

javac Recommender.java
java Recommender

它應該產生以下輸出

RecommendedItem [item:3, value:4.5]
RecommendedItem [item:4, value:4.0]
廣告

© . All rights reserved.