两种最普遍的推荐系统的类型是基于内容和协同过滤(CF)。协同过滤基于用户对产品的态度产生推荐,基于内容的推荐系统基于物品属性的相似性进行推荐。CF可以分为基于内存的协同过滤和基于模型的协同过滤。

我们将使用MovieLens数据集,它是在实现和测试推荐引擎时所使用的最常见的数据集之一,包含来自943个用户以及精选的1682部电影的评分。数据下载地址

导入numpy和pandas库


import numpy as npimport pandas as pd

读入u.data数据文件


header = ['user_id', 'item_id', 'rating', 'timestamp']df = pd.read_csv('u.data', sep = '\t', names = header)

查看用户和电影的数量


n_users = df.user_id.unique().shape[0]n_items = df.item_id.unique().shape[0]print 'Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items)

Number of users = 943 | Number of movies = 1682

使用scikit-learn库将数据集分割成测试集和训练集,调用Cross_validation.train_test_split根据测试样本的比例(test_size)将数据混洗并分割成两个数据集。


from sklearn import cross_validation as cvtrain_data,test_data = cv.train_test_split(df, test_size = 0.25)

基于内存的协同过滤

基于内存的协同过滤方法可以分为两个部分:用户-产品协同过滤和产品-产品协同过滤。用户-产品协同过滤将选取一个特定的用户,基于打分的相似性发现类似于该用户的用户,并推荐那些相似用户喜欢的产品。产品-产品协同过滤会选取一个产品,发现喜欢该产品的用户,并找到这些相似用户还喜欢的其它产品。

用户-产品协同过滤:“喜欢这东西的人也喜欢……”

产品-产品协同过滤:“像你一样的人也喜欢……”

在这两种情况下,从整个数据集构建一个用户产品矩阵。

用户产品矩阵的例子:

计算相似性,并创建一个相似性矩阵。

在产品-产品协同过滤中的产品之间的相似性是通过观察所有对两个产品打分的用户来度量的。

在用户-产品协同过滤中的用户之间的相似性是通过观察所有同时被两个用户打分的产品来度量的。

通常用于推荐系统中的距离矩阵是余弦相似性,其中,打分被看成n维空间中的向量,而相似性是基于这些向量之间的角度进行计算的。用户a和m的余弦相似性可以用下面的公式进行计算:

image

要计算产品m和b之间的相似性,使用公式:

image

创建用户产品矩阵,针对测试数据和训练数据,创建两个矩阵:


train_data_matrix = np.zeros((n_users,n_items))for line in train_data.itertuples():train_data_matrix[line[1]-1, line[2]-1] = line[3]test_data_matrix = np.zeros((n_users, n_items))for line in test_data.itertuples():test_data_matrix[line[1]-1, line[2]-1] = line[3]

使用sklearn的pairwise_distances函数来计算余弦相似性。


from sklearn.metrics.pairwise import pairwise_distancesuser_similarity = pairwise_distances(train_data_matrix, metric = "cosine")item_similarity = pairwise_distances(train_data_matrix.T, metric = "cosine")

已经创建了相似性矩阵:user_similarity和item_similarity,因此,可以通过基于用户的CF应用下面的公式做出预测:

可以将用户k和用户a之间的相似性看成权重,乘以相似用户a(校正的平均评分用户)的评分,这里需要规范化该值,使得打分位于1到5之间,最后对尝试预测的用户的平均评分求和。

基于产品的CF应用下面的公司进行预测,此时无需纠正用户的平均打分


def predict(rating, similarity, type = 'user'):if type == 'user':mean_user_rating = rating.mean(axis = 1)rating_diff = (rating - mean_user_rating[:,np.newaxis])pred = mean_user_rating[:,np.newaxis] + similarity.dot(rating_diff) / np.array([np.abs(similarity).sum(axis=1)]).Telif type == 'item':pred = rating.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])return pred

item_prediction = predict(train_data_matrix, item_similarity, type = 'item')user_prediction = predict(train_data_matrix, user_similarity, type = 'user')

评估

这里采用均方根误差(RMSE)来度量预测评分的准确性

可以使用sklearn的mean_square_error(MSE)函数,其中RMSE仅仅是MSE的平方根。


from sklearn.metrics import mean_squared_errorfrom math import sqrtdef rmse(prediction, ground_truth):prediction = prediction[ground_truth.nonzero()].flatten()ground_truth = ground_truth[ground_truth.nonzero()].flatten()return sqrt(mean_squared_error(prediction, ground_truth))

print 'User based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix))print 'Item based CF RMSe: ' + str(rmse(item_prediction, test_data_matrix))

User based CF RMSE: 3.12466203536Item based CF RMSe: 3.45056350625

可以看出,基于内存的算法很容易实现并产生合理的预测质量。

基于模型的协同过滤

基于模型的协同过滤是基于矩阵分解(MF)的,矩阵分解广泛应用于推荐系统中,它比基于内存的CF有更好的扩展性和稀疏性。MF的目标是从已知的评分中学习用户的潜在喜好和产品的潜在属性,随后通过用户和产品的潜在特征的点积来预测未知的评分。

计算MovieLens数据集的稀疏度:


sparsity = round(1.0 - len(df) / float(n_users*n_items),3)print 'The sparsity level of MovieLen100K is ' + str(sparsity * 100) + '%'

The sparsity level of MovieLen100K is 93.7%

SVD

一般的方程可以表示为:

image

给定m * n矩阵X:

U 是一个(m * r)正交矩阵

S 是一个对角线上为非负实数的(r * r)对角矩阵

V^T是一个(r * n)正交矩阵

S的对角线上的元素被称为X的奇异值。

阵X可以被分解成U,S和V。U矩阵表示对应于隐藏特性空间中的用户的特性矩阵,而V矩阵表示对应于隐藏特性空间中的产品的特性矩阵。

现在,可以通过U, S和V^T的点积进行预测了:


import scipy.sparse as spfrom scipy.sparse.linalg import svdsu, s, vt = svds(train_data_matrix, k = 20)s_diag_matrix = np.diag(s)x_pred = np.dot(np.dot(u,s_diag_matrix),vt)print 'User-based CF MSE: ' + str(rmse(x_pred, test_data_matrix))

User-based CF MSE: 2.72035726617

总结:

实现了简单的协同过滤方法,包括基于内存的CF和基于模型的CF

基于内存的模型是基于产品或用户之间的相似性,这里采用余弦相似性。

基于模型的CD是基于矩阵分解,采用SVD来分解矩阵

标准的协同过滤方法在面对冷启动的情况时表现不佳。

作者:Guolz
链接:https://www.jianshu.com/p/ae10bd629f74
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

python3实现推荐算法相关推荐

  1. 【机器学习】 关联规则Apriori和mlxtend——推荐算法

    引入: 啤酒与尿布的故事 关联规律挖掘:从交易数据中发现:买了X 还会买Y 的规则 关联规律挖掘'购物篮分析'Market Basket Analysis(MBA) 关联规律->应用于推荐系统 ...

  2. 融合知识图谱和用户行为信息的个性化推荐算法研究

    来源:< 计算机科学与应用> ,作者程静文等 关键词: 推荐系统:知识图谱:深度神经网络 摘要: 摘要: 针对传统协同过滤存在的稀疏性和冷启动问题,通常使用深度神经网络(DNN)构建融合知 ...

  3. Python+Django+Mysql个性化图书推荐系统 图书在线推荐系统 基于用户、项目、内容的协同过滤推荐算法(带设计报告)

    Python+Django+Mysql个性化图书推荐系统 图书在线推荐系统 基于用户.项目.内容的协同过滤推荐算法 WebBookRSM.Python python实现协同过滤推荐算法实现 源代码下载 ...

  4. Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...

  5. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  6. Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...

  7. 在线电影推荐网 Python+Django+Mysql 协同过滤推荐算法在电影网站中的运用 基于用户、物品的协同过滤推荐算法 开发在线电影推荐系统 电影网站推荐系统 人工智能、大数据、机器学习开发

    在线电影推荐网 Python+Django+Mysql 协同过滤推荐算法在电影网站中的运用 基于用户.物品的协同过滤推荐算法 开发在线电影推荐系统 电影网站推荐系统 人工智能.大数据.机器学习开发 M ...

  8. 在线新闻推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法、机器学习、分布式大数据、人工智

    在线新闻推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法.机器学习.分布式大数据.人工智 ...

  9. 在线图书推荐网 Python+Django+Mysql开发技术 个性化图书推荐系统 协同过滤推荐算法在图书网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智

    在线图书推荐网 Python+Django+Mysql开发技术 个性化图书推荐系统 协同过滤推荐算法在图书网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智 ...

最新文章

  1. python 将列和索引的值变换_【编辑小组成长日记】Python学习第二期
  2. 位移时小心一下运算符的优先级
  3. 选择排序的基本原理及实现
  4. 编程语言中常见数据结构
  5. redis三种架构:主从Cluster哨兵+整合Springboot访问redis
  6. 腾讯极客挑战赛邀你“码上种树”
  7. 他是我们内心世界的一员 (见信息时报2011年7月10日)
  8. Coursera自动驾驶课程第1讲:Welcome to the self-driving cars specialization
  9. 将node.js程序作为服务,并在windows下开机自动启动(使用forever)
  10. 进入路由器boot的方式
  11. 管理中的计算机应用真题,0051管理系统中计算机应用试题历年真题
  12. 日常记录(4)让百度和google收录我们的网站
  13. 【POJ1804】Brainman 【求逆序数】
  14. plc通讯的握手信号_PLC工程师教你:从原理搞懂RS485串口通讯
  15. 知我者,谓我心忧,不知我者,谓我何求。何必说?
  16. 如何修改request的parameter的几种方式
  17. Windows下装MySQL
  18. HEVC AVS2 AV1
  19. CPU大小端模式对C语言底层开发的影响
  20. 高性能计算机系统硬件结构图,硬件资源

热门文章

  1. PAT A级 1076 Forwards on Weibo (超详细BFS做法)
  2. Keil C251条件编译宏的应用实例
  3. 康力源在创业板提交注册:预计全年收入同比下滑,衡墩建持股98%
  4. 6、阿里云OSS对象存储手把手学习及企业使用方案
  5. 联想笔记本电量显示为0
  6. 【建模日记】建模二三事笔记
  7. Git使用——远程库克隆
  8. FPGA的亚稳态跟MTBF
  9. API藏得这么深好么
  10. <聆听的技巧>培训总结