推薦引擎之Mahout 基於用戶協同過濾算法的使用

本文目的: 介紹一種常見推薦算法(用戶協同過濾)的使用。

應用場景: XXX項目運行一段時間後,系統中將會存在很多視頻信息, 而通常 APP 給用戶推送的消息(1-3條/每天),

那麼這就需要我們根據用戶的行爲特徵,進行更爲有效的推送。 

工具介紹:mahout 協同過濾算法的使用, 下面將分別介紹 基於布爾型喜好值,數字喜好值, 

以及jdbc dada model.

測試代碼:

/**
 * 
 * 基於用戶近鄰協同過濾推薦算法,
 * 本文目的:針對xxx後續廣告推薦算法,提供一些算法模型的參考
 * 
 * @版權所有:來誼金融 版權所有 (c) 2015
 * @author feihu.wang
 * @version Revision 1.0.0
 * @see:
 * @創建日期:2015年5月18日
 * @功能說明:
 *
 */
public class CfTest {
    public static void main(String[] args) {

        try {
            testBooleanPreference();
            System.out.println("-------------------");
            testMysqlDataModel();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * 
     * 基於帶喜好值的協同過濾算法.
     * 
     * @throws Exception
     * @author feihu.wang
     * @since 2015年5月29日
     */
    public static void test() throws Exception {

        DataModel model = new FileDataModel(new File("E:\\projects\\code\\mahout_test\\pref.csv"));

        //用戶相識度 :皮爾森相關性相視度
        //UserSimilarity sim = new PearsonCorrelationSimilarity(model);

        //用戶相識度 :歐式距離
        UserSimilarity sim = new EuclideanDistanceSimilarity(model);

        // 最近鄰算法
        UserNeighborhood nbh = new NearestNUserNeighborhood(2, sim, model);

        // 生成推薦引擎  : 基於用戶的協同過濾算法, 
        //還有基於物品的過濾算法,mahout 下面已經有很多實現
        Recommender rec = new GenericUserBasedRecommender(model, nbh, sim);

        // 爲用戶ID(1)推薦物品(數量2個)  
        List<RecommendedItem> recItemList = rec.recommend(1, 2);

        for (RecommendedItem item : recItemList) {
            System.out.println(item);
        }
    }
    
    /**
     * 
     * 基於布爾類型的喜好值.
     * 
     * @throws Exception
     * @author feihu.wang
     * @since 2015年5月29日
     */
    public static void testBooleanPreference() throws Exception {
        DataModel dataModel = new FileDataModel(new File("E:\\projects\\code\\mahout_test\\data_nopref.csv"));

        //用戶相識度 :皮爾森相關性相視度
        //UserSimilarity sim = new PearsonCorrelationSimilarity(model);

        //用戶相識度 :歐式距離
        UserSimilarity sim = new LogLikelihoodSimilarity(dataModel);

        // 最近鄰算法
        UserNeighborhood nbh = new NearestNUserNeighborhood(2, sim, dataModel);

        // 生成推薦引擎  : 基於用戶的協同過濾算法, 
        //還有基於物品的過濾算法,mahout 下面已經有很多實現
        //Recommender rec = new GenericUserBasedRecommender(model, nbh, sim);  

        Recommender rec = new GenericBooleanPrefUserBasedRecommender(dataModel, nbh, sim);

        // 爲用戶ID(1)推薦物品(數量2個)  
        List<RecommendedItem> recItemList = rec.recommend(1, 3);

        for (RecommendedItem item : recItemList) {
            System.out.println(item);
        }
    }

    /**
     * 
     * 基於mysql 的data model.
     * 
     * @throws Exception
     * @author feihu.wang
     * @since 2015年5月29日
     */
    public static void testMysqlDataModel() throws Exception {
        MysqlDataSource dataSource = new MysqlDataSource();
        dataSource.setServerName("localhost");
        dataSource.setUser("root");
        dataSource.setPassword("123456");
        dataSource.setDatabaseName("mahout");

        DataModel model = new MySQLJDBCDataModel(dataSource, "prefs", "USER_ID", "ITEM_ID", "SCORE", "CREATETIME");

        UserSimilarity similarity = new LogLikelihoodSimilarity(model);
        UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);

        Recommender recommender = new GenericBooleanPrefUserBasedRecommender(model, neighborhood, similarity);

        List<RecommendedItem> recommendations = recommender.recommend(1, 3);
        for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
        }
    }
    


    public static FastByIDMap<FastIDSet> toDataMap(DataModel dataModel) throws TasteException {
        FastByIDMap<FastIDSet> data = new FastByIDMap<FastIDSet>(dataModel.getNumUsers());
        LongPrimitiveIterator it = dataModel.getUserIDs();
        while (it.hasNext()) {
            long userID = it.nextLong();
            data.put(userID, dataModel.getItemIDsFromUser(userID));
        }
        return data;
    }


}

測試數據:

1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0

 

pom 依賴:

<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-math</artifactId>
<version>0.9</version>
</dependency>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章