任务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​=∑i​rui2​ ​∑i​rvi2​ ​∑i​rui​∗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 实现用户和物品的相似性计算相关推荐

  1. 基于物品的协同过滤mysql_使用Mahout基于用户和物品相似度进行协同过滤推荐内容...

    基于用户User协同过滤 package mahout; import java.io.File; import java.io.IOException; import java.util.List; ...

  2. Java语言开发在线购物推荐网 购物商城推荐系统 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线购物推荐网 购物商城推荐系统 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)开发框架 大数据.人工智能.机器学习项目开发ShopRec ...

  3. Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户、物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据、人工智能、机器学习项目开发

    Java语言开发在线音乐推荐网 音乐推荐系统 网易云音乐爬虫 基于用户.物品的协同过滤推荐算法 SSM(Spring+SpringMVC+Mybatis)框架 大数据.人工智能.机器学习项目开发Mus ...

  4. Java语言springboot开发框架实现个性化美食推荐网 在线美食推荐系统 基于用户、物品的协同过滤推荐算法实现

    Java语言springboot开发框架实现个性化美食推荐网 在线美食推荐系统 基于用户.物品的协同过滤推荐算法实现WebFoodRecSystem 一.项目简介 1.开发工具和使用技术 IDEA/E ...

  5. Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户、物品的协同过滤推荐算法 个性化推荐算法、机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线美食推荐网 协同过滤推荐算法在美食网站中的运用 基于用户.物品的协同过滤推荐算法 个性化推荐算法.机器学习.分布式大数据.人工智能开发 FoodRecom ...

  6. 使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户、物品的协同过滤推荐算法实现 大数据、人工智能、机器学习项目开发

    使用Java+SSM(Spring+SpringMVC+Mybatis)开发在线美食推荐网 美食推荐系统 美食天下美食爬虫 基于用户.物品的协同过滤推荐算法实现 大数据.人工智能.机器学习项目开发Fo ...

  7. 使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习、人工智能、大数据开发

    使用Java语言开发在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法实现 SSM(Spring+SpringMVC+Mybatis)开发框架 机器学习.人工智能.大数据开发 ...

  8. 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline

    使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...

  9. Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...

最新文章

  1. Nature:全球表层土微生物组群落结构和功能
  2. pytorch使用empty跟内建函数random_进行初始化Tensor
  3. 华表 单元格公式设定与计算
  4. glut64位操作系统安装
  5. 2021年李永乐6套卷一道无穷小定义的题目
  6. 《Windows Server 2012 Hyper-V虚拟化管理实践》——3.2 Hyper-V主机日常管理
  7. 写给大数据开发初学者的话5
  8. oracle rlw,Oracle数据库终于支持R语言 发力数据挖掘
  9. r语言数据变量分段_使用R语言实现数据分段
  10. Struts项目中引入了过滤器filter后出现中文乱码情况
  11. 图像坐标球面投影_比较常用的坐标几种投影
  12. [WP8.1UI控件编程]Windows Phone动画方案的选择
  13. 天涯怎么引流到qq?天涯社区如何靠发帖子引流?
  14. 2021-05-01微信小程序存储数据的几种方式
  15. 2015 ACOUG 年终总结感恩会圆满落幕
  16. C语言:变量存储类别
  17. 提前还清房贷的感觉真好
  18. 炼油厂将abc三种原油 matlab求解,某工厂制造三种产品A、B和C需要两种资源(劳动力和原材料),目标是要确定总利润最大的最优生产计划。列出的线性...
  19. 在浏览器输入url回车后发生了什么
  20. nginx.pid-nginx: [error] open() /var/run/nginx.pid failed (2: No such file or direc

热门文章

  1. 埃森哲宣布收购工程咨询和服务公司umlaut;Playrix在华为应用市场发布《奇屋寻踪》 | 全球TMT...
  2. 2021年,中国 IoT 物联网企业100强
  3. 分治法之二路归并排序
  4. WPF 控件专题 Expander控件详解
  5. 昨天看了一场过瘾的比赛,让我看到了中国足球下一代的希望。。。。。
  6. ipod-convenience
  7. C++ 动态链接库和静态链接库
  8. 恩智浦arm芯片Linux,基于ARM处理器的工业控制系列【恩智浦】
  9. 关于React首屏白屏问题
  10. 【科普】六旋翼无人机介绍