推荐系统-基于userCF推荐模型
来源:互联网 发布:外汇走势图软件 编辑:程序博客网 时间:2024/06/05 02:10
时间:2017年5月
出处:http://blog.csdn.net/csearch/article/details/71244282
声明:版权所有,转载请联系作者并注明出
1.UserCF原理
基于用户的协同过滤推荐算法先使用统计技术寻找与目标用户有相同喜好的邻居,然后根据目标用户的邻居的喜好产生目标用户的推荐。
基本原理就是利用用户访问行为的相似性来互相推荐用户可能感兴趣的资源,如下图所示:
上图示意出基于用户的协同过滤推荐机制的基本原理,假设用户A喜欢物品A、物品C,用户B喜欢物品B,用户C喜欢物品A、物品C和物品D;
从这些用户的历史喜好信息中,我们可以发现用户A和用户C的口味和偏好比较类似的,同事用户C还喜欢物品D,那么我们可以推断用户A可能也喜欢物品D,因此可以将物品D推荐给用户A。
基于用户协同过滤算法主要包括两个步骤:
(1)找到和目标用户兴趣相似的用户集合。
(2)找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
2.Python版本代码示例
2.1.读取数据集
from collections import defaultdict# data_path = "../data/ml-1m/ratings.dat";sep = "::"data_path = "../data/ml-100k/u1.base";sep = "\t"fp = open(data_path, "r")user2item_matrix = defaultdict(defaultdict) # 用户到物品的评分矩阵item2user_matrix = defaultdict(defaultdict) # 物品到用户的倒排评分矩阵# UserID \t MovieID \t Score \t Timefor line in open(data_path): lines = line.strip().split(sep) userID, movieID, score = lines[0],lines[1],lines[2] user2item_matrix[userID][movieID] = float(score) item2user_matrix[movieID][userID] = float(score)fp.close()print("totol users:",len(user2item_matrix))print("totol items:",len(item2user_matrix))
输出
(‘totol users:’, 943)
(‘totol items:’, 1650)
2.2.计算用户-用户相似度矩阵
步骤(1)的关键就是计算两个用户的兴趣相似度,协同过滤算法主要利用行为的相似度来计算兴趣的相似度。
给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过正反馈的物品集合。
那么,可以通过如下的Jaccard公式简单地计算u和v的兴趣相似度:
或者通过余弦相似度计算:
import mathdef user_sim_cosine(user2item_matrix): W = defaultdict(defaultdict) # 用户-用户-相似度矩阵 user_list = user2item_matrix.keys() for i in user_list: for j in user_list: if i==j: continue W[i][j] = len(set(user2item_matrix[i].keys()) & set(user2item_matrix[j].keys())) W[i][j] /= math.sqrt(len(user2item_matrix[i].keys())*len(user2item_matrix[j].keys())*1.0) return W%time W = user_sim_cosine(user2item_matrix)
输出
CPU times: user 12.4 s, sys: 244 ms, total: 12.7 s
Wall time: 12.5 s
3.3.基于用户-用户相似度矩阵,进行TopK排序推荐
import operatordef recommend(user2item_matrix, user_id, W, K=10): '''通过用户userid、训练集数据、用户相似度矩阵进行topN推荐''' rank=defaultdict(int) # 获取用户的物品列表 user_item_set = user2item_matrix[user_id].keys() # 遍历与该user_id相似的用户和相似度得分 for w_userid,w_score in sorted(W[user_id].items(),key=operator.itemgetter(1),reverse=True)[0:K]: # 遍历相似用户看过的物品与打分 for item_id,item_score in user2item_matrix[w_userid].items(): # 如果相似用户看过的电影也在目标用户的物品集合中,则忽略该物品的推荐 if item_id in user_item_set: continue # 计算该物品推荐给用户的排序分 rank[item_id] = w_score*item_score # 对所有推荐物品与打分按照排序分进行降序排序,取前K个物品 rank_list = sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:K] return rank_list%time print recommend(user2item_matrix,'5',W,3)
输出
[(‘343’, 1.7452803288387695), (‘271’, 1.7452803288387695), (‘1239’, 1.7452803288387695)]
CPU times: user 1.72 ms, sys: 317 µs, total: 2.04 ms
Wall time: 1.8 ms
- 推荐系统-基于userCF推荐模型
- 推荐系统_itemCF和userCF
- 推荐系统-itemCF和userCF
- 推荐系统-基于itemCF推荐模型
- 推荐系统-基于PersonalRank推荐模型
- 机器学习->推荐系统->userCF算法
- 推荐系统_LFM和基于邻域(如UserCF、ItemCF)的方法的比较
- mapreduce实现推荐系统(UserCF-基于用户的协同过滤算法)
- LFM和基于邻域(如UserCF、ItemCF)的方法的比较( 推荐系统)
- [推荐算法]UserCF,基于用户的协同过滤算法
- [推荐算法]UserCF,基于用户的协同过滤算法
- [推荐算法]UserCF,基于用户的协同过滤算法
- 基于隐语义模型的推荐系统
- Mahout推荐系统引擎UserCF中的IRStats部分源码解析
- 基于模型融合的推荐系统实现(3):模型融合
- 基于记忆与基于模型的推荐系统对比
- 基于spark的多模型融合的推荐系统
- Scikit-learn实现基于模型的推荐系统(SVD)
- OpenCV中的模板匹配方法及其应用
- Android Menu中main.xml里item条目属性解析
- MySQL
- elf格式详解
- 插入排序算法理解
- 推荐系统-基于userCF推荐模型
- ui路由---实际案例操作(首页 登录 注册 商品列表)
- android contentprovider 插件化之一
- 程序员面试题:常见数据结构的实现(JAVA版)
- 欢迎使用CSDN-markdown编辑器
- 在Ubuntu15.0版本上安装vpn服务时遇到的问题记录
- c++ 多重继承(包含虚继承)重载operator==
- 进程间通信的方式有哪些?各自的优缺点及应用选择?
- 蓝桥杯:颠倒的价牌