推荐模型:从逻辑回归到POLY2到FM再到FFM
无论是基于内容的推荐算法,还是协同过滤算法,它们都只用到了用户和物品之间的行为信息,所以能不能加入更多的信息,比如用户/物品本身的信息以及上下文信息来更好地指导推荐呢?
事实上,这正在把推荐问题转化为我们所熟悉的机器学习问题。具体来讲,给定训练集,利用训练集的特征和标签训练一个模型,然后用该模型指导推荐。
在之前讲解的协同过滤算法中,我们通常是预测某用户对于某些物品的打分,然后按照打分值从高到低排列物品,选择前几个推荐给用户。
而这里,训练好的模型会直接预测某用户是否会对物品产生正反馈(比如购买一件商品,观看一部电影等),若会,则将物品推荐给该用户。没错,这就是一个二分类问题。
接下来介绍几个经典的相关模型,有一些可能已经听说过,比如逻辑回归,嗯,就从它开始吧~
逻辑回归逻辑回归(Logistic Regression, LR)用于分类任务,它使用sigmoid函数,将取值范围为全体实数的线性回归表达式$w_1x_1+w_2x_2+…+w_kx_k+b$映射到0和1之间:
123z=np.array(range(-10,10))sigm=1/(1+pow(2.73,-z))plt.pl ...
当SVD遇见CF
在之前的协同过滤算法中,我们使用了共现矩阵:
共现矩阵中每一个元素是特定用户对于特定物品(这里是电影)的打分。
但这存在一个问题:算法头部效应较明显,导致模型泛化能力较弱。具体来说,热门物品容易跟大量物品产生相似性,而尾部的物品由于其特征向量较稀疏,很少与其它物品产生相似性,从而很少被推荐。
一种比较好用的方法是,通过矩阵分解技术获取隐向量,用更稠密的隐向量来替代之前共现矩阵中对应的行(用户)和列(物品)组成的向量,从而加强了协同过滤模型处理稀疏矩阵的能力,提升了模型的泛化能力。
矩阵分解方法较多,比如梯度下降,SVD等.
隐向量的维度可自行设定或根据一定的规则确定(稍后就会看到),每一个维度都代表一种具体的含义。比如在之前举过的栗子中,每部电影的特征由一个二维向量来表示,两个维度分别代表了该电影中爱情元素和动作元素的含量;同样,每个用户也由一个二维向量来表示,两个维度分别代表该用户对于爱情元素和动作元素所喜爱的程度。其中所提及的二维向量,本质上就是隐向量。
回忆一下,在上面的栗子中,我们采用了梯度下降的方法来获取隐向量。
在接下来,你将看到另一种获取隐向量的方法:奇异值分解(SVD) ...
用Python搭建一个课程推荐系统:基于协同过滤算法
本文分享一个开源项目:课程推荐系统。
项目地址见文末参考资料[1].
该项目基于协同过滤算法,输入要预测的用户id以及要推荐的课程总数,输出推荐结果。
整个项目将使用Flask框架进行部署。
代码结构
主要逻辑在generator.py中,与其并列的testing.py作测试用,其余文件都是些工程上的代码(内存占用优化,日志文件处理,前端展示)。
数据处理原数据是日志文件,作者已经针对这些日志文件做了处理(使用Input Preprocessing中的模块),并提供了处理好的数据(.csv),因此这一步可以忽略。
读取处理后的数据:
12import pandas as pddf=pd.read_csv('features_sample.csv')
共49205条这样的数据,除了前两列用于标识不同课程和用户外,其余列均为特征列。
值得注意的是,对于前面两列,不同行可能有相同的取值。这是因为某一课程通常会被多个用户观看,且某个用户通常会观看不止一门课程。
代码解读在generator模块中,作者定义了一个recommendationGenerator类,它接收两个参 ...
用Python搭建一个电影推荐系统
之前我们以电影推荐为例,介绍了基于内容的推荐算法。可能各位看的有些枯燥,没关系,现在来做点有趣的事情:动手去实现它!
查看数据集使用的数据集是Kaggle上的TMDb,该数据集包含两个.csv文件:movies.csv和credits.csv。首先读取数据集:
12movies = pd.read_csv('tmdb_5000_movies.csv')credits = pd.read_csv(r'tmdb_5000_credits.csv')
数据集中包含了4803部电影的相关信息,包括电影类型,关键词,电影名字等,但并不包含单个用户的信息。因此,接下来,我们将主要根据每部电影的相关信息,从中抽取出每一部电影的特征,这些特征将用于计算电影之间的相似度,从而完成电影的推荐。
数据处理为了提取到每部电影(每行对应一部电影)的特征,需要先对数据做些处理。
将movie和credits这两张表合并:
12movies = movies.merge(credits,on='title')movies.dropna(inplace ...
协同过滤算法
回顾:基于内容的推荐算法上一次,我们介绍了基于内容的电影推荐算法,该算法要求事先知道每部电影的特征向量$x$,然后根据$x$去估计每个用户的特征向量$\theta$。预测得到的第$j$个用户对于第$i$部电影的评分就等于${({\theta}^{(j)})}^Tx^{(i)}$,如果预测评分较高,则将这部电影推荐给该用户。
在阅读下面的内容之前,建议转到上一次的分享内容再过一遍,因为两者有很多相似之处。(前文传送门戳我)
协同过滤现在,假设我们并不知道每部电影的特征向量,但知道每个用户的特征向量(表征用户对于爱情片or动作片的热爱程度)。
比如Alice的特征向量是$\theta^{(1)}=[0,5,0]$,则表明Alice比较喜欢爱情片(第二个维度表征用户对于爱情片的喜爱程度),同理可知Carol比较喜欢动作片。
有了这些条件,就可以估计每部电影的特征向量$x$了,和之前基于内容的推荐算法一样,都可以基于最小二乘法进行求解。
求解目标写成数学形式如下:
其中,$r(i,j)$表示第j个用户是否对第i部电影做了评分,已评为1,否则为0.
$y^{(i,j)}$表示第j个用户对于第i ...
FlyAI蘑菇分类竞赛TOP5方案分享
入门深度学习至今已经一年了,趁着这个暑假参加了FlyAI举办的蘑菇分类竞赛,并侥幸取得了第5名。虽然之前也分享过类似竞赛的文章,但都是作为学习帖(传送门戳我),因此本文算是第一次正式参加机器学习类竞赛的浅薄经验分享帖,不足之处,欢迎指正。
赛题介绍这里就不复制官方大段的赛事介绍了,只讲一下重点部分:
给定一批图片,其中共有9种不同品种的蘑菇,希望你用机器学习的方法训练一个分类器,使得该分类器能够将不同种类的蘑菇区分开来。
评估指标是准确率(Accuracy),它定义为测试集中所有预测正确的样本数与实际总样本数之比。
图片被划分为训练集和测试集两部分。
和Kaggle等竞赛不同,这里我们是看不到测试数据的,并且只能看到训练集的很小部分数据。
官方提供训练平台,并有免费算力发放,因此不需要担心显卡的问题。
baseline搭建官方已经定义好了数据的读取代码,并给出了基于PyTorch的baseline,所以并不需要我们从头去搭建baseline。
我们要做的,就是在这个baseline基础做优化,尽可能地去提升准确率指标。
模型优化合适的骨干网络骨干网络用于提取图片中的特征,并将特征送入分 ...
基于内容的推荐算法:以电影推荐为例
讲个故事哈:
在一个周五的傍晚,你独自取了外卖,回到寝室,拿起手机,准备边吃饭边欣赏电影的精彩。你打开了外卖包装,一边吃一边快速地刷着视频软件。不久,外卖盒子已是空空如也,而你仍然在快速地刷着视频软件。没错,此时外卖已吃完,你还是没有找到想看的电影,反被淹没在信息流的大海。
推荐系统是个啥?随着社会的发展和科技的进步,互联网上的信息变得越来越多,对于用户来说,很难直接对这些信息加以有效利用。
因此,如何做到对不同用户推送其所需要的内容是非常必要的,这便引出了推荐系统。
事实上,你每天都在接触它。B站首页内容,抖音短视频,淘宝首页,腾讯视频首页等等,背后都是推荐系统在起作用。
我打算花一些时间去学习推荐系统领域相关的知识,所有的学习笔记将更新在本号,欢迎小伙伴们持续关注丫~
基于内容的推荐算法推荐系统所采用的算法,称之为推荐算法。推荐算法的种类较多,本文将参考吴恩达老师的视频,介绍基于内容的推荐算法(Content-based recommender systems)。
所有内容均基于下面的栗子。
在这个栗子中,我们将构建一个基于内容的电影推荐系统。
总共5部电影:Love at ...
MaskedFusion
MaskedFusion: Mask-based 6D Object Pose Estimation
来源:ICMLA 代码:https://github.com/kroglice/MaskedFusion 引用量:3
提出的问题现实中的物体存在遮挡(occlusions)和截断(truncations)等情况。
已有的方法
基于RGB依赖于物体检测,关键点匹配以及3D渲染技术,并使用PnP算法来求解姿态。速度快,但存在遮挡时,recall就会很低。
基于点云依赖于描述符(descriptors)从场景中的物体中提取特征,并将其与在已知姿态中捕获的特征进行匹配
基于RGB-D直接从数据回归姿态,并做后处理优化
本文的方法直接从RGB-D数据中回归姿态。
包含三个串行的子任务:
使用语义分割,对物体做检测(detection)和分类,并获取对应的mask
从不同类型的数据中提取特征,并使用pixel-wise的方式将它们混合在一起,使用6D pose neural network回归物体姿态(旋转和平移矩阵)
Pose Refinement(可选,建议选),直接使用了D ...
G2L-Net
G2L-Net: Global to Local Network for Real-time 6D Pose Estimation with Embedding Vector Features
来源:CVPR 2020代码:https://github.com/DC1991/G2L_Net引用量:8新版本:FS-Net(CVPR2021),还没看
提出的问题
一些基于深度学习的方法预测表现达到了sota,但做不到实时性,太慢
虽然存在一些方法能够做到实时性,但这些方法只是用了RGB图,无法处理存在遮挡和光照变化的情况
当加入深度信息后,可以处理诸如遮挡的复杂情况,但是计算密集。并且这些基于RGBD的方法的一个常见问题是:利用来自深度信息中的视点信息(view point infomation)并不是很有效,从而降低了它们的姿态估计精度。为了克服这一点,这些方法倾向于使用后细化机制( post-refinement mechanism)或假设生成/检验机制(hypotheses generation/verification mechanism)来提高姿态估计的精度,但同时也降低了姿态 ...
PoseCNN
PoseCNN: A Convolutional Neural Network for 6D Object Pose Estimation in Cluttered Scenes
来源:RSS 2018 代码:https://github.com/NVlabs/PoseCNN-PyTorch 引用量:667
提出的问题现实中的物体具有不同的三维形状,它们在图像上的外观受到光照条件、杂乱场景和物体之间遮挡的影响,一些物体具有对称性,这给6D姿态估计问题带来了挑战。
已有的方法
在3D模型和2D图片之间匹配特征点。这种方法只对那些纹理特征丰富的物体有效。
基于RGB-D的方法可以应对表面纹理较少的物体。
基于模板的方法:构造一个刚性模板,用于扫描输入图像中的不同位置。在每个位置计算相似分数,通过比较这些相似分数获得最佳匹配。这类方法虽然可以解决物体纹理较少的问题,但是物体之间的相互遮挡会降低识别性能。
基于特征的方法:从点或图像中的每个像素提取局部特征,并与三维模型上的特征匹配,建立3D-3D对应关系。这类方法可以解决遮挡问题,但需要物体表面纹理丰富才能提出好的局部特征。虽然后来直接回归 ...