本文目的: 介紹一種常見推薦算法(用戶協同過濾)的使用。
應用場景: 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>