【推荐算法 学习与复现】-- 协同过滤算法族-- UserCF

 基本介绍:

        协同过滤算法(Collaborative Filtering),数据来源一般为用户的行为数据,不包含用户与物品本身特征信息,从物体相似度和用户相似度出发,分为Item-CF和User-Item。为了处理稀疏共现矩阵、增强模型泛化能力,衍生出矩阵分解模型。

(1) 协同过滤

基于近邻的模型,根据用户还是物品分为 User-CF 和 Item-CF

  • User-CF:由行为数据找到相似用户,拿到相似用户的喜好物品作为候选,由用户相似度和其对为物体评分情况排序,对物品打分
  • Item-CF:由行为数据找到相似物品,再根据物品相似度排序,依据相似度和已有评分情况对待评分物品打分
  • 电商系统中,Item-CF更适用,但是两者都存在稀疏向量处理能力差、利用信息有限、推荐结果头部效应明显

相似度计算方式:

  • 余弦相似度
  • 皮尔逊相关系数(使用平均分对各独立评分进行修正,减少用户评分偏置的影响)

用户对当前物品的评价预测计算方法如下:

User-IF下评价预测:

             R_{u,p}=\cfrac{\sum_{s}(w_{u,s}*R_{s,p})}{\sum_sw_{u,s}} ,其中是用户 u 和用户s 的相似度,是用户s 对物品p 的评分

Item-CF下评价预测:

             R_{u,p}=\sum_{h}(w_{p,h}*R_{u,h}),使用物品p与物品h的物品相似度,是用户u对物品h已有的评分

代码复现:

数据下载链接:协同过滤算法族数据示例-深度学习文档类资源-CSDN文库icon-default.png?t=M3C8https://download.csdn.net/download/Big_Huang/85144402

from scipy.stats import pearsonr
import pandas as pd
import numpy as np

class UserCF:
    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), len(self.user_item))), 
                                                index=self.user_item.index, columns=self.user_item.index)

        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 user_id in self.user_item.index:
            for another_user_id in self.user_item.index:
                if user_id != another_user_id:
                    self.similarity_matrix[user_id][another_user_id] = self.__similarScore(self.user_item.loc[user_id], self.user_item.loc[another_user_id])

    def __getTopNSimilarUsers(self, user_name, n=2):
        """ 获得与 user_name 相近的 n 个用户
        """
        return self.similarity_matrix[user_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_users = self.__getTopNSimilarUsers(user_name, n)
        for user in topn_similar_users:
            sum_wr += self.similarity_matrix[user_name][user] * self.user_item[item_name][user]
            sum_w += self.similarity_matrix[user_name][user]
        return sum_wr / sum_w 


userCF = UserCF("data.csv")
score = userCF.recommendScore(1, 'E', 2)
print(score)

参考:

1. 《深度学习推荐系统》

2. https://datawhalechina.github.io/fun-rec/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值