1. 程式人生 > >使用Mahout實現推薦系統(一):MySQL資料來源的簡單推薦

使用Mahout實現推薦系統(一):MySQL資料來源的簡單推薦

     最近在做推薦系統,以前從沒接觸過難過,通過查閱,瞭解到一些推薦系統相關的開源框架,對比了下,使用Java開發的Mahout比較適合,通過學習,簡單實現了一些功能,通過這篇文章記錄一下,後續學習到進一步用法還會更新這個系列。

      使用mysql作為資料來源,新建一張使用者行為偏好表ratings,包含四個欄位,使用者id(user_id),商品id(item_id),偏好打分(rating),時間戳(timestamp)。將相關資料存進表中,接下來就可以在專案裡使用mahout。

      首先在pom檔案里加入依賴(前提是一個maven專案,嘿嘿):

<dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout</artifactId>
            <version>0.11.1</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.mahout</groupId>
            <artifactId>mahout-examples</artifactId>
            <version>0.11.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

       使用步驟:

  1. 首先定義資料模型(DataModel),我理解為Mahout的資料來源,這個資料來源包含資料庫操作,可以理解為Mybatis的sessionfactory,MaHout預設提供了較多種DataModel,比如MYSQLJDBCDataModel,用於mysql資料庫的操作,HBaseDataModel,用於hbase資料庫的操作,FileDataModel,用於檔案儲存資料的操作(例如csv),等等。以mysql作為資料來源為例子,程式碼如下:
DataModel dataModel = new MySQLJDBCDataModel(DataSource dataSource, String preferenceTable, String userIDColumn, String itemIDColumn, String preferenceColumn, String timestampColumn);從變數名大致也能猜出來,需要資料來源DataSource、記錄偏好打分的表名、使用者id對應的列名、產品id對應的列名、偏好打分值對應的列名、時間戳對應的列名。
  1. 定義相似度策略(Similarity),分為使用者相似度策略(UserSimilarity)和產品相似度策略()預設提供了幾種實現,比如皮爾斯(PearsonCorrelationSimilarity)、EuclideanDistanceSimilarity,程式碼:UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
需要將上一步定義的DataModel傳進去。
  1. 定義鄰居(UserNeighborhood),所謂鄰居,即具有相似性行為偏好的使用者
UserNeighborhood neighborhood = new NearestNUserNeighborhood(100, userSimilarity, dataModel);需要的引數:鄰居數量、第二步定義的使用者相似度、第一步定義的資料模型
  1. 定義推薦器(Recommender),推薦器有基於使用者的推薦(GenericUserBasedRecommender)和基於商品的推薦(GenericItemBasedRecommender),當然,還有一些其他的推薦
GenericUserBasedRecommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, userSimilarity);需要的引數:資料模型、鄰居、使用者相似度策略
  1. 使用推薦器,根據推薦器不同調用不同的方法,例如GenericUserBasedRecommender基於使用者推薦,通過呼叫recommend(long userID, int howMany)方法,傳入使用者的id以及需要返回的推薦數量。GenericItemBasedRecommender基於商品相似推薦,通過呼叫recommendedBecause(long userID, long itemID, int howMany)方法即可,傳入使用者id,當前瀏覽的商品的id,返回推薦的數目。
至此就可以完成mahout結合資料來源的單機版開發。