本节讲述推荐系统之协同过滤算法,协同过滤算法包括两类,一种基于用户的协同过滤算法,另外一种基于项的协同过滤算法。
基于用户的协同过滤算法
通过相似用户进行推荐,给用户推荐和他兴趣形似的其他用户喜欢的物品。
算法步骤如下:
1.用户-商品数据转换成用户-商品矩阵;
2.计算用户-商品矩阵中的用户之前的相似度;
3.利用用户之间的相似度为用户中没有打分的项打分;
代码实现如下:
def user_based_recommend(data, w, user):
'''基于用户相似性为用户user推荐商品
input: data(mat):用户商品矩阵
w(mat):用户之间的相似度
user(int):用户的编号
output: predict(list):推荐列表
'''
m, n = np.shape(data)
interaction = data[user, ] # 用户user与商品信息
# 1、找到用户user没有互动过的商品
not_inter = []
for i in range(n):
if interaction[0, i] == 0: # 没有互动的商品
not_inter.append(i)
# 2、对没有互动过的商品进行预测
predict = {}
for x in not_inter:
item = np.copy(data[:, x]) # 找到所有用户对商品x的互动信息
for i in range(m): # 对每一个用户
if item[i, 0] != 0: # 若该用户对商品x有过互动
if x not in predict:
predict[x] = w[user, i] * item[i, 0]
else:
predict[x] = predict[x] + w[user, i] * item[i, 0]
# 3、按照预测的大小从大到小排序
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
基于项的协同过滤算法
通过相似项进行推荐,为用户推荐与其打过分的项相似的项。
算法步骤如下:
1.用户-商品数据转换成商品-用户矩阵;
2.计算商品-用户矩阵中的商品之前的相似度;
3.利用商品之间的相似度为用户中没有打分的项打分;
代码实现如下:
def item_based_recommend(data, w, user):
'''基于商品相似度为用户user推荐商品
input: data(mat):商品用户矩阵
w(mat):商品与商品之间的相似性
user(int):用户的编号
output: predict(list):推荐列表
'''
m, n = np.shape(data) # m:商品数量 n:用户数量
interaction = data[:,user].T # 用户user的互动商品信息
# 1、找到用户user没有互动的商品
not_inter = []
for i in range(n):
if interaction[0, i] == 0: # 用户user未打分项
not_inter.append(i)
# 2、对没有互动过的商品进行预测
predict = {}
for x in not_inter:
item = np.copy(interaction) # 获取用户user对商品的互动信息
for j in range(m): # 对每一个商品
if item[0, j] != 0: # 利用互动过的商品预测
if x not in predict:
predict[x] = w[x, j] * item[0, j]
else:
predict[x] = predict[x] + w[x, j] * item[0, j]
# 按照预测的大小从大到小排序
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
相似度的度量方法有以下三种:
1)欧式距离
2)皮尔逊相关系数
3)余弦相似度