基于用户的系统过滤:基于用户之间的相似性
基于项目的协同过滤:优于基于用户的协同推荐, 寻找最相似的项目而不是基于相似用户(根据以前看过的内容推荐相似的内容)
用户之间,喜好会有差异
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
data = pd.DataFrame({'U1': [2, None, 1, None, 3],
'U2': [None, 3, None, 4, None],
'U3': [4, None, 5, 4, None],
'U4': [None, 3, None, 4, None],
'U5': [5, None, 4, None, 5]
})
data.index = ['S1', 'S2', 'S3', 'S4', 'S5']
data # 评分矩阵
image.png
目 标:预测 U3 用户对 S5 的评分
方法:寻找与S5最相似的项目/商品
data_center = data.apply(lambda x: x-x.mean(), axis=1) # 基于项目去中心化
data_center
image.png
sim = [] # 存放相似度
for i in range(len(data_center)):
simliarity = cosine_similarity(
# S5位于最后一行,计算每一行与S5的相似度
np.nan_to_num(data.iloc[-1].values).reshape(1, -1),
np.nan_to_num(data.iloc[i].values).reshape(1, -1)
)
sim.append(simliarity)
sim
# [array([[0.79253049]]),
# array([[0.]]),
# array([[0.60864454]]),
# array([[0.]]),
# array([[1.]])]
# U3对物品的评分
rate_u3 = pd.DataFrame({
'rating': data['U3'],
'sim': sim
})
rate_u3 = rate_u3.dropna()
rate_u3
rating sim
# S1 4.0 [[0.792530488475616]]
# S3 5.0 [[0.6086445426287076]]
# S4 4.0 [[0.0]]
rate_u3['sim'] = rate_u3['sim'].map(lambda x:x[0][0])
# 取出最相似的两个物品进行计算,并深度copy
sim_u3 = rate_u3.sort_values('sim', ascending=False)[:2].copy()
sim_u3
# rating sim
# S1 4.0 0.792530
# S3 5.0 0.608645
# 计算预测的评分
(sim_u3.rating*sim_u3.sim).sum()/sim_u3.sim.sum()
# 4.43438152202085
网友评论