推荐系统-协同过滤算法简介简化版实例
必须先忏悔一下太久没记录学习轨迹,最近感觉脑子里一团浆糊,搞得自己非常难受,自信心也是被严重摧毁。训斥自己必须要保持记录的习惯,因为这不仅是对知识的整理,更让你知道其实你知道的很多!
因为刚结束了一个推荐系统的课程,所以今天趁热打铁写写学到的推荐系统的内容。
先简单讲下推荐系统要做什么。顾名思义,推荐系统就是在一个网站或APP内,向用户推荐合适的内容,让用户大大节省自己搜寻的时间并促进用户对内容的消费。向用户推荐合适的内容,就要从了解用户偏好开始。用户的行为比如评分、评论、点赞、购买,甚至在社交网站关注了相关内容,都可以用来反映用户偏好。不同类型网站选取的反映指标是各不相同的。
基于项目的协同过滤算法
协同过滤算法是目前应用十分广泛的推荐系统技术,主要有基于用户的协同过滤算法和基于项目的协同过滤算法。基于用户的协同过滤算法主要思想是,给小A寻找taste相似的用户小B,然后根据小B过往的偏好情况,预测小A可能喜欢的项目并给小A推荐。基于项目的协同过滤算法的主要思想则是,给一个条目小i寻找相似的条目小j,如果某个用户青睐小i,那么她很可能也会青睐小j,于是根据i,j的相似程度和该用户对i的评分,预测该用户对j的评分。例如,电商推荐系统常用的算法,计算某用户对项目j的预测评分为:
p(j) = (∑iinS其实是∑i∈S。。。)
其中,s表示i,j之间的相似度,s=P(i∩j) / P(i)·P(j),P(i∩j)表示i,j共同出现(共同出现可以是一次会话中共同得到点击浏览,或其他定义)的频率,P(i)表示i出现的频率,P(j)表示j出现的频率。ri是该用户对i的评分。S表示所有与j相似的项的集合。
举个小栗子-音乐推荐系统
假设现在我有好多首音乐(item),每首音乐有很多属性(attr),比如:语言(国语,英语……)、曲风(hiphop、摇滚、小清新……)、歌手(Rihanna、Adele、周杰伦……)、所属专辑……另外还有很多用户(user)。
现在我要做的第一件事是做一个0-1矩阵。每个item是一行,每个attr的每个可能取值是一列。通过赋值0或1描绘一个item具有哪些属性。然后,我有了一个庞大的音乐属性矩阵X(属性包括歌曲录入系统时候自动采集到的,用户打tag得到的等等),比如:
X | 国语 | 英语 | hiphop | 中国风 | Rihanna | 周杰伦 | …… |
青花瓷 | 1 | 0 | 0 | 1 | 0 | 1 | |
bitch better have my money | 0 | 1 | 0 | 0 | 1 | 0 | |
rap god | 0 | 1 | 1 | 0 | 0 | 0 | |
…… |
然后我要做的第二件事是,搞一个用户对音乐的评分矩阵Y(用户评分是综合各种不同用户行为并给它们赋不同权重得到的,比如点击收藏的行为,妥妥的炒鸡喜欢这首歌,+1分;分享行为,+0.8分,其他……)。评分要做标准化处理x*=,比如:
Y | user1 | u2 | u3 | u4 | ...... |
青花瓷 | -4 | 5 | -3 | ||
bitch better have my money | 2 | 1 | |||
rap god | -2 | 2 | 3 | ||
....... |
然后我就可以得到用户画像了,也就是每个用户对每种音乐属性的偏好矩阵Z。其实就是类似矩阵相乘的运算而已。结合以上两表,得出:
Z | 国语 | 英语 | hiphop | 中国风 | Rihanna | 周杰伦 | …… |
user1 |
1*-4+0*2+0*0=-4 (1对应X(1,1);-4对应Y(1,1);0对应X(1,2);2对应Y(1,2)) |
0*-4+1*2+1*0=2 | 0 | -4 | 2 | -4 | |
u2 | 5 | -2 | -2 | 5 | 0 | 5 | |
u3 | 0 | 3 | 2 | 0 | 1 | 0 | |
u4 | -3 | 3 | 3 | -3 | 0 | -3 | |
…… |
最后要做的事是,根据上面的矩阵预测用户对歌曲的评分。然后我会给用户推荐他们没听过的,预测评分排名前n名的音乐。得到预测评分矩阵P(计算规则:P(i,j)为X第i行所有元素与Z第j行所有对应元素相乘再加总, 如P(1,2)单元格元素15,为X第一行所有元素与Z第二行所有对应元素相乘,然后加总):
P | user1 | u2 | u3 | u4 | ...... |
青花瓷 | -12 | 15 | 0 | -9 | |
bitch better have my money | 4 | -2 | 4 | 3 | |
rap god | 2 | -4 | 5 | 6 | |
....... |
红色数字就是原来没有用户评分的预测评分。经过标准化的评分,为负的可以看作用户不喜欢,为正的可以看作喜欢,那么rap god是可以考虑给u1推荐的,bitch better have my money也是可以考虑给u4推荐的,但是就不要给u2推荐了。推荐出去的是每个用户预测评分排在top几位的音乐,分值越高表示用户越有可能喜欢。
现实没那么简单
But,这是个比较简单(la ji)的例子,实际应用中要考虑的更多,数据处理也复杂很多。对购物网站来说,要控制爆款和小众商品之间的平衡,不然容易全部推荐热门商品,使用户丧失惊喜度,也不利于冷门商品的挖掘。对一些新闻网站来说,最新的新闻肯定比很久以前的新闻更有推荐价值,所以要加上时间控制因子。还有对一些文本内容来说,我要识别最能体现文章主题的关键词,所以构建attr向量时,如何给不同词组赋不同权重也是要考虑的问题。当然解决这些问题有很多有趣(ni tian)的方法,涉及到多种机器学习技术,比如NLP。有时间再深入写。当然作为一只渣渣,还有很多东西要探索。
推荐系统-协同过滤算法简介简化版实例相关推荐
- 推荐系统----协同过滤算法原理及实现
一.基本介绍 1. 推荐系统任务 推荐系统的任务就是联系用户和信息一方面帮助用户发现对自己有价值的信息,而另一方面让信息能够展现在对它感兴趣的用户面前从而实现信息消费者和信息生产者的双赢. 2. 与搜 ...
- 推荐系统协同过滤算法——矩阵分解模型
文章目录 一.简介 1.推荐系统的输入 1)显式反馈 2)隐式反馈 2.重点内容 3.关联用户与物品的两种CF技术 1)基于邻域的方法 2)隐语义模型 隐语义空间: 4.内容总结 二.预备知识 符号 ...
- 协同过滤算法深入解析:构建智能推荐系统的核心技术
一.前言 二.协同过滤算法简介 三.基于用户的协同过滤 3.1 用户相似度计算 3.2 预测用户评分 四.基于物品的协同过滤 4.1 物品相似度计算 4.2 预测用户评分 五.矩阵分解方法 5.1 奇 ...
- SpringBoot+Vue+Element-UI实现协同过滤算法商品推荐系统
文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclip ...
- 《推荐系统》基于用户和Item的协同过滤算法的分析与实现(Python)
1:协同过滤算法简介 2:协同过滤算法的核心 3:协同过滤算法的应用方式 4:基于用户的协同过滤算法实现 5:基于物品的协同过滤算法实现 一:协同过滤算法简介 关于协同过滤的一个最经典的例子就是看电影 ...
- springboot java基于协同过滤算法商品推荐系统vue
互时动态更新该页面的 Web 应用 springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生 ...
- 【4】协同过滤算法的原理与实现
一:协同过滤算法简介 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐.在问的时候,都习惯于问 ...
- python协同过滤算法_协同过滤算法介绍及算法实现
一.协同过滤算法简介 协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐.也就是常见的"猜你喜欢",和& ...
- 协同过滤算法介绍及算法实现
一.协同过滤算法简介 协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐.也就是常见的"猜你喜欢",和& ...
最新文章
- 【转】[退役]纪念我的ACM——headacher@XDU
- 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析...
- (转)ADC的滤波方法
- 一个接口是如何在Keycloak和Spring Security之间执行的
- 豆瓣评分 9.1,揭秘乔布斯如何成为最伟大的产品经理?
- 建立合理的索引提高SQL Server的性能
- ngrx心得体会总结
- go 语言 first argument to append must be slice
- Java文件类boolean setExecutable(boolean exec_file,boolean owner_access)方法,带示例
- oracle正在启动或关闭中的解决方法
- find a ubuntu featue
- 显式Intent 和隐式 Intent 的区别
- 写得好 git 提交信息
- 数组、vector、array对比
- 学qt的都干什么工作_【板绘前景】学板绘可以干什么工作?学多久才可以工作?好学吗?...
- spring源码-bean加载整体流程
- 安装LaTeX中文字体 xGBKFonts
- 专科计算机毕业论文范文 致谢,大专毕业设计致谢模板(精选范文3篇)
- 处理Cookie ( from http://edu.chinaz.com )
- 【C/C++】多线程中的几种锁