用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对应关系。这类方法可以解决遮挡问题,但需要物体表面纹理丰富才能提出好的局部特征。虽然后来直接回归 ...
FFB6D
FFB6D: A Full Flow Bidirectional Fusion Network for 6D Pose Estimation
来源: CVPR2021代码:https://github.com/ethnhe/FFB6D
提出的问题
RGB图像+CNN:透视投影会导致几何信息损失
RDB-D+CNN::如何有效地充分利用这两种数据模式(RGB图+深度图)来进行更好的6维姿态估计?
已有的方法
使用级联思想,先从RGB中做粗略估计,再使用ICP或多视图的假设检验做后续优化。这种方法并不是端到端的方式,而且非常耗时。
使用两个网络,一个CNN,一个PCN( pointcloud network),分别从RGB图和点云文件中提取特征(croped RGB image and point cloud),然后把这两种特征concat在一起(称之为 dense features),用于姿态估计。这种混合特征的方法(concat)太naive。
也是用两个网络,CNN和PCN,只不过将特征混合方式由concat改为dense fusion,如下图: 但是,由于CNN和PC ...
一秒仿妆:PSGAN
BeautyGAN:提出了makeup loss等,后续PSGAN也基于这些loss。训练数据需要成对,数据集难收集。
Paired Cycle GAN:额外添加了一个判别器
Beauty Glow
LADN…
以上方法不适用于in the wild 图像,且不能只调节局部,比如只给眼睛上妆。
PSGAN(CVPR2020)解决了这些痛点,并且PSGAN++做了进一步改进,对比如下:
由于PSGAN++还没开源代码,所以选择了有代码的PSGAN,同时作者也提供了预训练模型。
我用默认配置参数跑了下,发现并没有得到论文中的效果,调了些参数,比如生成器和判别器的学习率,效果也不是特别好。
使用预训练模型,就能够得到论文中的效果。可能自己还需要调更多参数吧~
下面是关于PSGAN的论文要点整理。
网络结构PSGAN的生成模块包括3部分:
Makeup distill network(MDNet)
Attentive makeup morphing module(AMM module)
Makeup Apply Network(MANet)
reference image:上妆容图,假设在 ...