协同过滤(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给出评分,再选评分前面几个。

  1. #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()
 

这个话题IBM有几篇写的很好:
IBM1
IBM2
IBM3

机器学习笔记索引

协同过滤和简单SVD优化的更多相关文章

  1. 当因式分解遇见近邻:一种多层面协同过滤模型(SVD++)

    本文地址:https://www.cnblogs.com/kyxfx/articles/9392086.html actorization Meets the Neighborhood: a Mult ...

  2. 机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用. 推荐的背后逻辑 有没有思考过一个问题,当我们在淘宝或者是 ...

  3. 推荐系统-协同过滤在Spark中的实现

    作者:vivo 互联网服务器团队-Tang Shutao 现如今推荐无处不在,例如抖音.淘宝.京东App均能见到推荐系统的身影,其背后涉及许多的技术.本文以经典的协同过滤为切入点,重点介绍了被工业界广 ...

  4. 从item-base到svd再到rbm,多种Collaborative Filtering(协同过滤算法)从原理到实现

    http://blog.csdn.net/dark_scope/article/details/17228643 〇.说明 本文的所有代码均可在 DML 找到,欢迎点星星. 一.引入 推荐系统(主要是 ...

  5. SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高

    1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:

  6. 电影推荐系统---协同过滤算法(SVD,NMF)

    SVD 参考 https://www.zybuluo.com/rianusr/note/1195225 1 推荐系统概述   1.1 项目安排     1.2 三大协同过滤   1.3 项目开发工具 ...

  7. 简单的python协同过滤程序

    博主是自然语言处理方向的,不是推荐系统领域的,这个程序完全是为了应付大数据分析与计算的课程作业所写的一个小程序,先上程序,一共55行.不在意细节的话,55行的程序已经表现出了协同过滤的特性了.就是对每 ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  9. 使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_136 时至2020年,个性化推荐可谓风生水起,Youtube,Netflix,甚至于Pornhub,这些在互联网上叱咤风云的流媒体 ...

随机推荐

  1. 菜鸟初识python request属性及方法说明

    if  request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属性 描述 path 表示提交请求页面完 ...

  2. bzoj2086【Poi2010】Blocks

    因为long long还有PE的事WA了一下午TAT 考虑一段可行区间的平均值肯定>=k 也就是说将每个数减去k以后,一段可行区间的和非负,求一段最长区间. 一段区间的和肯定是两个前缀和的差 先 ...

  3. PC工作原理

    提到"技术"这个词时,大多数人都会想到计算机.事实上,我们生活中的方方面面都离不开计算机部件.家里的电器设备有内置的微处理器,例如电视机.甚至汽车里也装有计算机.但是,提到计算机大 ...

  4. mysql索引失效

    在做项目的过程中,难免会遇到明明给mysql建立了索引,可是查询还是很缓慢的情况出现,下面我们来具体分析下这种情况出现的原因及解决方法   索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: ...

  5. 好用的开源web系统总结

    1.论坛 phpwind 一个用wind框架写的论坛       discuz 社区动力 论坛   2.商城 Ecshop 商城腾讯的开源商城项目 一款B2C独立网店系统,系统是基于PHP语言及MYS ...

  6. 分享一个.NET实现的简单高效WEB压力测试工具

    在Linux下对Web进行压力测试的小工具有很多,比较出名的有AB.虽然AB可以运行在windows下,但对于想简单界面操作的朋友有点不太习惯.其实vs.net也提供压力测试功能但显然显得太重了,在测 ...

  7. Canvas绘制渐变

    1.绘制线性渐变 Canvas提供了用于创建线性渐变的函数createLinearGradient(x0,y0,x1,y1),坐标点(x0,y0)是起点 ,(x1,y1)是终点 创建一个渐变色 var ...

  8. 给网页 title添加图片。

    在网页的title中添加 <link rel="shortcut icon" href="logo.png" /> 即可. 可以看下百度搜索的代码, ...

  9. Asp.Net HttpContext.RemapHandler 用法

    最近在看HttpHandler映射过程文章时发现Context对象中有一个RemapHandler方法,它能将当前请求映射到指定的HttpHandler处理,可跳过系统默认的Httphandler.它 ...

  10. [译]reset, checkout和revert

    git reset, git checkout, git revert能让你撤销你本地仓储的一些修改,  前两种命令可以作用于commit或者一个文件. Commit级别的操作 注意了git reve ...