一、协作型过滤

一个协作型过滤算法通常的做法是对一大群人进行搜索,并从中找出与我们品味相近的一群人。然后对这些人的偏好内容进行考查,并将它们组合起来构造出一个经过排名的推荐列表。

  1. 搜集偏好
  2. 寻找相近的用户
    • 欧几里得距离评价
    • 皮尔逊相关度评价
  3. 为相近用户打分排序
  4. 推荐物品
  5. 推荐结果

1.搜集偏好

# 不同用户对电影的评分字典
critics={'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,'The Night Listener': 3.0},
'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,'You, Me and Dupree': 3.5},
'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0,'Superman Returns': 3.5, 'The Night Listener': 4.0},
'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0,'The Night Listener': 4.5, 'Superman Returns': 4.0,'You, Me and Dupree': 2.5},
'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0,'You, Me and Dupree': 2.0},
'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0,'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5},
'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns':4.0}}

2.寻找相近的用户

寻找相近用户可以使用不同的相似度评价值体系:这里介绍两种:欧几里得距离和皮尔逊相关度。
欧几里得距离:它是基于距离的相似度评价
皮尔逊相关度:用来判断两组数据与某一直线拟合程度的一种度量。它更适合于当两名用户虽然对电影有相同的爱好,但是用户1评分更严苛,而用户2更宽松,那么用欧几里得距离来计算两者相似度就会有偏差,但是皮尔逊相关度,会更关注两者的趋势。

#寻找近似用户,计算两个用户的相似度(欧几里得距离)

def sim_distance(prefs,person1,person2):  #prefs是指存储所有用户评分的字典
# 得到shared_items两个用户都给出评分的电影列表
si ={}
for item in prefs[person1]:if item in prefs[person2]:si[item] =1if len(si) == 0:return 0 #此时两个用户没有共同评分的影片,相似度为0
else:sum_of_squares =sum([pow(prefs[person1][item]-prefs[person2][item],2) for item in prefs[person1] if item in prefs[person2]])return 1/(1+sqrt(sum_of_squares)) #这个是转化为直接理解的相似度数值,sum_of_squares越大,相似度越小

# 寻找近似用户,计算两个用户的相似度(皮尔逊相关度)

def sim_pearson(prefs,p1,p2):# 得到shared_items两个用户都给出评分的电影列表si={}for item in prefs[p1]:if item in prefs[p2]:si[item] =1# 得到列表元素的个数n =len(si)# 如果两个人没有共同之处,则返回1if n==0:return 1# 对所有偏好求和sum1 =sum([prefs[p1][it] for it in si])sum2 =sum([prefs[p2][it] for it in si])#求平方和sum1Sq = sum([pow(prefs[p1][it],2) for it in si])sum2Sq = sum([pow(prefs[p2][it],2) for it in si])#求乘积之和pSum = sum([prefs[p1][it]*prefs[p2][it] for it in si])#计算皮尔逊评价值num = pSum-(sum1*sum2/n)den = sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))if den ==0:return  0r = num/denreturn r

3.为相近用户打分排序

# 计算其他用户与某名用户的相似度并根据相似度进行排序

def topMatchers(prefs,person,n,similarity=sim_pearson): #similarity指定计算相似度的算法scores =[(similarity(prefs,person,other),other) for other in prefs if other!=person]scores.sort()scores.reverse()return scores[0:n]

4.推荐物品

此时,我们可以单纯的从相近用户中没有观看过的电影列表中直接进行推荐,但是这种做法太过随意。我们想要针对一部电影,从其他用户与目标用户的相似度以及他们对该部的电影评分求加权平均值,这也是所预期的目标用户会对某部电影的评分值。根据评分值的大小对推荐列表进行排序。

def getRecommendations(prefs,person,similarity=sim_pearson):
totals ={} # 用来存储 相似度*每个用户评分  的和
simSums = {} # 用来存储 相似度 的和for other in prefs:# 不和自己比较if other ==person :continuesim = similarity(prefs,person,other)# 忽略相似度为零或小于零的情况if sim<=0: continuefor item in prefs[other]: # 对某个其他用户看过的电影进行迭代# 只对自己还未曾看过的影片进行评价if item not in prefs[person] or prefs[person][item] ==0:# 相似度*评价值totals.setdefault(item,0) # if key is in the dictionary ,return its value,if not,insert key wit a  value of defaulttotals[item]+=prefs[other][item]*sim# 相似度之和simSums.setdefault(item,0)simSums[item]+=sim# 建立一个归一化列表
rankings =[(total/simSums[item],item) for item,total in totals.items()]
# 返回经过排序的列表
rankings.sort()
rankings.reverse()
return rankings

5.推荐结果

#欧几里得距离评价:

[(3.457128694491423, 'The Night Listener'), (2.7785840038149243, 'Lady in the Water'), (2.422482042361916, 'Just My Luck')]

皮尔逊相关度评价:

[(3.3477895267131013, 'The Night Listener'), (2.832549918264162, 'Lady in the Water'), (2.5309807037655645, 'Just My Luck')]

提供推荐——协作型过滤相关推荐

  1. 《集体智慧编程》笔记(2 / 12):提供推荐

    Making Recommendations 文章目录 协作型过滤 搜集偏好 寻找相近的用户 欧几里得距离评价 皮尔逊相关度评价 应该选用哪一种相似性度量方法 为评分者打分 推荐物品 匹配相似商品 构 ...

  2. 【集体智慧编程】第二章、提供推荐

    一.前言 本章即将告诉大家,如何根据群体偏好来为人们提供推荐.有许多针对于此的应用,如:在线购物中的商品推荐.热门网站的推荐,以及帮助人们寻找音乐和影片的应用.本章将告诉你如何构筑一个系统,用以寻找具 ...

  3. 92 推荐算法——相似性推荐和协同过滤

    1 基于相似性的推荐流程 用户偏好如何收集 用户偏好如何整合 大多数情况我们提取的用户行为都多于一种,如何组合这些不同的用户行为,基本上有以下两种方式: 不同的行为分组 一般可以分为"查看& ...

  4. 伯克利人工智能研究院最新研究:协作型工业机器人如何更智能?

    原文来源:BAIR 作者:Changliu Liu.Masayoshi Tomizuka 「雷克世界」编译:嗯~阿童木呀.我是卡布达 在现代工厂中,工人和机器人是两大主要劳动力.出于安全考虑,这两者通 ...

  5. Abbirb120型工业机器人_优傲UR5协作型机器人注塑台湾工厂的机器换人项目

    简介 百泰齐股份有限公司在塑料注塑生产在线导入了四台UR5协作型机器人,主要负责搬运.码垛跟夹取商品进行检测等环节.UR协作型机器人灵活的手臂跟编程能力,非常适合运用在需要复杂人体工学的产线环节中,成 ...

  6. 提供推荐--集体智慧编程

    背景:购物平台商品推荐算法介绍 数据:影评者对几部影片的打分情况,寻找人们在品味上的相似程度.通过相似度评价值进行推荐.评价值体系:欧几米德距离和皮尔逊相关度 critics = {'Lisa Ros ...

  7. AI 组队在 Dota 2 五对五团战中首次战胜人类,协作型人工智能的里程碑式突破...

    (点击上方公众号,可快速关注) 综合自:深科技.机器之心 2018 年 6 月 26 日,由马斯克和 Sam Altman 创立的著名人工智能非营利组织  OpenAI 宣布这一重大里程碑:他们开发的 ...

  8. 基于神经网络的推荐算法,协同过滤推荐算法python

    大数据运维的主要工作内容是什么? . 大数据相关工作岗位很多,有大数据分析师.大数据挖掘算法工程师.大数据研发工程师.数据产品经理.大数据可视化工程师.大数据爬虫工程师.大数据运营专员.大数据架构师. ...

  9. 从油漆罐到协作型BPM

    1          油漆罐也可以是艺术作品 一个世纪以来,油漆桶都是笨重的金属结构,使用的时候需要用扳手将螺丝一个个的拧开,要用一块湿抹布擦干溢出涂料,密封时需要用锤子敲敲打打,油漆桶历来给人的印象 ...

最新文章

  1. c语言文件 加载内存吗,把文件中的数据加载到内存进行查找C语言实现.docx
  2. 开发日记-20190903 关键词 C程序gcc编译过程
  3. python集合是有序的吗_python set有序吗
  4. html5移动开发入门知识
  5. Mybatis源码解析:sql参数处理(2)
  6. 了解png 格式,绝对是让你PPT设计感瞬间爆棚的大杀器
  7. rust腐蚀深井_深井开采中的地压现象致因分析及措施_高光
  8. [大妈吐糟] 虾米音乐的系列猜想
  9. web安全day5:DNS部署与安全
  10. 李洪强iOS开发之OC[011] - 有参方法的声明实现以及调用练习
  11. fread函数 linux在哪,fread函数返回值
  12. VS如何安装.nupkg文件
  13. Python制作经典的吃豆豆小游戏
  14. Matlab实现常见的插值算法
  15. 南海云课堂春季11(T)K1 拓展:单调队列
  16. 原生Js放大镜实例(附图附讲解可直接复制研究使用,小白福利)
  17. Angular防抖指令——输入事件
  18. Git rebase(变基)操作详解
  19. css实现文字越界省略,且后面紧跟一个图标
  20. 阿里云服务器|centos查看并发数调优

热门文章

  1. C#中String与 StringBuilder 的区别
  2. C#调用非托管C++DLL:通过托管C++DLL间接调用
  3. 人生苦短,我用python+vscode
  4. mysql ios 工具_IOS工具(三)安装mysql
  5. MultipartFile(文件的上传)--CommonsMultipartResolver
  6. 如何查看一个linux用户的口令保留策略
  7. Slab,小对象也能搞出大事情
  8. JAVA常见算法题(十三)
  9. puppet 类、模块
  10. DNS原理及其解析过程