基于协同过滤算法的图书推荐系统,通过计算皮尔逊相关系数,获取用户之间的相关系数,确定近邻用户,从而推荐用户感兴趣的图书。
源代码和配套文档领取加文章最下方的名片哦~
项目介绍视频:基于协同过滤算法的图书推荐系统,毕业设计真的可以这么简单!!!_哔哩哔哩_bilibili
协同过滤算法讲解视频:基于用户协同过滤算法讲解与演示_哔哩哔哩_bilibili
一、协同过滤算法
两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
![](https://img-blog.csdnimg.cn/img_convert/278a885de506df68aee3fe8dc70fb15f.png)
上式定义了总体相关系数,常用希腊小写字母
作为代表符号。估算样本的协方差和标准差,可得到皮尔逊相关系数,常用英文小写字母代表:
![](https://img-blog.csdnimg.cn/img_convert/8018fa5afeafee51c586bff2112468e3.png)
![](https://img-blog.csdnimg.cn/img_convert/8afb70724290c52f23ebb016c66e750b.png)
总体和样本皮尔逊系数的绝对值小于或等于1。如果样本数据点精确的落在直线上(计算样本皮尔逊系数的情况),或者双变量分布完全在直线上(计算总体皮尔逊系数的情况),则相关系数等于1或-1
二、系统演示
![](https://img-blog.csdnimg.cn/img_convert/a36bff7eb0363d90fbbcd12a8c5613f6.png)
![](https://img-blog.csdnimg.cn/img_convert/1cd05b793c2efc6d0c5f845221d08199.png)
![](https://img-blog.csdnimg.cn/img_convert/0d791cfc2f71f6fd9a516e565e326573.png)
![](https://img-blog.csdnimg.cn/img_convert/5c639a98a881550b1bb0b829a8f5fe8b.png)
![](https://img-blog.csdnimg.cn/img_convert/72bdec300dcbec191456df3b82ebab64.png)
![](https://img-blog.csdnimg.cn/img_convert/8d211c729c8a5cc0aae5577c4b50092f.png)
![](https://img-blog.csdnimg.cn/img_convert/63932646bf7839c2808b9db3563d7fb3.png)
算法核心代码:
public List<RecommendedItem> userBasedRecommender(long userID,int size) {
// step:1 构建模型 2 计算相似度 3 查找k紧邻 4 构造推荐引擎
List<RecommendedItem> recommendations = null;
try {
Class.forName("com.mysql.jdbc.Driver");
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName("localhost");//本地为localhost
dataSource.setPort(3308);
dataSource.setUser("root");
dataSource.setPassword("");
dataSource.setDatabaseName("bookstorm");//数据库名
DataModel dataModel=new MySQLJDBCDataModel(dataSource,"score_book","user_id","book_id","score","time");
//*/ File modelFile = new File("D:\\01-bus\\项目资源\\01_计算机软件专业\\1063-图书推荐系统\\01-源代码\\BookRecommend-master\\bookStore_new\\ratings1.csv");
// //System.out.println(modelFile);
// DataModel model = new FileDataModel(modelFile);//构造数据模型
//UserSimilarity similarity1=new UncenteredCosineSimilarity(model);
UserSimilarity similarity = new PearsonCorrelationSimilarity(dataModel);//用PearsonCorrelation 算法计算用户相似度
UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, similarity, dataModel);//计算用户的“邻居”,这里将与该用户最近距离为 3 的用户设置为该用户的“邻居”。
Recommender recommender = new CachingRecommender(new GenericUserBasedRecommender(dataModel, neighborhood, similarity));//采用 CachingRecommender 为 RecommendationItem 进行缓存
recommendations = recommender.recommend(userID, size);//得到推荐的结果,size是推荐结果的数目
System.out.println("recommendations="+JSON.toJSONString(recommendations));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return recommendations;
}