编者按:之前推出了《推荐系统系列教程》,反响不错,前面已经推出了九期,今天按约推出第十期:协同过滤中的相似度计量方法有哪些?希望朋友们多点“在看”,多多转发,我会在“在看”数超过20后推出下一篇教程。

协同过滤是推荐系统中应用最广泛和最先兴起的算法,今天,我们就来聊聊协同过滤中的一个核心问题:相似度计算方法有哪些?
相似度的本质 
推荐系统中,推荐算法分为两个门派,一个是机器学习派,另一个就是相似度门派。机器学习派是后起之秀,相似度派则是泰山北斗,以致撑起来推荐系统的半壁江山。
近邻推荐顾名思义就是在地理位置上住得近。如果用户有个邻居,那么社交软件上把邻居推荐给他在直观上就很合理,当然,如果邻居姓王的话,就不要推荐了。
这里说的近邻,并不一定只是在三维空间下的地理位置的近邻,在任意高维空间都可以找到近邻,尤其是当用户和物品的特征维度都很高时,要找到用户隔壁的邻居,就不是那么直观,需要选择好用适合的相似度度量办法。
近邻推荐的核心就是相似度计算方法的选择,由于近邻推荐并没有采用最优化思路,所以效果通常取决于矩阵的量化方式和相似度的选择。
相似度,与之配套的还有另一个概念就是距离,两者都是用来量化两个物体在高维空间中的亲疏程度的,它们是硬币的两面。
推荐算法中的相似度门派,实际上有这么一个潜在假设:如果两个物体很相似,也就是距离很近,那么这两个物体就很容易产生一样的动作。
如果两篇新闻很相似,那么他们很容易被同一个人先后点击阅读,如果两个用户很相似,那么他们就很容易点击同一个新闻。这种符合直觉的假设,大部分时候很奏效。
其实属于另一门派的推荐算法——机器学习中,也有很多算法在某种程度看做是相似度度量。
例如,逻辑回归或者线性回归中,一边是特征向量,另一边是模型参数向量,两者的点积运算,就可以看做是相似度计算,只不过其中的模型参数向量值并不是人肉指定的,而是从数据中由优化算法自动总结出来的。
在近邻推荐中,最常用的相似度是余弦相似度。然而可以选用的相似度并不只是余弦相似度,还有欧氏距离、皮尔逊相关度、自适应的余弦相似度、局部敏感哈希等。使用场景各不相同,今天,我们分别一一介绍如下。
相似度的计算方法

数据分类 

在真正开始巡视相似度计算方法前,我们先把度量对象做个简单分类。相似度计算对象是向量,或者叫做高维空间下的坐标,一个意思。那表示这个向量的数值就有两种:
1、实数值
2、布尔值,也就是 0 或者 1。
下面介绍的不同计算方法适用于不同的数据种类。

一、欧氏距离 

欧氏距离,如名字所料,是一个欧式空间下度量距离的方法。两个物体,都在 同一个空间下表示为两个点,假如叫做 p 和 q,分别都是n个坐标。那么欧氏距离就是衡量这两个点之间的距离,从 p 到 q 移动要经过的距离。欧氏距离不适合布尔向量之间。

计算方式可以表示如下:

这个公式就是,每一个坐标上的取值相减,求平方和,最后输出方根。 
显然,欧式距离得到的值是一个非负数,最大值是正无穷。通常相似度计算度 结果希望是 [-1,1] 或者 [0,1] 之间,所以欧氏距离要么无法直接使用到这个场景中,要么需要经过二次转化得到。

距离加1后取倒数。这个公式能够把范围为 0 到正无穷的欧氏距离转换为 0

到 1 的相似度。 

欧氏距离度量的是空间中两个点的绝对差异,适用于分析用户能力模型之间的

差异,比如消费能力、贡献内容的能力等。
当然,虽然欧氏距离计算两个点的距离,实际上,点的坐标表示和我们常说的向量表示是同一回事,希望这句话是废话,你早已懂得。

二、余弦相似度 

大名鼎鼎的余弦相似度,度量的是两个向量之间的夹角,其实就是用夹角的余弦值来度量,所以名字叫余弦相似度。当两个向量的夹角为 0 度时,余弦值为 1,当夹角为 90 度时,余弦值为 0,为 180 度时,余弦值则为 -1。

余弦相似度在度量文本相似度、用户相似度、物品相似度的时候都较为常用;但是在这里需要提醒你一点,余弦相似度的特点:它与向量的长度无关。因为余弦相似度计算需要对向量长度做归一化:

经过向量长度归一化后的相似度量方式,背后潜藏着这样一种思想:两个向量,只要方向一致,无论程度强弱,都可以视为“相似”。

这简直就是:招聘人才时只看价值观,不考核代码能力,只要肯干,搬砖嘛,谁搬不是搬。这样做错不错呢?很显然,有非常大的合理性。

比如,我用140 字的微博摘要了一篇 5000 字的博客内容,两者得到的文本向量可以认为方向一致,词频等程度 同,但是余弦相似度仍然认为他们是相似的。

在协同过滤中,如果选择余弦相似度,某种程度上更加依赖两个物品的共同评价用户数,而不是用户给予的评分多少。这就是由于余弦相似度被向量长度归一化后的结果。

余弦相似度对绝对值大小不敏感这件事,在某些应用上仍然有些问题。

举个例子,用户 A 对两部电影评分分别是 1 分和 2 分,用户 B 对同样这两部电影评分是 4 分和 5 分。 余弦相似度计算出来,两个 户的相似度达到 0.98。这和实际直觉不符,用户 A 明显不喜欢这两部电影。

针对这个问题,对余弦相似度有个改进,改进的算法叫做调整的余弦相似度(Adjusted Cosine Similarity)。调整的方法很简单,就是先计算向量每个维度上的均值,然后每个向量在各个维度上都减去均值后,再计算余弦相似度。

前面这个小例子,用调整的余弦相似度计算得到的相似度是 -0.1,呈现出两个用户口味相反,和直觉相符。

三、皮尔逊相关度 

皮尔逊相关度,实际上也是一种余弦相似度,不过先对向量做了中心化,向量p和 q 各自减去向量的均值后,再计算余弦相似度。

皮尔逊相关度计算结果范围在 -1 到 1。-1 表示负相关,1 表示正相关。皮尔逊相关度其实度量的是两个随机变量是不是在同增同减。
如果同时对两个随机变量采样,当其中一个得到较大的值另一个也较大,其中一个较小时另一个也较小时,这就是正相关,计算出来的相关度就接近1,这种情况属于沆瀣一气,反之就接近 -1。

由于皮尔逊相关度度量的是两个变量的变化趋势是否一致,所以不适合用作计 算布尔值向量之间相关度,因为两个布尔向量也就是对应两个 0-1 分布的随机变 量,这样的随机变量变化只有有限的两个取值,根本没有“变化趋势,高低起 伏”这一说。

四、Jaccard相似度 

Jaccard相似度,是两个集合的交集元素个数在并集中所占的比例。由于集合非常适用于布尔向量表示,所以Jaccard相似度简直就是为布尔值向量私人定做的。对应的计算方式是:

1、分子是两个布尔向量做点积计算,得到的就是交集元素个数;

2、分母是两个布尔向量做或运算,再求元素和。

余弦相似度适用于评分数据,Jaccard相似度适合用于隐式反馈数据。例如,使用户的收藏行为,计算用户之间的相似度,Jaccard相似度就适合来承担这个任务。

总结 

本期,我们介绍了常用的几种相似度计算方法,以及其各自的使用场景。
这里的场景是按照数据形式划分的,按照向量维度取值是否是否是布尔值来看,Jaccard相似度就只适合布尔值向量,余弦相似度弹性略大,适合两种向量。欧氏距离度量的是绝对差异,余弦相似度度量的是方向差异,但是调整的余弦相似度则可以避免这个弱点。
附:最后再唠叨两句,本系列教程全部免费,但希望大家每期都不要落下,这样可成体系,也希望各位粉丝朋友多多转发,并在看完后点个“在看”,以示鼓励。我会在文章“在看”数超过20后推送出下一篇的教程。希望大家都有所收获。
「 更多干货,更多收获 」

推荐系统教程之九:解密“看了又看”和“买了又买”(Item-based)

推荐系统教程之八:人以群分,你是什么人就看到什么世界

推荐系统教程之七:超越标签的内容推荐系统

推荐系统教程之六:从文本到用户画像有多远

推荐系统教程之五:画鬼容易画人难,用户画像的“能”与“不能”

推荐系统教程之四:这些你必须具备的思维模式

推荐系统教程之三:个性化推荐系统那些绕不开的经典话题

推荐系统教程之二:你真的需要搭建个性化推荐系统吗?

推荐系统教程之一:用知识去对抗技术不平等

【推荐算法】基于用户和产品的协同过滤推荐算法

AI换脸APP“ZAO”刷屏并一夜爆火,它能红多久?

今日头条推荐系统原理

feed流设计:那些谋杀你时间的APP

关注我们

智能推荐

个性化推荐技术与产品社区

长按并识别关注

一个「在看」,一段时光!?

推荐系统系列教程之十:协同过滤中的相似度计算方法有哪些?相关推荐

  1. 【重磅推出】推荐系统系列教程之九:解密“看了又看”和“买了又买”(Item-Based)...

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了八期,今天按约推出第九期:解密"看了又看"和"买了又买"(基于物品的协同过滤).希望 ...

  2. 《使用QSortFilterProxyModel实现QTreeView行列过滤》:系列教程之十

    本文属于<QTreeView使用系列教程>之一,欢迎查看其它文章. 一.QSortFilterProxyModel简介 QSortFilterProxyModel的使用比较简单,我们在上一 ...

  3. SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户

    本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上. 系列目录 (1) 微信开发环境的搭建 (2) 如何通过微信公众号消费API (3) 微信用户关注公众号之后,自 ...

  4. sap系统搭建教程_SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户...

    本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上: https://blogs.sap.com/2017/12/10/wechat-development-ser ...

  5. 推荐系统系列教程之十五:一网打尽协同过滤、矩阵分解和线性模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十四期,今天按约推出第十五期:一网打尽协同过滤.矩阵分解和线性模型.希望朋友们多点"在看",多多转发,我 ...

  6. 推荐系统系列教程之十六:深度和宽度兼具的融合模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十五期,今天按约推出第十六期:深度和宽度兼具的融合模型.希望粉丝朋友们多点"在看",多多转发,我会在&q ...

  7. 推荐系统系列教程之十四:经典模型融合方法----线性模型和树模型的组合拳

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十三期,今天按约推出第十四期:经典模型融合办法----线性模型和树模型的组合拳.希望朋友们多点"在看", ...

  8. AutoML在推荐系统协同过滤中的探索与发现(附交流视频和PPT下载链接)

            导读:今天给大家带来第四范式资深研究员.香港科技大学博士姚权铭,在2019年底所做的分享<AutoML在推荐系统协同过滤中的探索与发现>,本文介绍了第四范式研究组将自动化机 ...

  9. java jdbc 教程_java JDBC系列教程之JDBC类的简析与JDBC的基础操作

    什么是JDBC? 概念:JAVA Database Connectivity Javas数据库连接,Java语言操作数据库接口,然后由各个数据库厂商去实现这个接口,提供数据库驱动java包,我们可以使 ...

最新文章

  1. 硬盘分区表知识——详解硬盘MBR(转)
  2. HDU 2546 饭卡(贪心+DP)
  3. msql安装(zip)
  4. python博弈论代码_使用 40 多行的 Python 代码实现一个简单的演化过程
  5. php fopen插入文本_PHP 文件创建/写入
  6. 上海区块链会议演讲ppt_所以您想参加会议演讲吗? 这是我的建议。
  7. [转载]基于Aaf的数据拆分
  8. 机器学习相关——协同过滤
  9. python 服务器框架_python 服务器框架
  10. layui select监听选中的值 二级联动
  11. c#与access建立连接用作登录_SQLServer成功与服务器建立连接,但在登录中发生错误
  12. 开源项目:测试安卓设备摄像头的帧率
  13. paraview热流图(2):3D glyphs representation
  14. xp系统共享服务器怎么设置权限,xp系统局域网设置权限不让其他人访问的方法...
  15. matlab移植linux qt总结 (未实现)(21.8.25 已另寻别径)
  16. 赛效:超级简历在线简历助手教您一键制作简历
  17. 社会神经网络有哪些,神经网络的神经网络
  18. javascript案例30——continue、break
  19. Scikit-Learn与 TensorFlow 机器学习实用指南 中文PDF 免费领取
  20. 计算广告第一章——在线广告综述

热门文章

  1. NFT交易平台Mintable首个提案通过 收入将按比例分配给MINT代币持有者
  2. PYcharm简单安装教程
  3. Python---String 字符串类型
  4. flutter - fluro
  5. Jmeter(二)目录介绍
  6. java中的dao模式
  7. 卷积神经网络之ResNet网络模型学习
  8. firebug js版
  9. 【BZOJ-14492895】球队收益球队预算 最小费用最大流
  10. C++中的string