簡介:
Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。Mahout包含許多實現,包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apache Hadoop 庫,Mahout 可以有效地擴展到雲中。
實現:使用Mahout讀取mysql進行推薦
一、基於用戶的協同過濾算法,基於物品的協同過濾算法
/**
* <p>Title: MainRecommand.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2017</p>
* @author lx
* @date 2020年6月28日
* @version 1.0
*/
package com.lx;
import java.io.IOException;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
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.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
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;
/**
* 基於用戶的協同過濾算法,基於物品的協同過濾
* <p>Title: MainRecommand</p>
* <p>Description: </p>
* @author lx
* @date 2020年6月28日
*/
public class MainRecommand {
final static int NEIGHBORHOOD_NUM = 2; //用戶鄰居數量
final static int RECOMMENDER_NUM = 3; //推薦結果個數
public static void main(String[] args) throws IOException,TasteException
{
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setServerName("127.0.0.1");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setDatabaseName("mahout");
JDBCDataModel model=new MySQLJDBCDataModel(dataSource,"rating","userid","movieid","rating", "ratetime");
//基於用戶的協同過濾算法,基於物品的協同過濾算法
UserSimilarity user = new EuclideanDistanceSimilarity(model);
//計算歐式距離,歐式距離來定義相似性,用s=1/(1+d)來表示,範圍在[0,1]之間,值越大,表明d越小,距離越近,則表示相似性越大
NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
//指定用戶鄰居數量
//構建基於用戶的推薦系統
Recommender r = new GenericUserBasedRecommender(model, neighbor, user);
//得到所有用戶的id集合
LongPrimitiveIterator iter = model.getUserIDs();
while(iter.hasNext())
{
long uid = iter.nextLong();
List<RecommendedItem> list = r.recommend(uid,RECOMMENDER_NUM); //獲取推薦結果
System.out.printf("uid:%s",uid);
//遍歷推薦結果
for(RecommendedItem ritem : list)
{
System.out.printf("(%s,%f)",ritem.getItemID(),ritem.getValue());
}
System.out.println();
}
}
}
二、基於物品的協同過濾算法
/**
* <p>Title: MainRecommand.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2017</p>
* @author lx
* @date 2020年6月28日
* @version 1.0
*/
package com.lx;
import java.io.IOException;
import java.util.List;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import com.mysql.cj.jdbc.MysqlDataSource;
/**
* <p>Title: MainRecommand</p>
* <p>Description: </p>
* @author lx
* 基於物品的協同過濾算法
*QQ:1197581932
* @date 2020年6月28日
*/
public class MainRecommand1 {
final static int NEIGHBORHOOD_NUM = 2; //用戶鄰居數量
final static int RECOMMENDER_NUM = 3; //推薦結果個數
public static void main(String[] args) throws IOException,TasteException
{
MysqlDataSource dataSource=new MysqlDataSource();
dataSource.setServerName("127.0.0.1");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setDatabaseName("mahout?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8");
JDBCDataModel model=new MySQLJDBCDataModel(dataSource,"rating","userid","movieid","rating", "ratetime");
ItemSimilarity item = new EuclideanDistanceSimilarity(model);
Recommender r = new GenericItemBasedRecommender(model,item);
LongPrimitiveIterator iter = model.getUserIDs();
while(iter.hasNext())
{
long uid = iter.nextLong();
List<RecommendedItem> list = r.recommend(uid,RECOMMENDER_NUM); //獲取推薦結果
System.out.printf("uid:%s",uid);
//遍歷推薦結果
for(RecommendedItem ritem : list)
{
System.out.printf("(%s,%f)",ritem.getItemID(),ritem.getValue());
}
System.out.println();
}
}
}
三、依賴包
<properties>
<mahout.version>0.9</mahout.version>
<slf4j-log4j12.version>1.7.25</slf4j-log4j12.version>
</properties>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-core</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-integration</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-math</artifactId>
<version>${mahout.version}</version>
</dependency>
<dependency>
<groupId>org.apache.mahout</groupId>
<artifactId>mahout-examples</artifactId>
<version>${mahout.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>