协同过滤算法及python实现


1.算法简介

协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐。也就是常见的“猜你喜欢”,和“购买了该商品的人也喜欢”等功能。它的主要实现由:
  ●根据和你有共同喜好的人给你推荐
  ●根据你喜欢的物品给你推荐相似物品
  ●根据以上条件综合推荐
  因此可以得出常用的协同过滤算法分为两种,基于用户的协同过滤算法(user-based collaboratIve filtering),以及基于物品的协同过滤算法(item-based collaborative filtering)。特点可以概括为“人以类聚,物以群分”,并据此进行预测和推荐。

2.基于用户(User-Based)的协同过滤算法

  1. 算法简介
    基于用户的 CF 就是从用户出发,基于用户对物品的偏好找到和目标用户兴趣相似的用户集合;然后找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。找到的用户集合中的用户可以是一个,也可以是多个,一般默认为一个用户,也就是默认只找到找到一个最相似用户。
    2.相似度计算
    根据用户-商品评分矩阵计算用户之间的相似度。计算相似度常用的方法有余弦算法、修正余弦算法、皮尔逊算法等等(这里以余弦算法为例)。余弦算法公式如图1所示:

3.计算用户u对未评分商品的预测分值
首先根据上一步中的相似度计算,寻找用户u的邻居集N∈U,其中N表示邻居集,U表示用户集。然后,结合用户评分数据集,预测用户u对项i的评分,计算公式如下所示:

预测用户u对项i的评分; N是最近邻集合;u’是任意一个最近邻居。
其中,s(u,u’)表示用户u和用户u’的相似度。
表示最近邻u’和目标用户u的相似度乘以最近邻u’对项目i的评分。得到预测评分后按照评分高低进行降序推荐。
4.算法流程
1.计算其他用户的相似度,可以使用反查表除掉一部分用户
  2.根据相似度找到与你最相似的K个用户
  3.在这些邻居喜欢的物品中,根据与你的相似度算出每一件物品的推荐度
  4.根据相似度推荐物品
5.具体实施
1.根据用户历史行为信息构建用户-商品评分矩阵,用户历史行为信息包括商品评分、浏览历史、收藏历史、喜好标签等,本文以单一的商品评分为例,后期介绍其他行为信息和混合行为信息,用户-商品评分矩阵如表1所示:

2.目标:向用户x推荐可能感兴趣的商品。(这里以用户C为例
3.算法实现:
数据描述 数据为用户,以及用户购买的商品,评分。

6.python 代码

import numpy as np
from math import sqrtdef pex(ls_1,ls_2,M):    #求余弦相似度的函数、可用不同字母表示两用户(ls_1表示用户u、ls_2表示用户v)、M表示评分矩阵的每一行fenzi=0#余弦相似度分子fenmu=0#分母abs_1=0#分母左边绝对值里的值abs_2=0#分母右边绝对值里的值for i in range(M):fenzi += ls_1[i] * ls_2[i]#用户u、v对同一商品的评分积的和abs_1 += pow(ls_1[i],2)#用户u所有评分的平方再开根号abs_2 += pow(ls_2[i],2)fenmu=sqrt(abs_1*abs_2)return fenzi/fenmu#ls_1,ls_2用户相关系数def yuping(lst_u,R,u_u,M,N,n):#求预测评分函数,lst_[i]表示u用户对i的评分, u_u表示用户间的相似度,M:行长,N:列长,n:另一用户#初始化fenzi=0fenmu=0aver_1=0#平均值aver_2=0#求平均值 需要知道总个数和总评分a=0#当前u用户购买物品数量b=0for i in range(M):if lst_u[i]!=0:#lst_[i]表示u用户对i的评分a+=1#用户u购买的总数量aver_1 +=lst_u[i]#用户u对所购买商品的总评分aver_1=aver_1/a#u用户的商品平均分
#用户v对商品的平均分计算for o in range(N):if R[o][m]!=0:for i in range(M):if R[o][i]!=0:b+=1#用户v购买的总数量aver_2 +=R[o][i]aver_2=aver_2/bfenzi+=u_u[n][o]*(R[o][m]-aver_2)#两用户u,v(n,o)间的相似度*(用户o对某商品的评分-用户o的平均值)fenmu+=abs(pex(lst_u,R[o],M))return aver_1+fenzi/fenmu#预测公式R=np.array([[4,0,3,5],#生成原始矩阵R[0,5,4,0],[5,4,2,0],[2,4,0,1],[3,4,5,0]])
N=len(R)#列长
M=len(R[0])#行长
u_u=np.zeros((N,N))#建立用户与用户之间相关性矩阵u_ufor n in range(N):#建立一个对R的循环筛选未评分item并进行预测评分for m in range(N):if n<m:u_u[n][m]=pex(R[n],R[m],M)u_u[m][n]=u_u[n][m]
print("得到的用户-用户相似度矩阵:")
print(u_u)#打印用户与用户相关系数矩阵
user=['A','B','C','D','E']#用户集合
items=['p1','p2','p3','p4']#商品集合for n in range(N):#建立一个对R循环寻找未评分项并且对未评分项进行预测for m in range(M):if R[n][m]==0:R[n][m]=yuping(R[n],R,u_u,M,N,n)if R[n][m]>3:print("将商品{:}推荐给用户{:}".format(items[m],user[n]))
print("评分预测矩阵R^:")
print("{:}".format(R))     

7.实验结果

3. 基于物品(Item-Based)的协同过滤算法

1.算法流程
1.构建用户–>物品的倒排;
2.构建物品与物品的共现矩阵;
3.计算物品之间的相似度,即计算相似矩阵;
4.根据用户的历史记录,给用户推荐物品;
2.具体实施
行表示用户,列表示物品,用户访问商品下:

1.构建用户–>物品的倒排 :
| 物品a | 用户A | 用户B |
| 物品b | 用户A | 用户C |
| 物品c | 用户B | 用户D |
| 物品d | 用户A | 用户D |
| 物品e | 用户C | 用户D |
2.构建物品与物品的共现矩阵
共现矩阵C表示都访问两个物品的用户数,是根据用户物品倒排表计算出来的。如根据上面的用户物品倒排表可以计算出如下的共现矩阵C:

3.计算物品之间的相似度,即计算相似矩阵两个物品之间的相似度 :

|N(i)|表示喜欢物品i的用户数,|N(i)⋂N(j)|表示同时喜欢物品i,j的用户数.
当物品j是一个很热门的商品时,人人都喜欢,那么wij就会很接近于1,即(1)式会让很多物品都和热门商品有一个很大的相似度,所以可以改进一下公式 :

矩阵N(用于计算分母)表示喜欢某物品的用户数(是总的用户数),矩阵N如下所示:

4.计算物品之间的余弦相似矩阵如下 :

5.根据用户的历史记录,给用户推荐物品;最终推荐的是什么物品,是由预测兴趣度决定的。

通俗的说就是:用户u物品j预测兴趣度=用户喜欢的物品i的兴趣度×物品i和物品j的相似度。(S ( j , k ) 表示和物品j 最相似的K 个物品集合、N ( u ) 表示用户喜欢的物品集合。由于i∈N(u)∩S(j,K)很难理解,引入另一种计算方式。

T表示原本的共现评分矩阵,Pa表示新用户对不同商品的评分Ra1 Ra2…Ran。
结果 = T的每一行每个数分别于Pa的每个数相乘的和

如 有新用户E访问了a,d,e。预测其他相似度是:

结果1:0.5 = 01+0.50+0.50+0.51+0*1
Python实现

import numpy as np
from math import sqrtdef pex(ls_1,ls_2,M):    #求余弦相似度的函数fenzi=0#余弦相似度分子fenmu=0#分母abs_1=0#分母左边绝对值里的值abs_2=0#分母右边绝对值里的值for i in range(M):fenzi += ls_1[i] * ls_2[i]abs_1 += pow(ls_1[i],2)abs_2 += pow(ls_2[i],2)fenmu=sqrt(abs_1*abs_2)return fenzi/fenmu#ls_1,ls_2用户相关系数def yuping(lst_u,R,u_u,M,N,n):#求预测评分函数fenzi=0fenmu=0aver_1=0#平均值aver_2=0a=0#当前用户购买物品数量b=0for i in range(M):if lst_u[i]!=0:a+=1aver_1 +=lst_u[i]aver_1=aver_1/afor o in range(N):if R[o][m]!=0:for i in range(M):if R[o][i]!=0:b+=1aver_2 +=R[o][i]aver_2=aver_2/bfenzi+=u_u[n][o]*(R[o][m]-aver_2)fenmu+=abs(pex(lst_u,R[o],M))return aver_1+fenzi/fenmuR=np.array([[4,0,3,5],#生成原始矩阵R[0,5,4,0],[5,4,2,0],[2,4,0,1],[3,4,5,0]])
N=len(R)#列长
M=len(R[0])#行长
u_u=np.zeros((N,N))#建立用户与用户之间相关性矩阵u_u
for n in range(N):#建立一个对R的循环筛选未评分item并进行预测评分for m in range(N):if n<m:u_u[n][m]=pex(R[n],R[m],M)u_u[m][n]=u_u[n][m]
print("得到的用户-用户相似度矩阵:")
print(u_u)#打印用户与用户相关系数矩阵
user=['A','B','C','D','E']#用户集合
items=['a','b','c','d']#商品集合for n in range(N):#建立一个对R循环寻找未评分项并且对未评分项进行预测for m in range(M):if R[n][m]==0:R[n][m]=yuping(R[n],R,u_u,M,N,n)if R[n][m]>3:print("将商品{:}推荐给用户{:}".format(items[m],user[n]))
print("评分预测矩阵R^:")
print("{:}".format(R))     

协同过滤算法及python实现相关推荐

  1. 推荐系统实践----基于用户的协同过滤算法(python代码实现书中案例)

    本文参考项亮的<推荐系统实践>中基于用户的协同过滤算法内容.因其中代码实现部分只有片段,又因本人初学,对python还不是很精通,难免头大.故自己实现了其中的代码,将整个过程走了一遍. 1 ...

  2. 【4】协同过滤算法的原理与实现

    一:协同过滤算法简介 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐.在问的时候,都习惯于问 ...

  3. (四)协同过滤算法之基于用户的推荐算法python实现

    一.背景 关于推荐算法的相关背景介绍,已经在上一个姊妹篇(三)协同过滤算法之基于物品的推荐算法python实现中有所介绍.在此,便不在赘述,本文主要介绍基于用户的协同过滤算法,而对推荐算法不太清楚的朋 ...

  4. (三)协同过滤算法之基于物品的推荐算法python实现

    一.背景介绍 互联网的迅猛发展将人类带入了信息社会和网络经济时代,信息化影响到了生活的方方面面.但是随着互联网产业的扩大,为用户提供更多选的同时也带来了筛选与推荐的难题.于是便提出了推荐算法帮助用户快 ...

  5. Python基于用户协同过滤算法电影推荐的一个小改进

    之前曾经推送过这个问题的一个实现,详见:Python基于用户协同过滤算法的电影推荐代码demo 在当时的代码中没有考虑一种情况,如果选出来的最相似用户和待测用户完全一样,就没法推荐电影了.所以,在实际 ...

  6. python协同过滤算法_协同过滤算法介绍及算法实现

    一.协同过滤算法简介 协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐.也就是常见的"猜你喜欢",和& ...

  7. python基于vue协同过滤算法的图书推荐系统

    可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发目录 开发语言:Python python框架:django/flask 软件版本:python 数据库:m ...

  8. python协同过滤电影推荐_python实现基于用户的协同过滤算法(CF)——以电影评价数据(ml-100k)为例...

    程序简介 项目以ml-100k电影评分数据集为输入,实现了基于用户的协同过滤算法,最后预测的MAE为0.84,因为经过优化,10万条评分数据运行时间不超过2分钟 协同过滤算法(CF)基于对用户历史行为 ...

  9. 协同过滤算法概述与python 实现协同过滤算法基于内容(usr-item,item-item)

    协调过滤推荐概述 协同过滤(Collaborative Filtering)作为推荐算法中最经典的类型,包括在线的协同和离线的过滤两部分.所谓在线协同,就是通过在线数据找到用户可能喜欢的物品,而离线过 ...

  10. 【机器学习项目实战】Python基于协同过滤算法进行电子商务网站用户行为分析及服务智能推荐

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取. 1.项目背景 电子商务网站数量迅速上升,将电子商务网站浏览者变为实际消费者,满 ...

最新文章

  1. matlab中real函数,Matlab中del2()函数学习笔记
  2. java把信息存到文件里,Java 如何将字符串信息直接写保存到文本文件?
  3. AI发现人类肾细胞有一半结构未知,UCSD最新研究登上Nature,算法已开源
  4. oleread.php,PHP的垃圾回收机制详解
  5. 隐层元素闪一下_太阳一直依靠什么元素在燃烧,地球上的重元素又是怎么来的?...
  6. 地宫取宝|2014年蓝桥杯B组题解析第九题-fishers
  7. 利用Scrapy爬取拉勾网某职位信息
  8. 基于python的网易云音乐下载器
  9. 关于 美国大片 与 客户演示PPT
  10. PDF证书加密文件如何解密?
  11. MATLAB随机数的应用ppt,Matlab生成随机数.ppt
  12. python课设参考文献_Python课程设计任务书
  13. 单片机是什么?51单片机和stm32有什么区别?
  14. linux 8t的硬盘格式化,linux 新添加的硬盘格式化并挂载到目录下
  15. 【编程语言】Java夯实基础(一):Java的起源与发展
  16. 1.两数之和(python)
  17. 计算机平面设计教材,《计算机平面设计软件应用——全国中等职业技术学校计算机教材》低价购书_教材教辅考试_孔网...
  18. ImagePullBackOff: Back-off pulling image \gcr.io/google_containers/pause-amd64:3.0 解决方法
  19. 扁平化设计与质感设计: 他们有什么不同?
  20. 浅析wifidog认证流程以及数据交互格式

热门文章

  1. 网络操作系统和分布式操作系统的区别
  2. VB操作access数据库
  3. 【Chatbot】2:中文聊天机器人的实现
  4. matlab平差实习报告,《测量平差》课程设计实习报告 五星文库
  5. NFT 项目的 7 种市场营销策略
  6. Android ActivityManager类
  7. EnableViewState和ViewStateMode
  8. AI:人工智能的本质与未来
  9. 【最新】网站下载工具,整站下载工具汇总
  10. LoadRunner基础入门教程