python实现基于用户的协同过滤算法一

python实现基于用户的协同过滤算法

基于用户的协同过滤算法主要包括两个步骤。
(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
1、构建用户物品评分表
在这里插入图片描述
2、相似度计算
计算用户相似度的方法很多,这里选用余弦相似度
python实现基于用户的协同过滤算法一_第1张图片

给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。
python实现基于用户的协同过滤算法一_第2张图片

可以看出D用户与C用户相似度最大。
3、计算推荐结果
用户C评分的物品是b和e,下面计算用户C对物品a,c,d的偏好程度:

python实现基于用户的协同过滤算法一_第3张图片

import math

class UserCF:
    def __init__(self):
        self.user_score_dict = self.initUserScore()
        self.users_sim = self.UserSimilarity()

    # 初始化用户评分数据
    def initUserScore(self):
        user_score_dict = {
     "A": {
     "a": 3.0, "b": 4.0, "c": 0.0, "d": 3.5, "e": 0.0},
                           "B": {
     "a": 4.0, "b": 0.0, "c": 4.5, "d": 0.0, "e": 3.5},
                           "C": {
     "a": 0.0, "b": 3.5, "c": 0.0, "d": 0., "e": 3.0},
                           "D": {
     "a": 0.0, "b": 4.0, "c": 0.0, "d": 3.50, "e": 3.0}}
        return user_score_dict

   

 # 计算用户之间的相似度,采用的是遍历每一个用户进行计算
    def UserSimilarity(self):
        W = dict()
        for u in self.user_score_dict.keys():
            W.setdefault(u,{
     })
            for v in self.user_score_dict.keys():
                if u == v:
                    continue
                u_set = set( [key for key in self.user_score_dict[u].keys() if self.user_score_dict[u][key] > 0])
                v_set = set( [key for key in self.user_score_dict[v].keys() if self.user_score_dict[v][key] > 0])
                W[u][v] = float(len(u_set & v_set)) / math.sqrt(len(u_set) * len(v_set))
        return W  

    # 预测用户对item的评分
    def preUserItemScore(self, userA, item):
        score = 0.0
        for user in self.users_sim[userA].keys():
            if user != userA:
                score += self.users_sim[userA][user] * self.user_score_dict[user][item]
        return score

    # 为用户推荐物品
    def recommend(self, userA):
        # 计算userA 未评分item的可能评分
        user_item_score_dict = dict()
        for item in self.user_score_dict[userA].keys():
            if self.user_score_dict[userA][item] <= 0:
                user_item_score_dict[item] = self.preUserItemScore(userA, item)
        return user_item_score_dict

if __name__ == "__main__":
    ub = UserCF()
    print(ub.recommend("C"))

结果:
在这里插入图片描述

本文参考项亮的《推荐系统实践》中基于用户的协同过滤算法内容

你可能感兴趣的:(协同过滤,推荐系统,python)