基本介绍:
协同过滤算法(Collaborative Filtering),数据来源一般为用户的行为数据,不包含用户与物品本身特征信息,从物体相似度和用户相似度出发,分为Item-CF和User-Item。为了处理稀疏共现矩阵、增强模型泛化能力,衍生出矩阵分解模型。
(1) 协同过滤
基于近邻的模型,根据用户还是物品分为 User-CF 和 Item-CF
- User-CF:由行为数据找到相似用户,拿到相似用户的喜好物品作为候选,由用户相似度和其对为物体评分情况排序,对物品打分
- Item-CF:由行为数据找到相似物品,再根据物品相似度排序,依据相似度和已有评分情况对待评分物品打分
- 电商系统中,Item-CF更适用,但是两者都存在稀疏向量处理能力差、利用信息有限、推荐结果头部效应明显
相似度计算方式:
- 余弦相似度
- 皮尔逊相关系数(使用平均分对各独立评分进行修正,减少用户评分偏置的影响)
用户对当前物品的评价预测计算方法如下:
User-IF下评价预测:
,其中是用户 u 和用户s 的相似度,是用户s 对物品p 的评分
Item-CF下评价预测:
,使用物品p与物品h的物品相似度,是用户u对物品h已有的评分
代码复现:
数据下载链接:
协同过滤算法族数据示例-深度学习文档类资源-CSDN文库https://download.csdn.net/download/Big_Huang/85144402
import pandas as pd
import numpy as np
from scipy.stats import pearsonr
class ItemCF:
def __init__(self, data_path):
self.user_item = pd.read_csv(data_path, index_col=0)
self.similarity_matrix = pd.DataFrame(np.zeros((len(self.user_item.columns), len(self.user_item.columns))),
index=self.user_item.columns, columns=self.user_item.columns)
for col in list(self.user_item.columns[self.user_item.isnull().sum() > 0]):
mean_val = self.user_item[col].mean()
self.user_item[col].fillna(mean_val, inplace=True)
self.__calcSimilarityMatrix()
def __calcSimilarityMatrix(self):
""" 获得物品相似性矩阵
"""
for item_id in self.user_item.columns:
for another_item_id in self.user_item.columns:
if item_id != another_item_id:
self.similarity_matrix[item_id][another_item_id] = self.__similarScore(self.user_item[item_id], self.user_item[another_item_id])
def __getTopNSimilarItems(self, item_name, n=2):
""" 获得与 item_name 相近的 n 个物品
"""
return self.similarity_matrix[item_name].sort_values(ascending=False)[:n].index.tolist()
def __similarScore(self, vector1, vector2):
""" 计算向量间相似度 (可以根据需要替换)
"""
return pearsonr(vector1, vector2)[0]
def recommendScore(self, user_name, item_name, n=2):
""" 获得 物品item_name 对 用户user_name 的推荐分数 (推荐分数的计算方式可以更改)
Args:
user_name (_type_): 待推荐用户
item_name (_type_): 待推荐物品
n (int, optional): 相近用户数. Defaults to 2.
Returns:
number: 推荐指数
"""
sum_wr = 0
# sum_w = 0
topn_similar_items = self.__getTopNSimilarItems(item_name, n)
for item in topn_similar_items:
sum_wr += self.similarity_matrix[item_name][item] * self.user_item[item][user_name]
# sum_w += self.similarity_matrix[item_name][item]
return sum_wr # / sum_w
userCF = ItemCF("data.csv")
score = userCF.recommendScore(1, 'E', 2)
print(score)
参考:
1. 《深度学习推荐系统》