终于搞清楚"相似度"和"距离度量"是什么啦!-程序员宅基地

(给机器学习算法与Python学习加星标,提升AI技能)

选自 Medium

作者:Gonzalo Ferreiro Volpi

本文由机器之心(nearhuman2014)整理

原文:https://medium.com/dataseries/similarity-and-distance-metrics-for-data-science-and-machine-learning-e5121b3956f8

相似度度量和距离度量在整个机器学习领域都是非常基础的概念,数据科学家 Gonzalo Ferreiro Volpi 近日通过浅显易懂的推荐系统示例介绍了这些概念以及它们的计算方式。

在推荐系统中,我们经常谈到「相似度度量」这一概念。为什么?因为在推荐系统中,基于内容的过滤算法和协同过滤算法都使用了某种特定的相似度度量来确定两个用户或商品的向量之间的相等程度。所以总的来说,相似度度量不仅仅是向量之间的距离。

注:我的所有工作都可在我的 GitHub 页面查看:https://github.com/gonzaferreiro,其中当然也包括本文内容的代码库以及有关推荐系统的更多内容。

在任意类型的算法中,最常见的相似度度量是向量之间夹角的余弦,即余弦相似度。设 A 为用户的电影评分 A 列表,B 为用户的电影评分 B 列表,那么它们之间的相似度可以这样计算:

从数学上看,余弦相似度衡量的是投射到一个多维空间中的两个向量之间的夹角的余弦。当在多维空间中绘制余弦相似度时,余弦相似度体现的是每个向量的方向关系(角度),而非幅度。如果你想要幅度,则应计算欧几里德距离。

余弦相似度很有优势,因为即使两个相似的文件由于大小而在欧几里德距离上相距甚远(比如文档中出现很多次的某个词或多次观看过同一部电影的某用户),它们之间也可能具有更小的夹角。夹角越小,则相似度越高。

如下例所示,来自 www.machinelearningplus.com

 

上图统计了 sachin、dhoni、cricket 这三个词在所示的三个文档中的出现次数。据此,我们可以绘出这三个向量的图,从而轻松地看出衡量这些文档的余弦和欧几里德距离的差异:

 

按照定义,常规余弦相似度反映了方向的差异,而不是位置的差异。因此,使用余弦相似度指标无法考虑到用户评分这样的差异。调整后余弦相似度可以缓解这一问题,具体做法是从每对共同评分的配对减去各自用户的平均评分,其定义如下:

我们看看下面这个来自 Stack Overflow 的例子,这能更好地解释余弦相似度和调整过的余弦相似度之间的差异:

假设一位用户为两部电影分别给出了 0~5 的评分。

直观而言,我们可以看到用户 b 和 c 的品味相近,而 a 则颇为不同。但常规的余弦相似度却给出了不一样的结果。在这样的案例中,计算调整后余弦相似度能让我们更好地理解用户之间的相近程度。

顺便一提,在上一篇有关推荐系统的文章中,我们给出了以下用于计算调整后余弦相似度的函数:

from scipy import spatial
def adjusted_cos_distance_matrix(size, matrix, row_column):
    distances = np.zeros((size,size))
    if row_column == 0:
        M_u = matrix.mean(axis=1)
        m_sub = matrix - M_u[:,None]
    if row_column == 1:
        M_u = matrix.T.mean(axis=1)
        m_sub = matrix.T - M_u[:,None]
    for first in range(0,size):
        for sec in range(0,size):
            distance = spatial.distance.cosine(m_sub[first],m_sub[sec])
            distances[first,sec] = distance
    return distances

使用这个函数的方式非常简单,只需输入:

  1. matrix:这就是用户之间的评分或观点等你衡量的东西或你的业务商品的原始矩阵。

  2. row_columns:如果你衡量的是列之间的距离,则设为 1;如果你衡量的是行之间的距离,则设为 0;

  3. size:所得矩阵的所需大小。也就是说,当寻找用户或商品相似度时,这就是用户或商品的数量。所以如果有 500 个不同用户,则距离矩阵的大小就为 500×500。

下面给出了一个参考示例:

  • user_similarity = adjusted_cos_distance_matrix(n_users,data_matrix,0)

  • item_similarity = adjusted_cos_distance_matrix(n_items,data_matrix,1)

最后,我们简要回顾一些可用在推荐系统中计算相似度的其它方法,但也可用于机器学习中其它任何基于距离的算法:

1. 欧几里德距离:如果绘制在 n 维空间中,相似的项取决于彼此之间的相近程度。

2. 皮尔森相关性或相关相似度:告诉了我们两个项之间的相关程度。相关性越高,则相似度越高。

3. 均方差:在于计算用户评分之间的平均平方差。MSE 更侧重于惩罚更大的错误。

然后:

其中 |????????????| 是用户 ???? 和 ???? 都评价过的商品的数量。

用户-用户以及商品-商品相似度示例

我们借助之前介绍推荐系统的文章来简要回顾一下协同过滤的工作方式:假设我喜欢《盲刺客》和《莫斯科绅士》这两本书;我的朋友 Matias 也喜欢《盲刺客》和《莫斯科绅士》,但也还喜欢《Where the crawdads sing》。看起来我与 Matias 有一样的兴趣。所以你可能会想我也会喜欢《Where the crawdads sing》,即使我还没读过它。协同过滤也正是基于这一逻辑,只是你不仅可以比较用户,也可以比较商品。

我们可视化地比较看看推荐系统的用户-用户相似度与商品-商品相似度之间的差异:

用户-用户相似度

 

商品-商品相似度

现在,理解了这一点,我们用下面的示例解释说明一些度量,我认为这清楚辨明了用户-用户以及商品-商品相似度:

用户-用户相似度详解

 

这里给出了一个用户电影评分矩阵。为了以更加实用的方式理解这一点,我们先根据上表计算一下用户 (A, C) 和 (B, C) 的相似度。用户 A 和 C 共同评分的电影是 x2 和 x4,B 和 C 共同评分的电影是 x2、x4、x5。知道了这些信息后,我们计算皮尔森相关性或相关相似度:

A 和 C 之间的相关性比 B 和 C 之间的相关性大。因此,A 和 C 更相似,A 喜欢的电影会被推荐给 C,C 喜欢的也会被推荐给 A。

商品-商品相似度详解

这里的平均商品评分(mean item rating)是给定商品的所有评分的平均(比较看看我们在用户-用户过滤中看到的表格)。这里要计算的不是用户-用户相似度,而是商品-商品相似度。要做到这一点,我们首先需要找到给这些商品评分过的用户,然后再基于这些评分来计算这些商品之间的相似度。我们计算一下电影 (x1, x4) 和 (x1, x5) 之间的相似度。给电影 x1 和 x4 评过分的用户是 A 和 B,而给电影 x1 和 x5 评过分的用户也是 A 和 B。

x1 和 x4 的相似度大于 x1 和 x5 的相似度。基于这些相似度值,如果有任何用户搜索电影 x1,他们将被推荐 x4;反之亦然。

关于推荐系统的内容就到此为止了。但是,请记住相似度度量和距离度量在整个机器学习领域都是非常基础的概念,理解它们对进一步的学习至关重要。

本文为机器之心编译,转载请联系本公众号获得授权。

推荐阅读
兵贵神速!掌握这10个python技巧,让你代码工作如鱼得水!

清华姚班/智班2020级新生来了!中国奥数新晋“一姐”在列,湖南、湖北人数最多

提升工作效率,这些Jupyter Notebook插件你值得拥有!

PyTorch常用代码段整理合集,建议收藏!

详尽实用的 PyCharm 教程,这篇文章值得一看


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28168421/article/details/107328447

智能推荐

centos磁盘分区,格式化,挂载(永久挂载)_centos 永久挂载-程序员宅基地

文章浏览阅读2.8k次。虚拟机,添加新的硬盘进行分区,格式化,挂载的操作_centos 永久挂载

SQL优化-索引 (三)只要建立索引就能显著提高查询速度(转)-程序员宅基地

文章浏览阅读504次。2、只要建立索引就能显著提高查询速度  事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。  从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此..._索引对查询效率非常有用,在建表时就应该建好且建完整

前端项目开发流程_前端开发流程sop-程序员宅基地

文章浏览阅读3.2w次,点赞20次,收藏180次。当前分为以下四个阶段第一阶段库/框架选型(暂定react)第二阶段简单构建优化 NPM管理包node+webpack打包第三阶段JS、CSS模块化开发第四阶段组件化开发 开发过程当中注意:前端安全XSS CSRF攻击等 后期文章中将讲述如何_前端开发流程sop

个人云电脑-推荐方案 - Parsec / Fastlink_parsec 局域网-程序员宅基地

文章浏览阅读1w次。个人云电脑-推荐方案 - Parsec / FastlinkParsec安利原文局域网游戏串流:让我们都做一回「云」玩家Parsec 是游戏串流工具中的新秀。与其他不同的是,Parsec 推荐 PC-PC 间云游戏,不论是局域网还是公网通吃,这就是 Parsec 比较厉害的地方。两台设备之间的流量不通过 Parsec 云服务器,而是 Peer to Peer,Parsec 自己宣称自己使用了很多技术来保证玩家的联机体验。但国内的家庭宽带一般都是 NAT 环境(部分运营商可以._parsec 局域网

linux之find命令,Linux基础知识之find命令详解-程序员宅基地

文章浏览阅读148次。在运维人员操作系统时,要接触大量的文件,为了避免忘记文件存放位置的尴尬,就需要我们有一种文件查找工具的帮忙,下面是两个文件查找工具的详解,locate以及find,分别分享给大家。第一款工具: Locatelocate - find files by namelocate的工作依赖于事先构建好的索引库;查找文件时,直接搜索索引库里记载的文件的位置;索引库的构建:系统自动实现(周期性任务);手动更新..._find -name -r

登录模块 用户认证 SpringSecurity +Oauth2+Jwt_spring security 6+oauth2 +jwt+密码认证-程序员宅基地

文章浏览阅读6.7k次,点赞7次,收藏87次。SpringSecurity Oauth2 jwtSpringSecurity Oauth2 jwt1 用户认证分析1.1 单点登录1.2 第三方账号登录2 认证解决方案2.1 单点登录技术方案2.2 第三方登录技术方案2.2.1 Oauth2认证流程2.2.2 Oauth2在项目的应用2.3 Spring security Oauth2认证解决方案3 Jwt令牌回顾3.1 令牌结构3.2 生成私钥公钥3.3 基于私钥生成jwt令牌3.3.1导入认证服务3.3.2 认证服务中创建测试类3.4 基于公_spring security 6+oauth2 +jwt+密码认证

随便推点

Ubuntu 16.04-18.04中安装 WPS Office 2016 for Linux(集合篇含字体解决方法)简单好用-程序员宅基地

文章浏览阅读1.3w次。金山软件办公套件的最新更新 WPS 2016 for Linux,日前发布了几项新功能,性能改进和各种修复。为什么选择WPS办公套件?WPS Office由三个主要组件组成:WPS 文字,WPS 演示和WPS 表格。它看起来非常类似于Microsoft Office! 与Microsoft Office提供的文档格式(包括PPT,DOC,DOCX,XLS和XLSX)完全兼容性。WPS的个人版是供个..._wps office 2016 for linux

python 偏最小二乘回归实现-程序员宅基地

文章浏览阅读8k次,点赞8次,收藏95次。用自己数据实现偏最小二乘回归。用Hitters数据集做演示如何使用自己的数据实现偏最小二乘回归。 此数据集有322个运动员的20个变量的数据, 其中的变量Salary(工资)是我们关心的。数据下载百度网盘链接:https://pan.baidu.com/s/13pb7VN_kTzV0hUEsg-1S1A提取码:3333import pandas as pdimport numpy as npfrom sklearn.cross_decomposition import PLSRegression_python 偏最小二乘回归

Java基础---数据类型、类型转换、字符串 基础-程序员宅基地

文章浏览阅读368次,点赞7次,收藏8次。记住常用的基本数据类型int,double熟悉位数: byte8位,int 32位等等记住特性: long需要加L,flaot需要加F,char必须是单引号且只有一个2.1类型转换数据类型转换, 即 它们之间可以变换.2.1.1默认转换按照数据的表示范围, 小范围向大范围转换,可以默认进行// 类型转换默认进行(小转大)long b = a;2.1.2强制转换通过强制转换,可以将数据转换过去,但是有可能丢失精度口诀: 小转大默认进行,大转小强制进行3.1字符串。

uniapp h5后台地址配置_uniapp配置后台ip-程序员宅基地

文章浏览阅读2.5k次。"h5" : { "sdkConfigs" : { "maps" : {} }, "router" : { "base" : "./" }, "devServer" : { "port" : 8080, "disableHostCheck" : true, "proxy" : { ..._uniapp配置后台ip

centos7日志文件_CentOS7的journalctl日志查看方法-程序员宅基地

文章浏览阅读1k次。1、概述日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从message这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。2、查看所有日志(默认情况下 ,只保存本次启动的日志)[root@CEN..._journalctl -b 0

Spring Boot 注入静态成员变量_静态成员变量怎么注入-程序员宅基地

文章浏览阅读535次。前言: 在属性被 static 修饰后,Spring 便不能直接对变量进行直接注入,这是因为被 static 修饰后,会被放到常量池中,而Spring 需要使用set方法进行注入,这是就需要我们手动进行配置注入成员变量第一步:在类上添加@Component注解,让Spring扫描到这个类第二步:为成员变量添加set方法,注意去掉static关键字,否则会导致注入失败第三步:在set方法上添加@Resource注解,告诉Spring自动注入这个方法/** * @author: mi_静态成员变量怎么注入

推荐文章

热门文章

相关标签