基于用户 的协同过滤算法

news/2024/7/24 9:08:20 标签: 推荐系统, 协同过滤, python, 算法

计算用户相似度和用户对未知物品的可能评分

基于用户的协同过滤算法主要包括两个步骤。
(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

例如现在有A、B、C、D四个用户,分别对a、b、c、d、e五个物品表达了自己喜好程度(通过评分高低来表现自己的偏好程度高低),现在要为C用户推荐物品:
1、构建用户物品评分表
在这里插入图片描述

2、相似度计算
计算用户相似度的方法很多,这里选用余弦相似度
在这里插入图片描述

给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。

在这里插入图片描述

可以看出D用户与C用户相似度最大。
3、计算推荐结果
用户C评分的物品是b和e,下面计算用户C对物品a,c,d的偏好程度:
在这里插入图片描述
参考代码:

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

spyder实验结果:

{'a': 2.8577380332470415, 'c': 1.8371173070873839, 'd': 4.286607049870562}
注:计算C和A之间的相似度(未经过one-hot编码得出的结果,经过one-hot编码得出的结果与实际数据一致)
python">import math
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from scipy.spatial.distance import cosine

data1 = {
    "a":{"A":3.0,"B":4.0,"C":0.0,"D":0.0},
    "b":{"A":4.0,"B":0.0,"C":3.5,"D":4.0},
    "c":{"A":0.0,"B":4.5,"C":0.0,"D":0.0},
    "d":{"A":3.5,"B":0.0,"C":0.0,"D":3.5},
    "e":{"A":0.0,"B":3.5,"C":3.0,"D":3.0}
}
data2 = pd.DataFrame(data1)

x = data2.loc['A',:]
y = data2.loc['C',:]
x = np.mat([x])
y = np.mat([y])
x,y

cosine_similarity(x,y)

1 - cosine(data2.loc['A',:],data2.loc['C',:])

http://www.niftyadmin.cn/n/1523930.html

相关文章

中国式悲剧:家长一心当猪,却要望子成龙

http://hot.163.com/group/123zx/post/8885600040993327/?_fr_163_sy 1. 不止一次听到年轻人的抱怨&#xff0c;抱怨他们父母极端自私。 也不止一次听到父母们的抱怨&#xff0c;抱怨现在的孩子没有感恩心&#xff0c;太自私。 到底谁是谁非&#xff0c;谁更自私呢&#xff1f…

三岁小孩吃后身亡,这东西太多了!吃它的禁忌你一定得知道!

http://e.163.com/?docidB5B8LKRQ051480KF#detail/23/B5D3G9O20526865U

漫谈图形计算中的材质系统

通用材质系统介绍 材质系统是一个实时渲染引擎非常重要的部分&#xff0c;它使得开发者能够非常便捷地设计出具有真实感的场景和角色。一个好的材质系统可以提高引擎的易用性&#xff0c;并可以方便的扩展渲染效果&#xff0c;来提升渲染质量和效率。 材质系统需求 图形引擎…

最值得爸爸妈妈学习的儿童教育书籍推荐

http://www.360doc.com/content/14/1208/22/15843838_431410801.shtml# 阅读妈妈有力量~妈妈必读的亲子教育经典书目 http://www.360doc.com/content/14/0707/23/17132703_392740159.shtml 窗边的小豆豆 http://lebo.baidu.com/album/7153943?start40&limit20&sort…

钱已付,货没发?应用内支付0掉单处理方法了解一下!

什么是掉单&#xff1f; 掉单&#xff0c;就是钱付了&#xff0c;货没发。 当用户拉起应用内支付&#xff0c;购买应用中提供的虚拟商品或服务时&#xff0c;由于网络错误、进程被中止等原因&#xff0c;导致应用与支付服务器之间数据同步出现差错&#xff0c;使得用户付款后…

Tomcat 原理(1)(2)

http://xifeng91.iteye.com/blog/260730#bc2028109 http://xifeng91.iteye.com/blog/260752 1 - Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servlet container. (Singleton) 1.2 - Service A Service element represents th…

如何用机器学习识别猫叫和狗叫声?

在一些应用项目开发的过程中&#xff0c;有时需要用到语音检测的功能&#xff0c;即识别敲门声、门铃声、汽车喇叭声等功能&#xff0c;对于中小开发者来说&#xff0c;单独开发构建该能力&#xff0c;不免耗时耗力&#xff0c;而华为机器学习服务中的声音识别服务SDK&#xff…

Cordova插件如何实现JavaScript与Java的通信

背景 Cordova平台是开源的跨平台开发框架&#xff0c;被广泛应用于移动应用开发领域&#xff0c;可以开发跨安卓、iOS等系统的应用。Cordova平台是基于HTML/JavaScript语言&#xff0c;它是如何在不同平台上能够运行并实现相应功能的呢&#xff1f;这里就用到了Cordova提供的丰…