简介:
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>