推荐系统(2)-协同过滤1-UserCF、ItemCF

协同过滤

  • 1.CF概述
  • 2.数据表示
  • 3.衡量相似度
  • 4.共现矩阵
  • 5.UserCF
  • 6.ItemCF
  • 7.UserCF 与ItemCF 应用场景、主要缺陷
  • 8.基于UserCF 电影推荐demo

《深度学习/推荐系统》读书笔记

推荐系统的发展一日千里
传统的推荐模型(2010年前后):协同过滤、罗辑回归、因子分解、梯度提升树
深度学习推荐模型(2015年后):…

在深度学习推荐模型成为推荐、广告、搜索领域的主流,但是传统推荐模型学习十分必要。因其为深度学习推荐模型的基础,并且具备可解释性强、硬件环境要求低,易于快速训练和部署等不可替代的优势。

1.CF概述

协同过滤–Collaborative Filtering(CF)

  1. 1992年–Xerox研发基于协同过滤的邮件筛选系统
  2. 2003年–Amazon发表论文《Amazon.com Recommenders Item-to-Item Collaborative Filtering》,促使CF成为使用热点

基本思想:相似的人有相似的行为(购买),相似的物品有相似的属性(被喜欢)。
基本流程:数据表示、定义相似、找相似TopN、按照相似候选集进行推荐决策。

三类协同过滤算法:

  1. 用户协同过滤(UserCF):目标用户与相似用户的喜好相似
  2. 物品协同过滤(ItemCF):给用户推荐有正反馈物品的相似物品
  3. 矩阵分解协同过滤(Matrix Factorization,MF):解决共现矩阵稀疏的问题。

2.数据表示

特征向量表示用户/物品。
常用可解释特征:

  1. 用户向量–购买行为,评价行为,性别,年龄
  2. 物品向量–商品的类别,商品描述,用户反馈信息

数据的高级语义特征,拓扑结构特征需要专门建模分析。
挖掘数据特征表示本就是一个重要的研究方向吧。

3.衡量相似度

向量本身具有长度和方向两个属性,当存在两个向量相互作用时,还存在向量间夹角的问题。因此可以长度、夹角等不同的侧重点,定义不同的相似性度量。

常用的相似性度量指标

  1. 距离度量–考察差异向量的长度∣∣x−y∣∣p||x-y||_pxyp–1范数、2范数、无穷范数
  2. 余弦相似度:考察特征向量之间的夹角(x,y)–cos(x,y)=<x,y>∣∣x∣∣∗∣∣y∣∣cos(x,y) = \frac{<x,y>}{||x||*||y||}cos(x,y)=xy<x,y>
  3. 皮尔逊相关系数:与推荐内容十分相关的定义式

4.共现矩阵

是用户和商品对某一属性行为的矩阵表示,例如购买,点击,好评等行为。(缺陷就是只能表示一种属性。)

简单举例:以用户作为矩阵行坐标,商品作为矩阵的列坐标。矩阵中的元素就是某个用户是否购买了某件商品。

5.UserCF

问题:是否推荐物品A给用户X

  1. 收集各用户对商品库物品购买行为的共现矩阵(矩阵中缺失值的处理:取平均,直接去除)
  2. 计算TopN 相似用户
  3. 依据TopN 相似用户对物品A的购买行为,确定是否推荐物品A给用户X(意见不统一的采用投票法,评分加权平均法)

主要缺陷:

  1. 用户数远大于物品数,维护用户相似度矩阵的存储开销大。(两两相似N^2的空间)
  2. 用户历史数据非常稀疏,只有几次购买或者点击行为的用户很难准确找到相似用户。

6.ItemCF

实际在应用过程中,Amazon 和 Netflix 采用的是ItemCF 构建推荐系统。
通过计算物品列向量的相似度–》物品间相似度矩阵

  1. 构建共现矩阵[m*n]–m个用户, n件商品;
  2. 计算共现矩阵列向量之间的两两相似度,构建[n*n]物品相似度矩阵;
  3. 获取目标用户历史行为中有正反馈的物品列表;
  4. 利用物品相似度矩阵找出相似的TopK物品,构成相似物品集合;
  5. 依据相似度得分,生成最终推荐列表

强调:相似物品集合是 目标用户有正反馈的物品的相似物品
注意:多个正反馈物品相似于同一个物品,这个物品的相似度得分取多个相似度的加权平均值。

7.UserCF 与ItemCF 应用场景、主要缺陷

  1. UserCF:用户相似度,使其具备更强的社交特性,得知自己的同类最近喜欢什么,适用于新闻推荐场景,发现热点跟踪人点趋势。
  2. ItemCF:适用于兴趣变化较为稳定的应用,用户在一个时间段倾向于寻找类似上商品。电影,书籍,电视剧这种喜好风格,一段时间内变化比较小。

主要缺陷:推荐结果的头部效应比较明显,处理稀疏向量的能力比较弱

  1. 泛化能力弱,无法将两个物品相似推广到其他物品相似的计算上
  2. 热门商品具有很强的头部效应,更大家都相似。
  3. 而尾部商品由于特征向量稀疏,跟大家都不相似,导致很少被推荐。

为了解决上述问题,同时增加模型的泛化能力,矩阵分解技术被提出来(下一篇讲)
用更稠密的隐向量表示用户和物品,挖掘用户的隐藏兴趣和隐藏特征。

8.基于UserCF 电影推荐demo

(想找一个有关于推荐系统所有算法的repository,没有找到合适的,尤其是关于经典推荐算法。动手敲一敲呗。)
数据:用户对电影的评分
数据格式:

# [用户ID,电影ID,电影评分,时间标签] 8W条数据
1  1  2  3  876893171
2  1  3  4  878542960
3  1  4  3  876893119
4  1  5  3  889751712

基本思路:预测用户未评分的电影评分,给该每个用户推荐预测评分最高的TopN 个电影。预测的依据–相似用户对该电影评分的加权平均效果。
代码参考《python与数据挖掘》第10章
demo代码与数据

# 20210424 UserCF demo
# movie recommend
import pandas as pddef prediction(df, userdf, Nn=15):# 预测用户未评分电影的评分corr = df.T.corr()     # 计算用户的相关person相关系数矩阵rats = userdf.copy()for usrid in userdf.index:print(usrid)# step1:获取用户未评分电影dfnull = df.loc[usrid][df.loc[usrid].isnull()]    # 用户user1没有评分的电影:('mov6',nan)usrv = df.loc[usrid].mean()                       # 用户user1电影评分的均值# step2: 预测未评分电影的分值for i in range(len(dfnull)):nft = (df[dfnull.index[i]]).notnull()         # 用户user1没有评分的电影,其他人评分与否if(Nn <= len(nft)):nlist = df[dfnull.index[i]][nft][:Nn]     # 用户user1没有评分的电影,前Nn有评分的人else:nlist = df[dfnull.index[i]][nft][:len(nft)]   # len(df[dfnull.index[i]][nft]) < len(nft), 有啥用呢# 1)获取非null相关系数,有评分人列表nlist = nlist[corr.loc[usrid, nlist.index].notnull()]  # 用户user1 和 有评分人的非null 相关系数的评分人列表nratsum, corsum = 0, 0if(0!=nlist.size):nv = df.loc[nlist.index,:].T.mean()         # 相关有评分人对所有电影的评分的平均值for index in nlist.index:                   # 相关评论人userxncor = corr.loc[usrid, index]           # 用户user1 和 userx相关系数nratsum += ncor*(df[dfnull.index[i]][index]-nv[index])   # ncor*(df['mov6'][userx]-nv[userx])corsum += abs(ncor)if(corsum != 0):rats.at[usrid, dfnull.index[i]] = usrv + nratsum/corsum   # 预测用户user1对没有评分电影的评分else:rats.at[usrid, dfnull.index[i]] = usrv                    # 无其他用户评分修正的情况下,用自己的评分均值填补else:rats.at[usrid,dfnull.index[i]] = Nonereturn rats
def recomm(df, userdf, Nn=15, TopN=3):# 依据为未评分电影预测评分,给出每个用户的推荐列表。ratings = prediction(df, userdf, Nn)recomm = []for usrid in userdf.index:# 按Nan值获取未评分项ratft = userdf.loc[usrid].isnull()ratnull = ratings.loc[usrid][ratft]# 对预测评分项进行排序if(len(ratnull) >= TopN):sortlist = (ratnull.sort_values(ascending=False)).index[:TopN]else:sortlist = ratnull.sort_values(ascending=False).index[:len(ratnull)]recomm.append(sortlist)return ratings,recommif __name__ == "__main__":print("------使用基于UserCF算法对电影进行推荐中...-----")traindata = pd.read_csv("./data/Chapter10/u1.base", sep='\t', index_col=None, header=None)  # [用户ID,电影ID,电影评分,时间标签] 8W条数据print(traindata.head())testdata = pd.read_csv("./data/Chapter10/u1.test", sep='\t', index_col=None, header=None)traindata = traindata[:1000]testdata = testdata[:1000]# 删除时间列--本例中没有用traindata.drop(3, axis=1, inplace=True)testdata.drop(3, axis=1, inplace=True)# 行与列重新命名traindata.rename(columns={0: 'userid', 1: 'movid', 2: 'rat'}, inplace=True)testdata.rename(columns={0: 'userid', 1: 'movid', 2: 'rat'}, inplace=True)# 整理成共现矩阵traindf = traindata.pivot(index='userid', columns='movid', values='rat')testdf = testdata.pivot(index='userid', columns='movid', values='rat')# 重命名表格的行和列traindf.rename(index={i: 'user%d'%i for i in traindf.index}, inplace=True)testdf.rename(index={i: 'user%d'%i for i in testdf.index}, inplace=True)traindf.rename(columns={i: 'mov%d'%i for i in traindf.columns}, inplace=True)testdf.rename(columns={i: 'mov%d'%i for i in testdf.columns}, inplace=True)print('d', traindata.head())userdf = traindf.loc[testdf.index]trainrats, trainrecom = recomm(traindf, userdf)print(trainrecom[:1])print(len(trainrecom))print('end')

输出:

# 每个用户的推荐电影列表,每人推荐3部
[Index(['mov189', 'mov396', 'mov390'], dtype='object', name='movid')]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql查询实例1(学生表_课程表_成绩表_教师表)

表架构 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 建表语句 CREATE TABLE student ( s# INT, sname nvarchar(32), sage INT, ssex nvarchar(8) ) CREATE TABLE course ( c# INT, cname…

android 存储方式以及路径简介

存储分成了内部存储和外部存储。注意内部存储又叫做机身内存,而且内存又包含了两个部分RAM(运行时内存,这个和运行速度有关系,是手机运行时存储数据和指令的地方)、ROM(这个才算是真正存储东西的内部存储范围,是应用配置和其他数据的地方);而外部存储就很明确了,用户的外部挂…

MachineLearning(11)-关联规则分析

关联规则分析1.简单来说-关联规则2.经典关联规则挖掘-Apriori1.简单来说-关联规则 关联规则–通过量化的数字描述物品甲的出现 对 物品乙的出现 有多大影响。 最早是为了发现超市销售数据库中不同的商品之间的关联关系&#xff1a;哪组商品可能会在一次购物中同时购买。 广泛…

APK 安卓反编译

在学习Android开发的过程你&#xff0c;你往往会去借鉴别人的应用是怎么开发的&#xff0c;那些漂亮的动画和精致的布局可能会让你爱不释手&#xff0c;作为一个开发者&#xff0c;你可能会很想知道这些效果界面是怎么去实现的&#xff0c;这时&#xff0c;你便可以对改应用的A…

sql查询实例2(借书卡、图书、借书记录)

问题描述&#xff1a; 本题用到下面三个关系表&#xff1a; CARD 借书卡。 CNO 卡号&#xff0c;NAME 姓名&#xff0c;CLASS 班级 BOOKS 图书。 BNO 书号&#xff0c;BNAME 书名,AUTHOR 作者&#xff0c;PRICE 单价&#xff0c;QUANTITY 库存册数 BORROW 借书记录。 CNO 借…

开始学习Unity3D(一)

本人最近转行开始做海外独立游戏的发行,主要是负责服务器,开会注意到海外的服务越来越丰富越来越细分,对国内将会造成很大的冲击,比如AWS,Google,GameSparks等,这导致国内的所谓服务器开发将越来越简单,国内对服务器开发的需求越来越少,反而客户端的需求越来越多,所以…

List 流的使用

摘要 本文将介绍在 Java 1.8 中对 List 进行流操作的使用方法。引入的 java.util.stream 包为开发者提供了一种更为便捷和强大的方式来处理集合数据。通过使用流&#xff0c;我们能够以声明性的方式进行集合操作&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可…

推荐系统(3)-协同过滤2-矩阵分解算法

协同过滤-矩阵分解算法1.奇异值分解2.梯度下降3.矩阵分解方法的优缺点《深度学习/推荐系统》读书笔记&#xff08;其实矩阵分解和协同过滤已经没有特别大的联系了&#xff09; 2006年&#xff0c;在Netfilx举办的推荐算法竞赛中Netflix Prize Challenge中&#xff0c;以矩阵分解…

leetcode141 环形链表

给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&#xff0c;则在该链表中没有环。 示例 1&#xff1a; 输入&#xff1a;head …

iPhoneX适配

目录(?)[-]核心代码自动化修改代码参考资料iPhoneX适配&#xff0c;比较搓的一种方式&#xff0c;在不修改分辨率&#xff08;720 x 1280&#xff09;的情况下适配iphone X 主屏尺寸&#xff1a; 5.8英寸 主屏分辨率&#xff1a; 2436 x 1125核心代码修改 工程目录/Classes/Un…

centos安装nginx,配置负载均衡

&#xfeff;&#xfeff;1、安装nginx安装教程&#xff0c;参照&#xff1a;http://mp.weixin.qq.com/s/RVaRlRpHqZRjCaXGmOlfKw 2、反向代理的配置修改部署目录下conf子目录的nginx.conf文件的内容[html]view plaincopylocation / { #设置主机头和客户端真实地…

leetcode142 环形链表II

给定一个链表&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&#xff0c;则在该链表中没有…

PaperNotes(18)-VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized Representation

自动驾驶论文阅读笔记11. Ployline Garph2. Global Graph3. 模型目标函数4.Related work5.Experiment5.1 实验设置5.2 消融实验5.3 模型资源消耗5.4 与其他模型的对比实验VectorNet- Encoding HD Maps and Agent Dynamics from Vectorized RepresentationVectorNet: 通过矢量化…

ubuntu的apache配置https

&#xfeff;&#xfeff;一、配置Apache 1、开启SSL模块a2enmod ssl 2、启用SSL站点a2ensite default-ssl 3、加入监听端口vi /etc/apache2/ports.conf #编辑Apache端口配置&#xff0c;加入443端口 Listen 443注&#xff1a;Ubuntu启用SSL站点后&#xff0c;缺省已经加入了 (…

vim特别好的教程

欢 迎 阅 读 《 V I M 教 程 》 —— 版本 1.7 Vim 是一个具有很多命令的功能非常强大的编辑器。限于篇幅&#xff0c;在本教程当中 就不详细介绍了。本教程的设计目标是讲述一些必要的基本命令&#xff0c;而掌握好这 些命令&#x…

jquery、javascript实现(get、post两种方式)跨域解决方法

&#xfeff;&#xfeff;jquery、javascript实现(get、post两种方式)跨域解决方法一、实现get方式跨域请求数据浏览器端<script> $(document).ready(function(){$.ajax({url: "http://www.xxx.cn/index.php",type: "get",dataType: "jsonp&quo…

推荐系统(4)-逻辑回归LR、POLY2、FM、FFM

逻辑回归LR、POLY2、FM、FFM1.逻辑回归LR2.辛普森悖论3.POLY24.FM-20105.FFM6.GBDTLR-20147.LS-PLM-2017《深度学习/推荐系统》读书笔记1.逻辑回归LR Logistic Regression – 融合多种特征&#xff0c;通过sigmoid 函数&#xff0c;预测样本的被点击的概率。样本用特征向量x[x…

leetcode125验证回文串

给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 说明&#xff1a;本题中&#xff0c;我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: true 示例 …

配置 Elastic Beanstalk 环境负载均衡器以终止 HTTPS

&#xfeff;&#xfeff;配置 Elastic Beanstalk 环境负载均衡器以终止 HTTPS 要更新您的 AWS Elastic Beanstalk 环境以使用 HTTPS&#xff0c;您需要为您的环境中的负载均衡器配置 HTTPS 侦听器。以下两种类型的负载均衡器支持 HTTPS 侦听器&#xff1a;传统负载均衡器和应用…

AWS 给负载均衡器配置侦听器并上传IAM证书

&#xfeff;&#xfeff;1.打开EC2的负载均衡器&#xff1a;添加侦听器&#xff0c;选择https&#xff0c;ssl证书需要有一个CA证书&#xff0c;可以去阿里云申请&#xff0c;也可以从亚马逊获取&#xff1a;注意&#xff0c;这里的ssl证书要这样写其中私有密钥不是那种xxxxxx…