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

 

 基本介绍:

        协同过滤算法(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

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. 《深度学习推荐系统》

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值