【协同过滤】基于评分物品算法理解
# 导入必要的库
import numpy as np
# 预测用户对物品的评分
# 定义一个函数,输入目标用户和目标物品的ID,返回预测的评分值
def predict_user_rating(user_count,user_id,item_id):
# 创建用户数*用户数的数组
similarity_matrix = np.zeros((user_count, user_count))
numerator = 0 # 分子
denominator = 0 # 分母
# 遍历每一对用户
for i in range(user_count):
for j in range(i+1,user_count):
# 若i不等于j,则计算用户i和用户j的相似度
if i != j:
# 创建一个掩码,用于选择用户i和用户j都评分过的物品
# 每个数组对比每个不同的数组 计算出布尔值数组
# 理解:计算数组之间的掩码,如果大于1 就说明共同评价过同1个物品 接着计算共同评分物品的相似度值
mask = np.logical_and(ratings[i] > 0, ratings[j] > 0)
# 若存在共同评分的物品,则计算余弦相似度
if np.count_nonzero(mask) > 0:
similarity_matrix[i][j] = np.dot(ratings[i][mask], ratings[j][mask]) / (np.linalg.norm(ratings[i][mask]) * np.linalg.norm(ratings[j][mask]))
# 遍历每个用户
for i in range(user_count):
# 若用户i对物品item_id评分过且与目标用户相似度大于0,则考虑该用户对预测评分的贡献
if ratings[i][item_id] > 0 and similarity_matrix[user_id][i] > 0:
numerator += similarity_matrix[user_id][i] * ratings[i][item_id]
denominator += similarity_matrix[user_id][i]
# 若denominator为0,则返回0;否则,返回预测评分值
if denominator == 0:
return 0
else:
return numerator / denominator
if __name__ == '__main__':
# 创建用户评分矩阵
# X个用户对X个物品的评分记录,其中0表示未评分
ratings = np.array([[5, 3, 0, 1], [4, 0, 4, 0], [0, 2, 5, 2], [0, 0, 0, 3],[0, 0, 0, 3]])
user_id = 1
print(predict_user_rating(5,user_id,0))
print(predict_user_rating(5,user_id,1))
print(predict_user_rating(5,user_id,2))
print(predict_user_rating(5,user_id,3))
user_id = 2
print(predict_user_rating(5,user_id,0))
print(predict_user_rating(5,user_id,1))
print(predict_user_rating(5,user_id,2))
print(predict_user_rating(5,user_id,3))
Python全栈(后端、数据分析、脚本、爬虫、EXE客户端) / 前端(WEB,移动,H5) / Linux / SpringBoot / 机器学习