33. 日月光华 Python数据分析 - 机器学习 - 基于项

2023-08-01  本文已影响0人  薛东弗斯

基于用户的系统过滤:基于用户之间的相似性
基于项目的协同过滤:优于基于用户的协同推荐, 寻找最相似的项目而不是基于相似用户(根据以前看过的内容推荐相似的内容)
用户之间,喜好会有差异

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
上一篇下一篇

猜你喜欢

热点阅读