协同过滤(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. c#反射-动态加载dll简单例子

    假设已有组件ClassLibraryTEST.dll,放置于程序目录下.组件中ClassLibraryTEST命名空间下有TEST类,类中有方法sum.下面示例就是动态加载组件并调用sum方法的简例: ...

  2. Deepin 15.3 编译同步SudaMod 2.0

    1.设置hosts,方便访问国外站点 $ wget https://raw.githubusercontent.com/racaljk/hosts/master/hosts -qO /tmp/host ...

  3. tomcat设置虚拟目录开启文件下载在服务

    因为平时一直在eclipse里运行tomcat,所以改的文件在eclipse里的server 在server.xml里找到<host></host>,并在</host&g ...

  4. 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)

    ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...

  5. RabbitMQ消息队列(一): Detailed Introduction 详细介绍

     http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...

  6. Google Map API Version3 :代码添加和删除marker标记

    转自:http://blog.sina.com.cn/s/blog_4cdc44df0100u80h.html Google Map API Version3 教程:在地图 通过代添加和删除mark标 ...

  7. grunt安装和使用教程

    grunt的安装 npm intall -g grunt-cli 新建文件夹grunt,在本地文件中添加package.json和Gruntfile.js文件,其中package.json文件的配置如 ...

  8. 获取页面内iframe里面的元素

    结构直接看图比较直接 这里window.frames获取的是iframe的数组 要记得给iframe加个ID才行 后面的记录会详细讲解 在父窗口获取页面内的iframe 里面的元素window.fra ...

  9. go智能提示(重要)

    使用VIM开发go程序时,智能提示是一个大问题. 最终解决方案是使用 YCM,它是使用 gocode 来进行智能提示的.一切配置好之后,你会发现标准库和第三方库都可以智能提示,但自己写的包却不能,猜想 ...

  10. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...