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

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

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

给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。
在这里插入图片描述

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

在这里插入图片描述

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"))

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

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

好的,基于用户协同过滤算法可以分为以下几个步骤: 1. 数据处理,将用户和物品转化为数字标识,如1、2、3、4等。 2. 构建用户-物品评分矩阵,即将用户对物品的评分存储到一个矩阵中。 3. 计算用户之间的相似度,可以使用余弦相似度或皮尔逊相关系数等。 4. 预测用户对未评分物品的评分,计算方法为:对于用户u和物品i,找出与u最相似的k个用户,计算这k个用户对i的评分的加权平均值,权重为相似度。 5. 推荐物品,根据预测的评分值对用户推荐物品。 下面是一个简单的基于用户协同过滤算法实现: ```python import numpy as np # 原始评分矩阵 R = np.array([ [5, 3, 0, 1], [4, 0, 0, 1], [1, 1, 0, 5], [1, 0, 0, 4], [0, 1, 5, 4], ]) # 用户相似度矩阵 sim_matrix = np.zeros((R.shape[0], R.shape[0])) for i in range(R.shape[0]): for j in range(i+1, R.shape[0]): # 计算余弦相似度 sim_matrix[i, j] = np.dot(R[i], R[j]) / (np.linalg.norm(R[i]) * np.linalg.norm(R[j])) sim_matrix[j, i] = sim_matrix[i, j] # 预测用户对未评分物品的评分 def predict(u, i, k=3): # 找出与u最相似的k个用户 sim_users = np.argsort(-sim_matrix[u])[:k] # 计算加权平均值 rating = np.dot(sim_matrix[u][sim_users], R[sim_users, i]) / np.sum(sim_matrix[u][sim_users]) return rating # 推荐物品 def recommend(u, k=3): # 找出用户u未评分的物品 unrated_items = np.where(R[u] == 0)[0] # 预测用户对未评分物品的评分 ratings = [predict(u, i, k) for i in unrated_items] # 对预测评分排序,推荐评分最高的物品 recommended_item = unrated_items[np.argmax(ratings)] return recommended_item # 测试推荐结果 print(recommend(0, 3)) ``` 这里的数据是一个5x4的评分矩阵,其中5个用户对4个物品进行评分。首先计算用户之间的相似度,然后对于每个用户,预测他对未评分物品的评分,最后推荐评分最高的物品。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tong_brickmoving

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值