协同过滤和简单SVD优化
协同过滤(collaborative filtering)
推荐系统:
百度百科的定义是:它是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程
主要有有以下几种推荐的方式:
- 基于内容的推荐
- 协同过滤
- 关联推荐
- 混合推荐
协同过滤
这里我们主要考虑的是协同过滤,这也是最经典的推荐算法。协同过滤的思想很简单,就是像我们平时需要找一部好看的电影最简单的方式就是找兴趣相同的人推荐。
相似度计算:
相似度的计算主要有以下几种方法:
- 基于欧氏距离 相似度=1/(1+欧式距离)
- 基于皮尔逊相关系数(Pearson correlation) 0.5+0.5*corrcoef()
- 余弦相似度 0.5+0.5*cos
item-based CF & user-based CF:
item-based CF
基于item的协同过滤,通过用户对不同item的评分来评测item之间的相似性,基于item之间的相似性做出推荐;
user-based CF
基于user的协同过滤,通过不同用户对item的评分来评测用户之间的相似性,基于用户之间的相似性做出推荐;
推荐系统的评价:
最小均方根误差(Root Mean Squared Error,RMSE):首先计算均方误差值,然后取其平方根。(如果用户的评价在一星到五星,而我们的RMSE=1,说明我们的预估和用户评价相差一个星级)
面临的挑战:
实例和SVD优化
背景:
构建一个餐馆食物推荐引擎,推荐给用户他没有尝试过的最适合他的选择。
做法:
我们这里采用的是item-based CF。就是推断出用户对那些没有尝试过的评分再根据评分推荐。另外由于现实中客户是远远不可能尝试所有的产品的,所以实际的矩阵中很多的值都是0,这时候我们可以采
用SVD进行降维,在小的多的数据情况下得到相似的结果。
函数:
ecludSim(inA, inB)
基于欧式距离的相似度计算pearsSim(inA, inB)
基于皮尔森距离的相似度计算cosSim(inA, inB)
余弦相似度的计算standEst(dataMat, user, simMeans, item)
求出用户对物品的估计分值,计算出相似度和评分成绩,最后相似度评分进行归一化使结果在0到5之间svdEst(dataMat, user, simMeas, item)
在估计分数的过程中使用svd降维,保留90%的能量值。def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst)
对给定的用户推荐给他N个产品。过程很简单,首先找出那些他没有评级的产品,然后调用estMethod给出评分,再选评分前面几个。
- #coding=utf-8
- from numpy import *
- def loadExData():
- return[[4, 4, 0, 2, 2],
- [4, 0, 0, 3, 3],
- [4, 0, 0, 1, 1],
- [1, 1, 1, 2, 0],
- [2, 2, 2, 0, 0],
- [5, 5, 5, 0, 0],
- [1, 1, 1, 0, 0]]
- def loadExData2():
- return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],
- [0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],
- [0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],
- [3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],
- [5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],
- [0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],
- [4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],
- [0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],
- [0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],
- [0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],
- [1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]
- def ecludSim(inA, inB):
- return 1.0 / (1.0 + linalg.norm(inA - inB))
- def pearsSim(inA, inB):
- if len(inA) < 3:
- return 1.0
- return 0.5 + 0.5*corrcoef(inA , inB, rowVal = 0)[0][1]
- def cosSim(inA, inB):
- num = float(inA.T*inB)
- denom = linalg.norm(inA)*linalg.norm(inB)
- return 0.5 + 0.5 * (num/denom)
- def standEst(dataMat, user, simMeans, item):
- n =shape(dataMat)[1]
- simTotal = 0.0
- ratSimTotal = 0.0
- for j in range(n):
- userRating = dataMat[user,j]
- if userRating == 0:
- continue
- overLap = nonzero(logical_and(dataMat[:,item].A>0, \
- dataMat[:,j].A>0))[0]
- if len(overLap) == 0:
- similarity = 0
- else:
- similarity = simMeans(dataMat[overLap,item],
- dataMat[overLap,j])
- simTotal += similarity
- ratSimTotal += similarity * userRating
- if simTotal == 0:
- return 0
- else:
- return ratSimTotal / simTotal
- def svdEst(dataMat, user, simMeas, item):
- n = shape(dataMat)[1]
- simTotal = 0.0; ratSimTotal = 0.0
- U,Sigma,VT = linalg.svd(dataMat)
- sig2 = Sigma ** 2
- cut = 0
- for i in range(n):
- if sum(sig2[:i]) / sum(sig2) > 0.9:
- print i
- cut = i
- break
- Sig4 = mat(eye(cut)*Sigma[:cut]) #arrange Sig4 into a diagonal matrix
- xformedItems = dataMat.T * U[:,:cut] * Sig4.I #create transformed items
- for j in range(n):
- userRating = dataMat[user,j]
- if userRating == 0 or j==item: continue
- similarity = simMeas(xformedItems[item,:].T,\
- xformedItems[j,:].T)
- print 'the %d and %d similarity is: %f' % (item, j, similarity)
- simTotal += similarity
- ratSimTotal += similarity * userRating
- if simTotal == 0: return 0
- else: return ratSimTotal/simTotal
- def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):
- unratedItems = nonzero(dataMat[user,:].A==0)[1]#find unrated items
- if len(unratedItems) == 0:
- return 'you rated everything'
- itemScores = []
- for item in unratedItems:
- estimatedScore = estMethod(dataMat, user, simMeas, item)
- itemScores.append((item, estimatedScore))
- return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]
- def main():
- myMat = mat(loadExData2())
- print recommend(myMat,2,estMethod=svdEst)
- if __name__ == '__main__':
- main()
- #coding=utf-8
机器学习笔记索引
协同过滤和简单SVD优化的更多相关文章
- 当因式分解遇见近邻:一种多层面协同过滤模型(SVD++)
本文地址:https://www.cnblogs.com/kyxfx/articles/9392086.html actorization Meets the Neighborhood: a Mult ...
- 机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用. 推荐的背后逻辑 有没有思考过一个问题,当我们在淘宝或者是 ...
- 推荐系统-协同过滤在Spark中的实现
作者:vivo 互联网服务器团队-Tang Shutao 现如今推荐无处不在,例如抖音.淘宝.京东App均能见到推荐系统的身影,其背后涉及许多的技术.本文以经典的协同过滤为切入点,重点介绍了被工业界广 ...
- 从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现
http://blog.csdn.net/dark_scope/article/details/17228643 〇.说明 本文的所有代码均可在 DML 找到,欢迎点星星. 一.引入 推荐系统(主要是 ...
- SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高
1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:
- 电影推荐系统---协同过滤算法(SVD,NMF)
SVD 参考 https://www.zybuluo.com/rianusr/note/1195225 1 推荐系统概述 1.1 项目安排 1.2 三大协同过滤 1.3 项目开发工具 ...
- 简单的python协同过滤程序
博主是自然语言处理方向的,不是推荐系统领域的,这个程序完全是为了应付大数据分析与计算的课程作业所写的一个小程序,先上程序,一共55行.不在意细节的话,55行的程序已经表现出了协同过滤的特性了.就是对每 ...
- 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维
关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...
- 使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_136 时至2020年,个性化推荐可谓风生水起,Youtube,Netflix,甚至于Pornhub,这些在互联网上叱咤风云的流媒体 ...
随机推荐
- Leetcode 216. Combination Sum III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- 用TTS实现文本转语音
最近被toefl单词虐成狗::>_<:: 想做一个可以自动把单词转成语音的软件,这样就可以在路上戴耳机边走边听啦~ 用微软的TTS语音库可以很容易地实现.早期的TTS要想实现中英文混合朗读 ...
- Java+jquery实现裁剪图片上传到服务器
大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...
- 通用PE工具箱 4.0精简优化版
通用PE工具箱 4.0精简优化版 经用过不少 WinPE 系统,都不是很满意,普遍存在篡改主页.添加广告链接至收藏夹.未经允许安装推广软件等流氓行为,还集成了诸多不常用的工具,令人头疼不已.那么今天给 ...
- Linux终端最常用快捷键
新建终端窗口: crtl+shift+N 终端的漂移/切换:shift+左右箭头 挂 起:crtl+s 解除挂起:crtl+q 清 屏:crtl+l 命令行光标移动: crtl+a 移动到命令行首 c ...
- TCP/IP——基本知识
TCP / IP通常被认为是一个四层协议系统: 1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物 ...
- ImageView的常用属性
ImageView的一些常用属性,并且这些属性都有与之对应的getter.setter方法: android:adjustViewBounds:设置ImageView是否调整自己的边界来保持所显示图片 ...
- Maven个人手册
一.Maven基本使用与设置 1.安装maven插件 1).下载maven并解压到指定目录,到该目录下复制当前路径path 2).在eclipse的dropins目录下编辑maven.link,将ma ...
- html5 新选择器 querySelector querySelectorAll
querySelector 返回满足条件的单个元素 使用实例 HTML <div id="main">主体布局</div> JS var main =doc ...
- NOSDK--一键打包的实现(四)
1.4 打包及签名的脚本介绍 我们使用ant来实现打包,这节我们先介绍脚本内容,关于脚本环境配置问题,我们将在下节做一个详细的介绍. 首先我们来看下build_android/tools/platfo ...