协同过滤(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. QQ个人文件夹中的文件被占用,解决办法

    我的情况是记住密码的账号不可以登录,不记住密码的账号确可以登录,突然就这样,我也很郁闷. 找到路径C:\Users\Public\Documents\Tencent\QQ下的UserDataInfo. ...

  2. a版本冲刺第七天

    队名:Aruba   队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章  鼎 学号 昨天完成的任务 今天做的任务 明天要做的任务 困难点 体会 408 学习活动的消息传递和日志分析 因为大家都在赶进 ...

  3. 优化php代码 - 字符串echo输出 逗号也可作php连接符

    2016年12月12日10:00:16 ====================== 网页访问速度的提升,是可以通过代码的优化来实现的.代码的优化,并不是说代码越少越好,而是主要看代码的运行能力和执行 ...

  4. CodeForces 165E Compatible Numbers(位运算 + 好题)

    wo integers x and y are compatible, if the result of their bitwise "AND" equals zero, that ...

  5. Linux系统下压缩文件时过滤指定的文件 |Linux系统压缩指定文件代码

    进入要压缩的目录: [root@iZ25c748tjqZ wechat]# cd /alidata1/htdocs/wechat/ 查看目录: [root@iZ25c748tjqZ wechat]# ...

  6. DEDECMS标签调用汇总啊

    非常有用的标签调用的方法 关键描述调用标签: <meta name="keywords" content="{dede:field name='keywords'/ ...

  7. windows下pip安装python模块时报错总结

    http://www.cnblogs.com/liaojiafa/p/5100550.html 前言: 这几天把python版本升级后,发现pip安装模块好多都报错(暂不确定是不是因为升级导致的),我 ...

  8. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  9. javascript数据结构与算法--链表

    链表与数组的区别?  1. 定义: 数组又叫做顺序表,顺序表是在内存中开辟一段连续的空间来存储数据,数组可以处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小. ...

  10. cf723a The New Year: Meeting Friends

    There are three friend living on the straight line Ox in Lineland. The first friend lives at the poi ...