协同过滤算法—MovieLense数据集分析

简介: R的recommenderlab包可以实现协同过滤算法。这个包中有许多关于推荐算法建立、处理及可视化的函数。

R的recommenderlab包可以实现协同过滤算法。这个包中有许多关于推荐算法建立、处理及可视化的函数。


本文任务:选用recommenderlab包中内置的MovieLense数据集进行分析,该数据集收集了网站MovieLens(movielens.umn.edu)从1997年9月19日到1998年4月22日的数据,包括943名用户对1664部电影的评分。


library(recommenderlab)library(ggplot2)

02. 数据处理与探索性

data(MovieLense)image(MovieLense)

)ZKA1T44LM)H1~3~1`00L~E.png

# 获取评分ratings.movie <- data.frame(ratings = getRatings(MovieLense))summary(ratings.movie$ratings)
ggplot(ratings.movie, aes(x = ratings)) +   geom_histogram(fill = "beige", color = "black",    binwidth = 1, alpha = 0.7) + xlab("rating") + ylab("count")


FW``I26G03F@(5UP9BIE)D3.png


利用summary()获取评分数据,可知最大值为5,最小值为1,平均值为3.53。并将其柱状图进行绘制,如下所示。

)1XC93KXGWJNOOJ`QIO]6[Q.png


数据标准化:在进行数据分析前,利用normalize()我们将数据进行标准化,并进行绘制。

atings.movie1 <- data.frame(ratings =     getRatings(normalize(MovieLense, method = "Z-score")))summary(ratings.movie1$ratings)##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.##  -4.852  -0.647   0.108   0.000   0.751   4.128ggplot(ratings.movie1, aes(x = ratings)) +   geom_histogram(fill = "beige", color = "black",    alpha = 0.7) + xlab("rating") + ylab("count")


用户的电影点评数:我们还对用户的电影点评数进行描述性分析,具体结果如下所示。

movie.count <- data.frame(count = rowCounts(MovieLense))ggplot(movie.count, aes(x = count)) +   geom_histogram(fill = "beige", color = "black",    alpha = 0.7) + xlab("counts of users") + ylab("counts of movies rated")


rating.mean <- data.frame(rating = colMeans(MovieLense))ggplot(rating.mean, aes(x = rating)) +   geom_histogram(fill = "beige", color = "black",    alpha = 0.7) + xlab("rating") + ylab("counts of movies ")


G6Z%9PAO3Y%DLE]IUE(9[JS.png


03. 建立推荐模型与模型评估

对于realRatingMatrix有六种方法:IBCF(基于物品的推荐)、UBCF(基于用户的推荐)、SVD(矩阵因子化)、PCA(主成分分析)、 RANDOM(随机推荐)、POPULAR(基于流行度的推荐)。


模型评估主要使用:recommenderlab包中自带的评估方案,对应的函数是evaluationScheme,能够设置采用n-fold交叉验证还是简单的training/train分开验证,本文采用后一种方法,即将数据集简单分为training和test,在training训练模型,然后在test上评估。接下来我们使用三种不同技术进行构建推荐系统,并利用评估方案比较三种技术的好坏。

library(recommenderlab)data(MovieLense)scheme <- evaluationScheme(MovieLense, method = "split",  train = 0.9, k = 1,  given = 10, goodRating = 4)algorithms <- list(popular = list(name = "POPULAR",  param = list(normalize = "Z-score")),    ubcf = list(name = "UBCF", param = list(normalize = "Z-score",      method = "Cosine",nn = 25, minRating = 3)),  ibcf = list(name = "IBCF", param = list(normalize = "Z-score")))results <- evaluate(scheme, algorithms, n = c(1, 3, 5, 10, 15, 20))


$49`W@_WD7C]WZF~~GC)C@7.png

plot(results, annotate = 1:3, legend = "topleft") #ROC

image.gif

]PBY~J16F2}MRRP}SN1BKWB.png


plot(results, "prec/rec", annotate = 3)#precision-recall

MW{C[7K604AB(90VV$UNQB3.png

按照评价方案建立推荐模型

model.popular <- Recommender(getData(scheme, "train"), method = "POPULAR")model.ibcf <- Recommender(getData(scheme, "train"), method = "IBCF")model.ubcf <- Recommender(getData(scheme, "train"), method = "UBCF")# 对推荐模型进行预测predict.popular <- predict(model.popular, getData(scheme, "known"), type = "ratings")predict.ibcf <- predict(model.ibcf, getData(scheme, "known"), type = "ratings")predict.ubcf <- predict(model.ubcf, getData(scheme, "known"), type = "ratings")# 做误差的计算predict.err <- rbind(calcPredictionAccuracy(predict.popular,  getData(scheme, "unknown")),calcPredictionAccuracy(predict.ubcf, getData(scheme,    "unknown")), calcPredictionAccuracy(predict.ibcf,getData(scheme, "unknown")))rownames(predict.err) <- c("POPULAR", "UBCF", "IBCF")predict.err



RMSE  MSE  MAE
POPULAR   1.046 1.095  0.8315
UBCF    1.217  1.481  0.9662
IBCF    1.693  2.866  1.2397


通过结果我们可以看到:基于流行度推荐系统对于本案例数据的效果最好,RMSE,MSE,MAE都是三者中的最小值。其次是基于用户的推荐,最后是基于项目协同过滤。

4. 参考资料

1. Recommenderlab包实现电影评分预测(R语言)

2. R语言:recommenderlab包的总结与应用案例

3. recommender system handbook

4. Item-Based Collaborative Filtering Recommendation Algorithms

5. recommenderlab: A Framework for Developing and Testing Recommendation Algorithms

目录
相关文章
|
13天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
41 4
|
11天前
|
机器学习/深度学习 搜索推荐 算法
协同过滤算法
协同过滤算法
45 0
|
11天前
|
机器学习/深度学习 JSON 搜索推荐
深度学习的协同过滤的推荐算法-毕设神器
深度学习的协同过滤的推荐算法-毕设神器
22 4
|
3天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
11 0
|
9天前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
20 0
|
1月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
44 4
|
1月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
29 1
|
1月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
16天前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
21 0
|
1月前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
37 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计