协同过滤算法及python实现

article/2025/10/19 16:09:17

协同过滤算法及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))     

http://chatgpt.dhexx.cn/article/etetj3qw.shtml

相关文章

协同过滤算法理论

1. 协同过滤算法 协同过滤&#xff08;Collaborative Filtering&#xff09;推荐算法是最经典、最常用的推荐算法。 所谓协同过滤&#xff0c;基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向&…

协同过滤算法实战

简介 公司给了一个任务&#xff0c;要求根据相似度匹配给教师推荐课程。正好复(预)习一下协同过滤算法。直接探索一下协同过滤应用。 目前教师档案大数据系统中存有海量的教师数据&#xff0c;这些数据对于教师的未来决策&#xff0c;预测教师发展路径&#xff0c;推荐教师课…

协同过滤算法(例题理解)

协同过滤算法是一种推荐系统算法&#xff0c;它利用用户对物品的评价数据来预测用户对未评价物品的喜好程度。该算法基于一个简单的思想&#xff1a;如果两个用户在过去对某些物品的评价很相似&#xff0c;那么在未来他们对这些物品的评价也很可能相似。因此&#xff0c;协同过…

python实现协同过滤算法

协同过滤算法常用于商品推荐或者类似的场合&#xff0c;根据用户之间或商品之间的相似性进行精准推荐 协同过滤算法分为&#xff1a; 基于用户的协同过滤算法&#xff08;UserCF算法&#xff09;&#xff08;适合社交化应用&#xff09;基于商品的协同过滤算法&#xff08;It…

java 协同过滤算法_推荐系统中协同过滤算法实现分析

最近研究Mahout比较多&#xff0c;特别是里面协同过滤算法&#xff1b;于是把协同过滤算法的这个实现思路与数据流程&#xff0c;总结了一下&#xff0c;以便以后对系统做优化时&#xff0c;有个清晰的思路&#xff0c;这样才能知道该如何优化且优化后数据亦能正确。 推荐中的协…

协同过滤算法理解

一、协同过滤思想介绍 顾名思义&#xff0c;协同过滤算法的核心思想就是“物以类聚&#xff0c;人以群分”&#xff0c;通过用户对物品的评价和意见&#xff0c;将物品和人聚成几类&#xff0c;从各自的类中挑选出用户可能感兴趣的的物品进行推荐&#xff0c;而代替从直接从海量…

协同过滤推荐算法的原理及实现

一、协同过滤算法的原理及实现 二、基于物品的协同过滤算法详解 一、协同过滤算法的原理及实现 协同过滤推荐算法是诞生最早&#xff0c;并且较为著名的推荐算法。主要的功能是预测和推荐。算法通过对用户历史行为数据的挖掘发现用户的偏好&#xff0c;基于不同的偏好对用户…

协同过滤算法详解

一、协同过滤算法简介 协同过滤算法是一种较为著名和常用的推荐算法&#xff0c;它基于对用户历史行为数据的挖掘发现用户的喜好偏向&#xff0c;并预测用户可能喜好的产品进行推荐。也就是常见的“猜你喜欢”&#xff0c;和“购买了该商品的人也喜欢”等功能。它的主要实现由…

协同过滤算法

目录 一、什么是协同过滤算法 二、相似度的计算 2.1杰卡德&#xff08;Jaccard&#xff09;相似度 2.2余弦相似度&#xff08;Cosine Similarity&#xff09; 2.3皮尔逊相关系数&#xff08;Pearson Correlation Coefficient&#xff09; 2.4欧氏距离&#xff08;Euclidea…

协同过滤推荐算法

一、协同过滤思想简介 二、协同过滤算法原理介绍 三、基于用户的协同过滤算法描述 四、基于物品的协同过滤算法 基于物品的协同过滤算法的优缺点 一、协同过滤思想简介 协同过滤&#xff0c;从字面上理解&#xff0c;包括协同和过滤两个操作。首先我们在外出和朋友吃饭的时候肯…

推荐系统之协同过滤算法

1、介绍 协同过滤算法&#xff08;Collaborative Filtering&#xff09; 是比较经典常用的推荐算法&#xff0c;从1992年一直延续至今。所谓协同过滤算法&#xff0c;基本思想是根据用户的历史行为数据的挖掘发现用户的兴趣爱好&#xff0c;基于不同的兴趣爱好对用户进行划分并…

oracle数据库中spool的作用,Oracle中Spool命令如何使用 Oracle中Spool命令使用方法

Oracle中Spool命令如何使用&#xff1f;本篇文章小编给大家分享一下Oracle中Spool命令使用方法&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家供大家参考&#xff0c;有需要的小伙伴们可以来看看。 方法/步骤 首先需要明白Spool是Oracle的命令而不是sql语句。 Spool命…

oracle的Spool命令

使用spool命令实行将sql*plus中的输出的结果复制到一个指定的文件中&#xff0c;或者把查询的结果 发送到打印机中&#xff0c;直接使用spool off命令为止。 spool命令的语法如下&#xff1a; spool [file_name [create|replace|append] off|out] 其中file_name指定一个操作…

Oracle数据导出spool用法详解

Oracle数据导出spool用法详解 spool可导出select查询的结果集以emp表为例spool命令参数 spool可导出select查询的结果集 在实际的工作中&#xff0c;很多时候我们需要将Oracle中查询的数据导出来&#xff0c;生成excel格式的表以便于处理。虽然plsql可以导数据&#xff0c;但是…

oracle spool命令

1.spool的作用是什么&#xff1f; spool的作用可以用一句话来描述&#xff1a;在sqlplus中用来保存或打印查询结果。 通过spool 命令&#xff0c;可以将select 数据库的内容写到文件中&#xff0c;通过在sqlplus设置一些参数&#xff0c;使得按指定方式写到文件中。 spool 是…

spool命令的使用

&#xff08;一&#xff09;SPOOL是sqlplus中的命令 转自&#xff1a;https://blog.csdn.net/wangnan537/article/details/20706555 可作如下用途&#xff1a; 1)可使用SPOOL保存查询的结果集 [sql] view plain copy SPOOL "C:\test.txt" --生成test.txt文件 ...…

spooling

SPOOLing的含义是什么&#xff1f;试述SPOOLing系统的特点、功能以及控制过程。答&#xff1a;SPOOLing是Simultaneous Peripheral Operation On-Line &#xff08;即外部设备联机并行操作&#xff09;的缩写 SPOOLING &#xff0c;它是关于慢速字符设备如何与计算机主机交换信…

SPOOLing技术

1&#xff0e;什么是SPOOLing 脱机输入、脱机输出技术。 该技术是利用专门的外围控制机&#xff0c;将低速I/O设备上的数据传送到高速磁盘上&#xff0c;或者相反。 引入了多道程序技术后&#xff0c;可以利用进程来模拟脱机输入时的外围控制机功能。这样&#xff0c;外围操作…

SoapUI接口测试-基本操作

SoapUI&#xff1a;http接口测试 GET请求&#xff1a; 1、打开SoapUI工具&#xff0c;点击左上角REST&#xff0c;新建一个REST项目。&#xff08;一般的http接口文档中会有声明此接口遵循RESTful API的设计规范&#xff09;&#xff0c;弹出的框中提示输入接口地址&#xff0c…

SoapUI-一款强大的Rest和Soap测试工具

文章目录 SoapUI-一款强大的Rest和Soap测试工具1.什么是SoapUI2.SoapUi基本使用-Http2.1 构建一个项目2.2 确定项目名2.3 创建测试用例以及用例组2.4 创建一个http请求的测试用例&#xff0c;这里我们用一个天气测试接口测试2.5 运行接口测试 3.SoapUi基本使用-Web Service3.1 …