Mahout是Apache Software Foundation(ASF)旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。Mahout包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用Apache Hadoop庫,Mahout可以有效地擴展到云中。 —— 《百度百科》
在 Mahout 實現的機器學習算法
Mahout 實現的機器學習算法
Taste簡介
Taste是Apache Mahout提供的一個協同過濾算法的高效實現,它是一個基于Java實現的可擴展的,高效的推薦引擎。Taste既實現了最基本的基于用戶的和基于內容的推薦算法,同時也提供了擴展接口,使用戶可以方便的定義和實現自己的推薦算法。同時,Taste不僅僅只適用于Java應用程序,它可以作為內部服務器的一個組件以HTTP和Web Service 的形式向外界提供推薦的邏輯。
Taste 由以下組件組成:
- DataModel:DataModel是用戶喜好信息的抽象接口,它的具體實現支持從任意類型的數據源抽取用戶喜好信息。Taste默認提供JDBCDataModel和FileDataModel,分別支持從數據庫和文件中讀取用戶的喜好信息。
- UserSimilarity和ItemSimilarity:UserSimilarity用于定義兩個用戶間的相似度,它是基于協同過濾的推薦引擎的核心部分,可以用來計算用戶的“鄰居”,這里我們將與當前用戶口味相似的用戶稱為他的鄰居。ItemSimilarity類似的,計算內容之間的相似度。
- UserNeighborhood:用于基于用戶相似度的推薦方法中,推薦的內容是基于找到與當前用戶喜好相似的“鄰居用戶”的方式產生的。UserNeighborhood定義了確定鄰居用戶的方法,具體實現一般是基于UserSimilarity計算得到的。
- Recommender:Recommender是推薦引擎的抽象接口,Taste 中的核心組件。程序中,為它提供一個DataModel,它可以計算出對不同用戶的推薦內容。實際應用中,主要使用它的實現類GenericUserBasedRecommender或者GenericItemBasedRecommender,分別實現基于用戶相似度的推薦引擎或者基于內容的推薦引擎。
基于Taste的協同過濾推薦系統
數據準備
隨機模擬一份數據,如圖,為mysql中的一個表,uid代表用戶id,iid代表物品id,score代表用戶打分,也可以直接用二進制文本保存數據:
MySQL中隨機模擬的數據
引入maven包
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
基于用戶的協同過濾代碼(還有基于物品,SlopeOne,SVD的推薦器,代碼雷同,不貼出來了)
package com.example;
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.model.jdbc.MySQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
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.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
public class TestMahout {
public static void main(String[] args) throws Exception {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUseSSL(true);
dataSource.setServerName("your_server_name");
dataSource.setPort(your_port);
dataSource.setUser("your_user_name");
dataSource.setPassword("your_password");
dataSource.setDatabaseName("your_database_name");
JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "your_table_name", "uid", "iid",
"score", "ts");
// 基于文件構建模型
// DataModel dataModel = new FileDataModel(new File("C:\\Users\\l00382753\\Desktop\\test.txt"));
// 相似度計算(皮爾森相似度)
UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);
// 設置相似用戶閾值(或使用NearestNUserNeighborhood)
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1, similarity, dataModel);
// 基于以上數據創建推薦器(這里使用的是基于用戶的推薦,還有GenericItemBasedRecommender等推薦器)
Recommender recommender = new GenericUserBasedRecommender(dataModel, neighborhood, similarity);
// 給用戶推薦物品(這里是給用戶4推薦5個物品)
List<RecommendedItem> recommendItems = recommender.recommend(4, 5);
// 打印結果
for (RecommendedItem recommendedItem : recommendItems) {
System.out.println(recommendedItem);
}
}
}
運行結果
協同過濾結果