机器学习基础:类似度和距离度量到底是什么

类似度度量和距离度量在整个机器学习领域都是很是基础的概念,数据科学家 Gonzalo Ferreiro Volpi 近日经过浅显易懂的推荐系统示例介绍了这些概念以及它们的计算方式。
选自 Medium,做者:Gonzalo Ferreiro Volpi,机器之心编译,参与:Panda。

在推荐系统中,咱们常常谈到「类似度度量」这一律念。为何?由于在推荐系统中,基于内容的过滤算法和协同过滤算法都使用了某种特定的类似度度量来肯定两个用户或商品的向量之间的相等程度。因此总的来讲,类似度度量不只仅是向量之间的距离。git

注:个人全部工做均可在个人 GitHub 页面查看:https://github.com/gonzaferreiro,其中固然也包括本文内容的代码库以及有关推荐系统的更多内容。
在任意类型的算法中,最多见的类似度度量是向量之间夹角的余弦,即余弦类似度。设 A 为用户的电影评分 A 列表,B 为用户的电影评分 B 列表,那么它们之间的类似度能够这样计算:

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

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

以下例所示,来自 www.machinelearningplus.com
算法

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

按照定义,常规余弦类似度反映了方向的差别,而不是位置的差别。所以,使用余弦类似度指标没法考虑到用户评分这样的差别。调整后余弦类似度能够缓解这一问题,具体作法是从每对共同评分的配对减去各自用户的平均评分,其定义以下:bash

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

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

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

顺便一提,在上一篇有关推荐系统的文章中,咱们给出了如下用于计算调整后余弦类似度的函数:
from scipy import spatialdef 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。ui

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

  • 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 共同评分的电影是 x二、x四、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;反之亦然。

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

原文地址:
https://medium.com/dataseries/similarity-and-distance-metrics-for-data-science-and-machine-learning-e5121b3956f8
相关文章
相关标签/搜索