1.2 向量距离计算
前面详细讲解了如何使用向量来表示各类特征。除了将向量作为特征输入模型,我们有时也需要通过向量之间的距离来衡量特征之间的差异。
有多种方法可以度量向量之间的距离,每种方法都有其应用场景和优缺点。这些方法有一些共性,列举如下。
● 同一性:d(x,y)=0,同一点到自身的距离为0。此时,也可以写成x=y。
● 非负性:d(x,y)≥0,距离不能小于0。
● 对称性:d(x,y)=d(y,x)。
● 直递性:d(x,y)≤d(x,z)+d(z,y)。
很明显,有多种函数可以同时满足上述条件,理论上,这些函数都可用于度量距离。但是,这些函数中的大部分在机器学习中并不常用。下面介绍机器学习中的常用距离。
欧氏距离(Euclidean Distance)是机器学习中最为常见的距离之一,它源自两点之间的距离公式。两个特征向量分别为
x=[x1,x2,…,xn]T
y=[y1,y2,…,yn]T
欧氏距离的计算公式如下。
dEuclidean(x,y)常写作‖x,y‖。特别地,‖x‖表示x与原点之间的欧氏距离,‖x‖=。
曼哈顿距离(Manhattan Distance)也可用于度量两点之间的距离。想象一下:你在曼哈顿街头,要开车从一个十字路口到另一个十字路口,实际的驾驶距离是这两个十字路口之间的直线距离吗?显然不是——除非你能穿越大楼。这里的实际驾驶距离就是曼哈顿距离。曼哈顿距离也称为城市街区距离(City Block Distance),其计算公式如下。
dManhattan(x,y)常写作|x,y|。特别地,|x|表示x与原点之间的曼哈顿距离,即|x|=。
在国际象棋棋盘上,国王可以朝8个方向移动。国王移动到目标点所需的步数就是切比雪夫距离(Chebyshev Distance)。切比雪夫距离用于计算各维度数值差中的最大值,计算公式如下。
dChebyshev(x,y)=max(|x1-y1|,|x2-y2|,…,|xn-yn|)
切比雪夫距离和曼哈顿距离的区别在于:在斜向移动时,曼哈顿距离所需的距离为2,切比雪夫距离所需的距离为1。
广义圆可以定义为到圆心距离相等的点的集合。使用以上三种距离画出来的“圆”,如图1-4所示。
图1-4
闵可夫斯基距离(Minkowski Distance)的计算公式如下。
其中,p是一个变参数。
闵可夫斯基距离公式是一个通项公式。以上介绍的三种距离其实都是闵可夫斯基距离的特例。
● 当p=1时,就是曼哈顿距离。
● 当p=2时,就是欧氏距离。
● 当p→∞时,就是切比雪夫距离。
以上三种距离都有一个缺点,就是容易受特征量纲的影响。例如,用一个2维特征表示人的体重和身高,体重的单位为千克,身高的单位为毫米,如[60,1700]T。此时,体重的数量级远小于身高,这会导致在计算距离时放大身高的作用。
我们以欧氏距离为例,讨论如何解决这个问题。对数据进行归一化,即将各个维度的均值和方差分别归一至(0,1),以消除量纲不同带来的差异。归一化在各个维度独立进行,公式如下。
σi为第i维特征所对应的标准差。修正后的距离计算公式如下。
上述距离称作标准化欧氏距离(Standardized Euclidean Distance)。
在提取特征时,特征之间并不是独立的,维度之间往往存在冗余。例如,体重和身高之间就存在较强的相关性。特征冗余带来的影响是:某些因素在各个维度重复出现,在计算距离时会被重复计算,从而使其影响被放大。为了降低特征冗余的影响,可以使用马氏距离(Mahalanobis Distance)进行计算,公式如下。
这里使用了向量的表示方式。Σ为各维度的协方差矩阵,其中,对角线元素表示各维度自身的方差,非对角线元素表示各维度之间的相关性。可以看出,对于马氏距离,如果不考虑特征之间的相关性(非对角线元素为0),就会退化为标准欧氏距离。在使用标准欧氏距离或马氏距离时,因为涉及估计方差(协方差矩阵),所以需要一定的数据量,且数据量越大,方差(协方差矩阵)的估计结果越准。
我们用one-hot向量表示观影者所观看的电影的特征。假设有5部电影,那么向量的维度为5维。在看过的电影的特征位置写1,在没看过的电影的特征位置写0。观影者有2个人。我们是否可以通过one-hot向量之间的距离来度量他们的观影习惯的差异呢?答案是:不可以。因为我们无法确定他们都看过这5部电影——如果没有观影,那么自然无法提供关于喜好的信息,而在都为0的位置计算出来的距离是没有意义的。
假设观影者有3个人,user1和user2共同观看了两部电影,user1和user3共同观看了一部电影,则他们的观影情况所对应的向量分别为
user1=[1,0,0,1,0]
user2=[1,0,1,1,0]
user3=[0,0,0,1,0]
而我们的期望是user1和user2的距离更近。使用欧氏距离计算user1和user2、user1和user3的距离,公式如下。
dEuclidean(user1,user2)=1
dEuclidean(user1,user3)=1
user1和user2、user1和user3的欧氏距离相等,与我们的期望不符。因此,欧氏距离不能在此场景中有效度量观影习惯的差异。
然而,对于两个人都看过的电影,即两个人都为1的位置,却能反映出这两个人的喜好相同。可以使用Jaccard距离度量两个集合之间的差异,计算公式如下。
在这里,A和B分别为这两个人看过的电影的集合,A∩B为这两个人看过的电影的交集,A∪B为这两个人看过的电影的并集。使用Jaccard距离进行计算,公式如下。
显然,此时dJaccard(user1,user2)<dJaccard(user1,user3),user1和user2的距离比较近,这也符合我们的认知。
Jaccard距离的用途很广,可用于度量购物偏好的差异、文章内容的差异等具有同质集合属性的特征。
在机器学习中,除了距离,也常使用相似度来度量两个向量。顾名思义,两个向量的相似度越高,说明它们越相似。因此,相似度和距离反相关。
余弦相似度(Cosine Similarity)是一种常见的相似度,其计算公式如下。
余弦相似度的值域是[-1,+1]。它用于衡量两个向量的夹角,夹角越小,两个向量就越相似。+1表示两个向量的相似度相同,即两个向量的方向完全相同(cos0=1)。-1则表示两个向量的方向完全相反(cosπ=-1),此时两个向量高度负相关。当余弦相似度为0时,两个向量是互相垂直的,称作正交。相互正交的向量彼此线性无关。
余弦相似度,如图1-5所示。
图1-5
可以看出,余弦相似度和向量的长度无关,它是用来衡量各个维度比例的相似性的。当两个向量各个维度的比例相同时,它们的夹角为0,相似度为1。
称为向量x和y的内积,记作。内积可以理解成未归一化的余弦相似度,值域为(-∞,+∞),有时也用于度量向量的相似性。‖x‖为归一化因子,用于将向量x的长度归一至1。相比较而言,cos(x,y)只考虑了x和y的角度差,〈x,y〉则综合考虑了x和y的角度差与长度差。
有时需要将余弦相似度转换为余弦距离,公式如下。
dcos(x,y)=1-cos(x,y)
特别地,当‖x‖=1、‖y‖=1时,dcos(x,y)和dEuclidean(x,y)有如下关系。
即欧氏距离和余弦相似度之间存在单调关系。