用户相似度计算

协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户 和用户 ,令 表示用户 感兴趣的物品集合,令 为用户 感兴趣的物品集合。那么我们可以通过  公式或者余弦公式来计算用户 , 的相似程度:

假设目前共有4个用户:;共有5个漫威英雄人物:死侍、钢铁侠、美国队长、黑豹、蜘蛛侠。用户与人物之间的爱好程度如下图所示:

建立物品到用户的倒排表,对于每个物品都保存对该物品产生过行为的用户列表。倒排表为喜欢每个物品对应的用户,如下所示:

假设用户 和用户 同时属于倒排表中 个人物对应的用户列表,就有 。从而,可以扫描倒排表中每个物品对应的用户列表,将用户列表中的两两用户对应的 加1,最终就可以得到所有用户之间不为0的稀疏矩阵

用户相似度改进

如果两个用户都喜欢同一个物品,但这不能说明他们兴趣一定相似,比如我们小学的时候基本买过《新华字典》,但是是我们都对这个感兴趣。但如果两个用户都买过《python数据分析与挖掘实战》,那可以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。所以换句话说,两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。因此又提出了如下公式,根据用户行为计算用户的兴趣相似度:

分子中的倒数惩罚了用户和用户共同兴趣列表中热门物品对他们相似度的影响。是对物品有过行为的用户集合,越热门,越大,惩罚越大。

推荐

为用户与用户的相似度,为用户对商品的打分

python实现

import mathclass UserCF:def __init__(self):self.user_score_dict = self.initUserScore()# self.users_sim = self.userSimilarity()# self.users_sim = self.userSimilarityBetter()self.users_sim = self.UserSimilarityBest()# 初始化用户评分数据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:continueu_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# 计算用户之间的相似度,采用优化算法时间复杂度的方法def userSimilarityBetter(self):# 得到每个item被哪些user评价过item_users = dict()for u, items in self.user_score_dict.items():for i in items.keys():item_users.setdefault(i, set())if self.user_score_dict[u][i] > 0:item_users[i].add(u)# 构建倒排表C = dict()N = dict()for i, users in item_users.items():for u in users:N.setdefault(u, 0)N[u] += 1  # 每个商品下用户出现一次就加一次,就是计算每个用户一共购买的商品个数。C.setdefault(u, {})for v in users:C[u].setdefault(v, 0)if u == v:continueC[u][v] += 1print(C)print(N)# 构建相似度矩阵W = dict()for u, related_users in C.items():W.setdefault(u, {})for v, cuv in related_users.items():if u == v:continueW[u].setdefault(v, 0.0)W[u][v] = cuv / math.sqrt(N[u] * N[v])return W# 计算用户之间的相似度,采用惩罚热门商品和优化算法复杂度的算法def UserSimilarityBest(self):# 得到每个item被哪些user评价过item_users = dict()for u, items in self.user_score_dict.items():for i in items.keys():item_users.setdefault(i, set())if self.user_score_dict[u][i] > 0:item_users[i].add(u)# 构建倒排表C = dict()N = dict()for i, users in item_users.items():for u in users:N.setdefault(u, 0)N[u] += 1C.setdefault(u, {})for v in users:C[u].setdefault(v, 0)if u == v:continueC[u][v] += 1 / math.log(1 + len(users))# 构建相似度矩阵W = dict()for u, related_users in C.items():W.setdefault(u, {})for v, cuv in related_users.items():if u == v:continueW[u].setdefault(v, 0.0)W[u][v] = cuv / math.sqrt(N[u] * N[v])return W# 预测用户对item的评分def preUserItemScore(self, userA, item):score = 0.0for 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_dictif __name__ == "__main__":ub = UserCF()print(ub.recommend("C"))

基于用户的协同过滤算法(UserCF)相关推荐

  1. 推荐系统实践(一)----基于用户的协同过滤算法(UserCF)

      随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代.在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情,这 ...

  2. UserCF,基于用户的协同过滤算法

    转载自   UserCF,基于用户的协同过滤算法 UserCF:User  Collaboration   Filter,基于用户的协同过滤 算法核心思想:在一个在线推荐系统中,当用户A需要个性化推荐 ...

  3. [推荐算法]UserCF,基于用户的协同过滤算法

    UserCF:UserCollaborationFilter,基于用户的协同过滤 算法核心思想:在一个在线推荐系统中,当用户A需要个性化推荐时,可以先找到和他有相似兴趣的其它用户,然后把那些用户喜欢的 ...

  4. 基于用户的协同过滤算法详解

    0. 前言 基于领域的推荐算法是推荐系统中最基本的算法,此类算法不仅在学术界得到了深入研究,而且在工业界也得到了广泛地应用.基于领域的推荐算法主要分为两大类:一类是基于用户的协同过滤算法(User B ...

  5. 【推荐系统】{1} —— 基于用户的协同过滤算法

    协同过滤(英语:Collaborative Filtering,简称CF),简单来说是利用某兴趣相投.拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人透过合作的机制给予信息相当程度的回应(如评分) ...

  6. 推荐系统实践----基于用户的协同过滤算法(python代码实现书中案例)

    本文参考项亮的<推荐系统实践>中基于用户的协同过滤算法内容.因其中代码实现部分只有片段,又因本人初学,对python还不是很精通,难免头大.故自己实现了其中的代码,将整个过程走了一遍. 1 ...

  7. 推荐算法——基于用户的协同过滤算法(User-base CF)的java实现

    推荐算法--基于用户的协同过滤算法(User-base CF)的java实现 推荐系统 什么是推荐系统 为什么要有推荐系统 推荐算法 基于用户的协同过滤算法(User-base CF) 算法介绍 代码 ...

  8. 推荐算法概述(基于用户的协同过滤算法、基于物品的协同过滤算法、基于内容的推荐算法)

    "无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程." 目前推 ...

  9. 推荐系统--基于用户的协同过滤算法

    1.         概述 和搜索引擎一样,推荐系统是为了帮助人们更快速的获得对自己有用的信息. 和搜索引擎不同,推荐系统是人们被动的获取,由系统根据用户行为或其他的信息推荐给用户的,儿搜索引擎是用户 ...

最新文章

  1. 试验设计与matlab数据分析 下载,试验设计与MATLAB数据分析(附光盘)
  2. 【数据结构】之基本概念和术语
  3. C++ Boost库简介
  4. Python Hello World入门 - Python零基础入门教程
  5. Freemarker常用技巧
  6. arduino eeg脑电模块_应用深度学习EEGNet来处理脑电信号
  7. -Visual Studio 2010- IntelliTrace(智能跟踪)优化c盘
  8. win7连接远程桌面问题,无法复制文件,无法读取源文件或磁盘
  9. 国产高分系列卫星平台介绍
  10. 泰森多边形算法 java_泰森多边形构建原理
  11. FA-PEG-NHS 叶酸PEG活性酯
  12. (四)JMockit 的API:@Injectable 与 @Mocked的不同--基础篇
  13. 关于centOS无法识别1920*1080分辨率的解决方法
  14. 中文分词语言模型和动态规划
  15. grub无法正常启动的解决方法
  16. 计算雅思成绩C语言,雅思成绩总分其实是这么计算的
  17. Ad Hoc类问题求解案例
  18. 微信群活码以及微信活码防封如何实现技术分享
  19. 互联网晚报 | 4月21日 星期四 | A股三大指数集体跌超2%;以岭药业已成功注册多个连花商标;天津市房协召集多家房企开会...
  20. 8086逻辑移位指令SHL和SHR

热门文章

  1. 测试sleep()和pthread_cond_timewait()之间的区别
  2. 非线性降维(Nonlinear dimensionality reduction)
  3. IDEA连接MySQL数据库并执行SQL语句使用数据
  4. 单片机怎么入门,发展前景如何?
  5. 人工神经网络应用实例,人工神经网络算法实例
  6. wifi已通过硬件开关禁用
  7. Java 攻城狮面试题 06_Spring Cloud 微服务
  8. 安卓手机连接服务器错误怎么修改密码,安卓手机连接云服务器
  9. ldd命令 ubuntu_ldd命令,查看依赖的动态库信息 nm命令可以列出一个函数库文件中的符号表...
  10. webapp开发框架推荐以及优缺点分析【webAPP干货】