在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如K最近邻(KNN)和K均值(K-Means)。当然衡量个体差异的方法有很多,最近查阅了相关的资料,这里整理罗列下。

我们先来看看距离的定义:

1)  d(x,y) >= 0                           正定性

2)  d(x,y) = d(y,x)                        对称性

3)  d(x,k)+ d(k,y) >= d(x,y)       三角不等式

为了方便下面的解释和举例,先设定我们要比较X个体和Y个体间的差异,它们都包含了N个维的特征,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面来看看主要可以用哪些方法来衡量两者的差异,主要分为距离度量和相似度度量。

一、距离度量

距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大。

1、欧氏距离(Euclidean Distance)

欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

2、闵可夫斯基距离(Minkowski Distance)

明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述。公式如下:

这里的p值是一个变量,当p=1时,就是下面的曼哈顿距离;当p=2的时候就得到了上面的欧氏距离;当p→∞时,就是下面的切比雪夫距离。

我们知道平面上到原点欧几里得距离(p = 2)为 1 的点所组成的形状是一个圆,当 p 取其他数值的时候呢?

注意,当 p < 1 时,闵可夫斯基距离不再符合三角形法则,举个例子:当 p < 1, (0,0) 到 (1,1) 的距离等于 (1+1)^{1/p} > 2, 而 (0,1) 到这两个点的距离都是 1。

闵可夫斯基距离比较直观,但是它与数据的分布无关,具有一定的局限性,如果 x 方向的幅值远远大于 y 方向的值,这个距离公式就会过度放大 x 维度的作用。所以,在计算距离之前,我们可能还需要对数据进行 z-transform 处理,即减去均值,除以标准差:

其中, \mu : 该维度上的均值,  \delta : 该维度上的标准差

可以看到,上述处理开始体现数据的统计特性了。这种方法在假设数据各个维度不相关的情况下利用数据分布的特性计算出不同的距离。如果维度相互之间数据相关(例如:身高较高的信息很有可能会带来体重较重的信息,因为两者是有关联的),这时候就要用到马氏距离(Mahalanobis distance)了。

闵氏距离(包括曼哈顿距离、欧氏距离和切比雪夫距离)存在明显的缺点。   举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

简单说来,闵氏距离的缺点主要有两个:

(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。

(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

3、曼哈顿距离(Manhattan Distance)

曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果,即当上面的明氏距离中p=1时得到的距离度量公式,如下:

假设在曼哈顿街区乘坐出租车从 P 点到 Q 点,白色表示高楼大厦,灰色表示街道:

绿色的斜线表示欧几里得距离,在现实中是不可能的。其他三条折线表示了曼哈顿距离,这三条折线的长度是相等的。

4、切比雪夫距离(Chebyshev Distance)

切比雪夫距离起源于国际象棋中国王的走法,我们知道国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步?扩展到多维空间,其实切比雪夫距离就是当p趋向于无穷大时的明氏距离:

其实上面的曼哈顿距离、欧氏距离和切比雪夫距离都是明可夫斯基距离在特殊条件下的应用。

5、马哈拉诺比斯距离(Mahalanobis Distance)

既然欧几里得距离无法忽略指标度量的差异,所以在使用欧氏距离之前需要对底层指标进行数据的标准化,而基于各指标维度进行标准化后再使用欧氏距离就衍生出来另外一个距离度量——马哈拉诺比斯距离(Mahalanobis Distance),简称马氏距离。

马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。对于一个均值为μ,协方差矩阵为Σ的多变量向量,其马氏距离为

而其中向量X与Y之间的马氏距离定义为:

若协方差阵是单位阵(各个样本向量之间独立同分布),则马氏距离就是欧式距离。

考虑下面这张图,椭圆表示等高线,从欧几里得的距离来算,绿黑距离大于红黑距离,但是从马氏距离,结果恰好相反:

马氏距离实际上是利用 Cholesky transformation 来消除不同维度之间的相关性和尺度不同的性质。假设样本点(列向量)之间的协方差对称矩阵是  , 通过 Cholesky Decomposition(实际上是对称矩阵 LU 分解的一种特殊形式,可参考之前的博客)可以转化为下三角矩阵和上三角矩阵的乘积:  。消除不同维度之间的相关性和尺度不同,只需要对样本点 x 做如下处理: 。处理之后的欧几里得距离就是原样本的马氏距离:为了书写方便,这里求马氏距离的平方):

下图蓝色表示原样本点的分布,两颗红星坐标分别是(3, 3),(2, -2):

由于 x, y 方向的尺度不同,不能单纯用欧几里得的方法测量它们到原点的距离。并且,由于 x 和 y 是相关的(大致可以看出斜向右上),也不能简单地在 x 和 y 方向上分别减去均值,除以标准差。最恰当的方法是对原始数据进行 Cholesky 变换,即求马氏距离(可以看到,右边的红星离原点较近):

将上面两个图的绘制代码和求马氏距离的代码贴在这里,以备以后查阅:

# -*- coding=utf-8 -*-

# code related at: http://www.cnblogs.com/daniel-D/

import numpy as np

import pylab as pl

import scipy.spatial.distance as dist

def plotSamples(x, y, z=None):

stars = np.matrix([[3., -2., 0.], [3., 2., 0.]])

if z is not None:

x, y = z * np.matrix([x, y])

stars = z * stars

pl.scatter(x, y, s=10)

# 画 gaussian 随机点

pl.scatter(np.array(stars[0]), np.array(stars[1]), s=200, marker='*', color='r')

# 画三个指定点

pl.axhline(linewidth=2, color='g')

# 画 x 轴

pl.axvline(linewidth=2, color='g')

# 画 y 轴

pl.axis('equal')

pl.axis([-5, 5, -5, 5])

pl.show()

# 产生高斯分布的随机点

mean = [0, 0]

# 平均值

cov = [[2, 1], [1, 2]]

# 协方差

x, y = np.random.multivariate_normal(mean, cov, 1000).T

plotSamples(x, y)

covMat = np.matrix(np.cov(x, y))

# 求 x 与 y 的协方差矩阵

Z = np.linalg.cholesky(covMat).I

# 仿射矩阵

plotSamples(x, y, Z)

# 求马氏距离

print '\n到原点的马氏距离分别是:'

print dist.mahalanobis([0,0], [3,3], covMat.I), dist.mahalanobis([0,0], [-2,2], covMat.I)

# 求变换后的欧几里得距离

dots = (Z * np.matrix([[3, -2, 0], [3, 2, 0]])).T

print '\n变换后到原点的欧几里得距离分别是:'

print dist.minkowski([0, 0], np.array(dots[0]), 2), dist.minkowski([0, 0], np.array(dots[1]), 2)

马氏距离的变换和 PCA 分解的白化处理颇 有异曲同工之妙,不同之处在于:就二维来看,PCA 是将数据主成分旋转到 x 轴(正交矩阵的酉变换),再在尺度上缩放(对角矩阵),实现尺度相同。而马氏距离的 L逆矩阵是一个下三角,先在 x 和 y 方向进行缩放,再在 y 方向进行错切(想象矩形变平行四边形),总体来说是一个没有旋转的仿射变换。

6、汉明距离

汉明距离的定义 :两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。 
       应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

二、相似度度量

相似度度量(Similarity),即计算个体间的相似程度,与距离度量相反,相似度度量的值越小,说明个体间相似度越小,差异越大。

1、向量空间余弦相似度(Cosine Similarity)

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。公式如下:

2、皮尔森相关系数(Pearson Correlation Coefficient)

即相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角。公式如下:

3、Jaccard相似系数(Jaccard Coefficient)

Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较X与Y的Jaccard相似系数,只比较xn和yn中相同的个数,公式如下:

4、调整余弦相似度(Adjusted Cosine Similarity)

虽然余弦相似度对个体间存在的偏见可以进行一定的修正,但是因为只能分辨个体在维之间的差异,没法衡量每个维数值的差异,会导致这样一个情况:比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。

5、欧氏距离与余弦相似度

欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。

借助三维坐标系来看下欧氏距离和余弦相似度的区别:

从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似cosθ

是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。

上面都是对距离度量和相似度度量的一些整理和汇总,在现实的使用中选择合适的距离度量或相似度度量可以完成很多的数据分析和数据挖掘的建模,后续会有相关的介绍。

常用距离和相似度度量相关推荐

  1. 距离及相似度度量方法

    前言 关于距离度量的方法的专题其实已经想做好久了,正好趁这个机会总结出来. 这里讨论的距离度量应该是向量空间内的度量,两个点(即两个向量)之间的距离或相似性的度量.每种度量包括描述.定义和公式.优缺点 ...

  2. 样本间的距离或者相似度度量方法

    距离度量 距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大. 一般而言,定义一个距离函数 d(x,y), 需要满足下面几个准则: 1) d(x,x) = 0  ...

  3. 距离和相似度度量方法

    http://blog.csdn.net/pipisorry/article/details/45651315 在机器学习和数据挖掘中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别.最 ...

  4. 【机器学习】全面归纳距离和相似度方法(7种)

    距离(distance,差异程度).相似度(similarity,相似程度)方法可以看作是以某种的距离函数计算元素间的距离,这些方法作为机器学习的基础概念,广泛应用于如:Kmeans聚类.协同过滤推荐 ...

  5. 图像检索中相似度度量公式:各种距离

    基于内容的图像检索(Content-Based Image Retrieval)是指通过对图像视觉特征和上下文联系的分析,提取出图像的内容特征作为图像索引来得到所需的图像. 相似度度量方法 在基于内容 ...

  6. 大数据学习笔记:距离度量和相似度度量

    文章目录 一.度量 (一)概述 (二)距离度量 1.距离度量概念 2.常用距离度量 (三)相似度度量 1.相似度度量概念 2.常用相似度度量 二.欧式距离 (一)欧氏距离定义 1.二维空间欧式距离 2 ...

  7. 图像检索中的相似度度量:EMD距离(Earth Mover's Distance)

    EMD距离即Earth Mover's Distance,是由2000年IJCV期刊文章<The Earth Mover's Distance as a Metric for Image Ret ...

  8. 【机器学习基础】机器学习中“距离与相似度”计算汇总

    写在前面 涵盖了常用到的距离与相似度计算方式,其中包括欧几里得距离.标准化欧几里得距离.曼哈顿距离.汉明距离.切比雪夫距离.马氏距离.兰氏距离.闵科夫斯基距离.编辑距离.余弦相似度.杰卡德相似度.Di ...

  9. 【机器学习基础】机器学习距离与相似度计算

    写在前面 涵盖了常用到的距离与相似度计算方式,其中包括欧几里得距离.标准化欧几里得距离.曼哈顿距离.汉明距离.切比雪夫距离.马氏距离.兰氏距离.闵科夫斯基距离.编辑距离.余弦相似度.杰卡德相似度.Di ...

最新文章

  1. OpenCV 自动调取摄像头并显示屏幕
  2. 线性期望(BUPT2015校赛.F)
  3. undefined reference to
  4. UITabBarController中自定义UITabBar
  5. httpclient依赖_.NetCore 3.1高性能微服务架构:封装调用外部服务的接口方法HttpClient客户端思路分析...
  6. 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告
  7. 彻底放弃没落的MFC,对新人的忠告! by FreeWick
  8. 【语音去噪】基于matlab先验信噪比的维纳滤波算法语音去噪【含Matlab源码 572期】
  9. sql语句如何获得当前日期
  10. 关于昆仑通态通道处理设置
  11. 关于贷后的8个专业名词解析
  12. 雷达原理---基础知识
  13. Every plan I should insist on !!
  14. [半决赛魔咒] 那些罚失点球的人,恰恰是那些有勇气站在点球前的人。。
  15. windows搭建wordpress方法-windows搭建wordpress教程
  16. 软件实施过程、软件实施工程师职责
  17. 安卓AutoCompleteTextView的简单使用(搜索时弹出可选择项)
  18. Ubuntu 20.04 实现Windows 复制粘贴
  19. On-Premise
  20. RK3288获取摄像头的Sensor ID【原创】

热门文章

  1. 计算机应用实验室管理制度,计算机应用实验室管理规章制度.doc
  2. 杏子语录(2019年11月)
  3. CorelDRAW2022全新试用版功能详细讲解
  4. Android高仿QQ侧滑菜单
  5. JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧...
  6. java 获取当前周的周一和周日的日期
  7. 如何在Anaconda虚拟环境安装Tensorflow与Keras
  8. 分享iPhone新系统的新功能
  9. 服务器cpu散热器性能,消费级散热器见多了,服务器的Xeon Platinum用什么散热器呢?...
  10. 补充准NEUQer充实的一天的打表文件