任务3 实现用户和物品的相似性计算
任务3 实现用户和物品的相似性计算
根据协同过滤基础资料当中的相似度的定义,主要有以下几种。
由于下面三种相似度的计算涉及到大量的矩阵运算,我采用了pytorch来实现。
物品和用户计算相似度其实是一样的,只需要将打分矩阵转置一下即可。下面我就只以用户相似度的计算为例
1. 杰卡德(Jaccard)相似系数
定义
这个是衡量两个集合的相似度一种指标。两个用户 u u u和 v v v交互商品交集的数量占这两个用户交互商品并集的数量的比例,称为两个集合的杰卡德相似系数,用符号 s i m u v sim_{uv} simuv表示,其中 N ( u ) , N ( v ) N(u),N(v) N(u),N(v)分别表示用户 u u u和用户 v v v交互商品的集合。
s i m u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ sim_{uv}=\frac{|N(u) \cap N(v)|}{\sqrt{|N(u)| \cup|N(v)|}} simuv=∣N(u)∣∪∣N(v)∣ ∣N(u)∩N(v)∣
由于杰卡德相似系数一般无法反映具体用户的评分喜好信息, 所以常用来评估用户是否会对某商品进行打分, 而不是预估用户会对某商品打多少分。
代码实现
def SimJaccardS(ratings):sim1 = (ratings > 0).float()# 把打分矩阵变成0和1的矩阵,1就是有打分行为,0就是没有打分行为# 计算分母部分,用矩阵表示来计算算起来快一点,要计算两个0-1向量a,b为并集当中1的个数大概分成3部分来算# 先计算a中不为1但b中为1的元素个数,再计算a,b当中都为1的元素个数,再计算a中为1但b中不为1的元素个数,最后求和norm1 = torch.mm(1 - sim1, sim1.T) + torch.mm(sim1, sim1.T) + torch.mm(sim1, 1 - sim1.T)# print(norm1)# 由于是0-1向量,交集中1的个数直接算向量积就行了sim1 = torch.mm(sim1, sim1.T)# print(sim1)# 最终结果sim1 = sim1 / torch.sqrt(norm1)# 由于自己和自己计算相似度没啥意义,所以直接把对角线填成0sim1 = sim1.fill_diagonal_(fill_value=0)return sim1
测试一下
生成测试数据
test1 = torch.randint(low=0, high=2, size=(5, 6)).float()
test1
tensor([[1., 1., 0., 0., 1., 1.],[0., 0., 1., 0., 1., 1.],[0., 0., 1., 1., 0., 0.],[1., 1., 1., 0., 0., 1.],[1., 1., 0., 0., 1., 1.]])
SimJaccardS(test1)
tensor([[0.0000, 0.1667, 0.0000, 0.1875, 0.2500],[0.1667, 0.0000, 0.1667, 0.1667, 0.1667],[0.0000, 0.1667, 0.0000, 0.1250, 0.0000],[0.1875, 0.1667, 0.1250, 0.0000, 0.1875],[0.2500, 0.1667, 0.0000, 0.1875, 0.0000]])
我们手算第一个行向量与第二个行向量的Jaccard相似度来验证一下
分子部分为:2, 分母部分为 5 \sqrt{5} 5 , 最终相似度为 2 5 ≈ 0.8944 \frac{2}{\sqrt{5}} \approx 0.8944 5 2≈0.8944
tensor([[0.0000, 0.8944, 0.0000, 1.3416, 2.0000],[0.8944, 0.0000, 0.5000, 0.8944, 0.8944],[0.0000, 0.5000, 0.0000, 0.4472, 0.0000],[1.3416, 0.8944, 0.4472, 0.0000, 1.3416],[2.0000, 0.8944, 0.0000, 1.3416, 0.0000]])
算法基本正确
2. 余弦相似度
余弦相似度衡量了两个向量的夹角,夹角越小越相似。这个应该不难理解,公式如下
s i m u v = c o s ( u , v ) = u ⋅ v ∣ u ∣ ⋅ ∣ v ∣ sim_{uv} = cos(u,v) =\frac{u\cdot v}{|u|\cdot |v|} simuv=cos(u,v)=∣u∣⋅∣v∣u⋅v
代码实现如下
def SimCos(ratings):sim1 = ratings.clone()norm1 = sim1.norm(p=2, dim=1).reshape(1, -1) #对行向量求范数sim1 = torch.mm(sim1, sim1.T) #计算的是分子部分norm1 = torch.mm(norm1.T, norm1) # 分母部分sim1 = sim1 / norm1 # 最终结果sim1 = sim1.fill_diagonal_(fill_value=0) # 对角线填充0,原因同Jaccardreturn sim1
测试例子,这个例子是参考资料里面给出的,省的手算了。
test = torch.tensor([[5,3,4,4],[3,1,2,3],[4,3,4,3],[3,3,1,5],[1,5,5,2]], dtype=torch.float32
)
SimCos(test)
0.975答案符合手算的结果
tensor([[0.0000, 0.9753, 0.9922, 0.8907, 0.7967],[0.9753, 0.0000, 0.9436, 0.9116, 0.6748],[0.9922, 0.9436, 0.0000, 0.8528, 0.8581],[0.8907, 0.9116, 0.8528, 0.0000, 0.6708],[0.7967, 0.6748, 0.8581, 0.6708, 0.0000]])
3. 皮尔逊相关系数
余弦相似度的计算公式为
s i m u v = ∑ i r u i ∗ r v i ∑ i r u i 2 ∑ i r v i 2 sim_{uv} = \frac{\sum_i r_{ui}*r_{vi}}{\sqrt{\sum_i r_{ui}^2}\sqrt{\sum_i r_{vi}^2}} simuv=∑irui2 ∑irvi2 ∑irui∗rvi
再看看皮尔逊相关系数的计算公式为
s i m ( u , v ) = ∑ i ∈ I ( r u i − r ˉ u ) ( r v i − r ˉ v ) ∑ i ∈ I ( r u i − r ˉ u ) 2 ∑ i ∈ I ( r v i − r ˉ v ) 2 sim(u,v)=\frac{\sum_{i\in I}(r_{ui}-\bar r_u)(r_{vi}-\bar r_v)}{\sqrt{\sum_{i\in I }(r_{ui}-\bar r_u)^2}\sqrt{\sum_{i\in I }(r_{vi}-\bar r_v)^2}} sim(u,v)=∑i∈I(rui−rˉu)2 ∑i∈I(rvi−rˉv)2 ∑i∈I(rui−rˉu)(rvi−rˉv)
差别就是把 r u i r_{ui} rui替换成了 r u i − r ˉ u r_{ui}-\bar r_u rui−rˉu,稍微改动一下即可
def SimPearson(ratings):sim1 = ratings - ratings.mean(dim=1).view(-1, 1) #对行向量计算均值,然后用行向量减去均值,得到新的矩阵return SimCos(sim1) #将新的矩阵传入到计算余弦相似度的函数当中
还是用这个例子测试
test = torch.tensor([[5,3,4,4],[3,1,2,3],[4,3,4,3],[3,3,1,5],[1,5,5,2]], dtype=torch.float32
)
SimPearson(test)
0.8528和上面手算的结果相符合。
tensor([[ 0.0000, 0.8528, 0.7071, 0.0000, -0.7921],[ 0.8528, 0.0000, 0.3015, 0.4264, -0.8866],[ 0.7071, 0.3015, 0.0000, -0.7071, -0.1400],[ 0.0000, 0.4264, -0.7071, 0.0000, -0.5941],[-0.7921, -0.8866, -0.1400, -0.5941, 0.0000]])
结束
三种相似度的计算的实现大致如上,以后有空再利用这些相似度来实现一下userCF和itemCF。
任务3 实现用户和物品的相似性计算相关推荐
- 基于物品的协同过滤mysql_使用Mahout基于用户和物品相似度进行协同过滤推荐内容...
基于用户User协同过滤 package mahout; import java.io.File; import java.io.IOException; import java.util.List; ...
- Java语言开发在线购物推荐网 购物商城推荐系统 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、人工智能、机器学习项目开发
Java语言开发在线购物推荐网 购物商城推荐系统 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据.人工智能.机器学习项目开发ShopRec ...
- Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发
Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...
- Java语言springboot开发框架实现个性化美食推荐网 在线美食推荐系统 基于用户、物品的协同过滤推荐算法实现
Java语言springboot开发框架实现个性化美食推荐网 在线美食推荐系统 基于用户.物品的协同过滤推荐算法实现WebFoodRecSystem 一.项目简介 1.开发工具和使用技术 IDEA/E ...
- Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发
Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...
- 使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户、物品的协同过滤推荐算法实现 大数据、人工智能、机器学习项目开发
使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户.物品的协同过滤推荐算法实现 大数据.人工智能.机器学习项目开发Fo ...
- 使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习、人工智能、大数据开发
使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习.人工智能.大数据开发 ...
- 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline
使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...
- Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发
Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...
最新文章
- Nature:全球表层土微生物组群落结构和功能
- pytorch使用empty跟内建函数random_进行初始化Tensor
- 华表 单元格公式设定与计算
- glut64位操作系统安装
- 2021年李永乐6套卷一道无穷小定义的题目
- 《Windows Server 2012 Hyper-V虚拟化管理实践》——3.2 Hyper-V主机日常管理
- 写给大数据开发初学者的话5
- oracle rlw,Oracle数据库终于支持R语言 发力数据挖掘
- r语言数据变量分段_使用R语言实现数据分段
- Struts项目中引入了过滤器filter后出现中文乱码情况
- 图像坐标球面投影_比较常用的坐标几种投影
- [WP8.1UI控件编程]Windows Phone动画方案的选择
- 天涯怎么引流到qq?天涯社区如何靠发帖子引流?
- 2021-05-01微信小程序存储数据的几种方式
- 2015 ACOUG 年终总结感恩会圆满落幕
- C语言:变量存储类别
- 提前还清房贷的感觉真好
- 炼油厂将abc三种原油 matlab求解,某工厂制造三种产品A、B和C需要两种资源(劳动力和原材料),目标是要确定总利润最大的最优生产计划。列出的线性...
- 在浏览器输入url回车后发生了什么
- nginx.pid-nginx: [error] open() /var/run/nginx.pid failed (2: No such file or direc