Python推荐系统学习笔记(1)------基于用户协同过滤算法的电影推荐系统
本周张老师在课上向我们介绍了推荐系统的相关知识点,推荐系统,顾名思义,就是利用用户的历史数据来预测用户的行为兴趣从而为减少用户的搜寻成本。无论是在日常生活中的商场购物还是在互联网上的x宝购物等时,我们总能发现我们总在被推荐商品,日常我们可能都不会太注意这样子的细节,可能并不能算是特别清楚推荐给我们的东西是否真正符合我们的行为兴趣,本课程,老师带我们从内部出发,发现学习推荐系统的工作流程以及相关基础知识。
通过学习,我知道推荐系统的主要推荐技术包括:①关联规则挖掘;②基于内容的协同过滤;③基于用户的协同过滤;④基于项目的协同过滤;⑤基于模型的协同过滤;⑥混合的推荐技术。这篇文章研究的是基于用户的协同过滤推荐算法及其在电影推荐系统中的应用。
一个完整的推荐系统通常包括收集用户信息的行为记录模块,分析用户喜好的魔模型分析模块和推荐算法模块。在众多的个性化推荐算法中,协同过滤是最成功的算法,协同过滤的出发点是兴趣相近的用户可能会对同样的东西感兴趣;基于用户的协同算法指的是通过研究搜集具有类似偏好或属性的用户数据来主动向用户推荐最需要的资源。因此,只要维护关于用户喜好的数据,从中分析得出具有相似口味的用户,然后根据相似用户的意见来向其推荐商品。
基于用户的协同过滤算法思路:分为三步,分别是①建立用户矩阵模型;②通过用户相似度寻找最近邻居;③产生推荐项目。
上面是我自己的理解↑
下面是根据文章所做的相关的笔记↓
1、用户-项目评分矩阵
2、寻找最近邻居
通过计算目标用户与其他用户之间的相似度,算出与目标用户最相似的“最近邻居”集。该过程分为两步:①首先计算用户之间的相似度,可用皮尔森相关系数、余弦相似性和修正的余弦相似性等度量方法;②根据以下三点来选择“最近邻居”:Ⅰ选择相似度大于设定阈值的用户;Ⅱ选择相似度最大的前K个用户;Ⅲ选择相似度大于预定阈值的K个用户。
余弦相似性
每一个用户的评分都可以看成是n维项目空间上的向量,如果用户没有对项目进行评分,则将用户对该项目的评分设置为0。用户间的相似性通过向量间的余弦夹角来度量。设用户i和用户j在n维项目空间上的评分分别表示为向量i和向量j,则用户i和用户j的相似性sin(i,j)为:其中,分子为两个用户评分向量的内积,分母为两个用户向量模的乘积。
相关相似性
设用户i和用户j共同评分过的项目集合用表示,Iij=Ii∩Ij,则用户i和用户j之间的相似性sin(i,j)通过Pearson相关系数度量:
其中,Rid表示用户i对项目d的评分,R-i表示用户i对所打分项目的平均评分。
3、产生推荐项目
3.1计算方法
其中,NESi指的是最近邻居集。
4、算法的实现
算法流程图
算法代码
# coding = utf-8
# 基于用户的协同过滤推荐算法实现
import random
import math
from operator import itemgetter#用于获取对象的哪些位置的数据
class UserBasedCF():
# 初始化相关参数
def __init__(self):
# 找到与目标用户兴趣相似的20个用户,为其推荐10部电影
self.n_sim_user = 20
self.n_rec_movie = 10
# 将数据集划分为训练集和测试集
self.trainSet = {
}
self.testSet = {
}
# 用户相似度矩阵
self.user_sim_matrix ={
}
self.movie_count = 0
print('Similar usernumber = %d' % self.n_sim_user)
print('Recommneded movienumber = %d' % self.n_rec_movie)
# 读文件得到“用户-电影”数据
def get_dataset(self, filename, pivot=0.75):
trainSet_len = 0
testSet_len = 0
for line in self.load_file(filename)