【白话数据分析】距离度量的相似度计算

在数据分析和数据挖掘中,经常需要数值化样本个体间差异的大小,进而评价个体的相似度或者进行分类。比如统计分析中的相关性分析,数据挖掘中进行的KNN分类与K-means聚类,还有推荐系统算法中搜索引擎的物品推荐。

为了能由简及易的深刻阐述样本相似度的基本原理和应用,我们从一个基本的例子出发,并且结合程序计算,结合图像直观区分各个相似之间的差异。

  • 由距离引出的相似度
    • 欧几里得距离
    • 曼哈顿距离
    • 闵可夫斯基距离
  • 余弦相似度
  • 杰卡德相似度
  • 皮尔逊相关系数
样本特征1特征2特征3特征4
样本11324
样本22531

一、欧氏距离(Euclidean distance)

       欧氏距离是最常用的距离计算公式,衡量的是多维空间中各个点之间的绝对距离,因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别(标准化),比如:计算两个城市的经济状况,其中农业生产总值(元)、交通运输流量(吨)、商业出口进口比(%),如果用欧式距离计算,那么量级大的指标的影响就会覆盖数量级小的指标。所以在计算欧式距离时,需要先进行样本标准化。
n维空间的公式:
在这里插入图片描述
由欧式距离引出的相似度计算:
s i m = 1 1 + d ( x , y ) sim=\frac{1}{1+d(x,y)} sim=1+d(x,y)1

因为距离越远,则相似度越小。同时考虑到d(x,y)可能等于0,所以分母就写成1+d(x,y)然后取倒数。

# 欧式距离
def Eculidean(x,y):
    return sqrt(sum(pow(a-b,2) for a,b in zip(x,y)))
# 计算两个样本的欧式距离
dist = Eculidean([1,3,2,4],[2,5,3,1])
sim = 1/(1+dist)
print("样本的相似度:{}".format(sim))

样本的相似度:0.20521309615767264

二、曼哈顿距离(Manhattan Distance)

想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)
在这里插入图片描述
在这里插入图片描述
计算方法相比欧式距离更加简单,比如现在的两个向量X=[1,3,2,4],Y=[2,5,3,1],则d(a,b)=|1-2|+|3-5|+|2-3|+|4-1|=7,同样更加距离与相似度之间的关系:
s i m = 1 1 + d ( x , y ) sim=\frac{1}{1+d(x,y)} sim=1+d(x,y)1

# 曼哈顿距离
def Manhattan(x,y):
    return sum(abs(a-b) for a,b in zip(x,y))
# 计算两个样本的曼哈顿距离
dist = Manhattan([1,3,2,4],[2,5,3,1])
sim = 1/(1+dist)
print("样本的相似度:{}".format(sim))

样本的相似度:0.125
一图观欧式距离与曼哈顿距离的区别:
在这里插入图片描述

三、闵可夫斯基距离

闵可夫斯基距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。
d i s t ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 p dist(x_i,x_j)=\big(\sum_{u=1}^n|x_{iu}-x_{ju}|^p\big)^\frac{1}{p} dist(xi,xj)=(u=1nxiuxjup)p1

  • 当p=2时,闵可夫斯基距离即欧氏距离(Euclidean distance) :
    d i s t ( x i , x j ) = ∣ ∣ x i − x j ∣ ∣ 2 = ( ∑ u = 1 n ∣ x i u − x j u ∣ 2 ) 1 2 dist(x_i,x_j)=||\pmb x_i - \pmb x_j||_2=\big(\sum_{u=1}^n|x_{iu}-x_{ju}|^2\big)^\frac{1}{2} dist(xi,xj)=xxxixxxj2=(u=1nxiuxju2)21
  • 当p=1时,闵可夫斯基距离即曼哈顿距离(Manhattan distance),亦称“街区距离”(city block distance):
    d i s t ( x i , x j ) = ∣ ∣ x i − x j ∣ ∣ 1 = ∑ u = 1 n ∣ x i u − x j u ∣ dist(x_i,x_j)=||\pmb x_i - \pmb x_j||_1=\sum_{u=1}^n|x_{iu}-x_{ju}| dist(xi,xj)=xxxixxxj1=u=1nxiuxju
  • 当p→∞时,闵可夫斯基距离即切比雪夫距离(Chebyshev distance):
    d i s t ( x i , x j ) = m a x u = 1 n ∣ x i u − x j u ∣ dist(x_i,x_j)=max_{u=1}^n|x_{iu}-x_{ju}| dist(xi,xj)=maxu=1nxiuxju
    闵可夫斯基距离是对曼哈顿距离、欧式距离的推广,是对多个距离度量公式的概括性表述。

四、余弦相似度(Cosine Similarity)

余弦相似度用向量空间中两个向量夹角的余弦值衡量两个个体间差异的大小。与距离度量方式相比,余弦相似度更加关注于两个样本向量在方向上的差异,而非距离或者长度上。一图理解长度距离的度量与角度或方式距离的度量:
在这里插入图片描述
余弦相似度的计算公式:
在这里插入图片描述

从余弦定理理解余弦计算相似度的度量

import numpy as np
# 余弦相似度
def Cosine(x,y):
    num = sum(map(float,x*y))
    denom = np.linalg.norm(x) * np.linalg.norm(y)
    return round(num/float(denom),3)

sim = Cosine(np.array([1,3,2,4]),np.array([2,5,3,1]))
print("样本的相似度:{}".format(sim))

样本的相似度:0.789
理解余弦相似度:两个样本的角度越小,cosine值越大,相似度就越高。所以cos值越大,则相似度越高,并且取值范围[-1,1]。

五、杰卡德相似度(Jaccard Similarity)

主要用于计算符号度量或者布尔值度量的个体间的相似度,因为个体的特征属性都是符号度量或者布尔值标识,因此无法衡量差异大小即具体值的大小,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。
在这里插入图片描述
计算上述两个集合A、B的Jaccard相似度的大小。
J a c c a r d ( X , Y ) = X ∩ Y X ∪ Y Jaccard(X,Y)=\frac{X\cap Y}{X\cup Y} Jaccard(X,Y)=XYXY
考虑到集合的互异性,所以上面两个集合的并集中有7个元素,而交集中只有2个相同的元素。所以计算方法如下:
J a c c a r d ( A , B ) = A ∩ B A ∪ B = 2 7 Jaccard(A,B)=\frac{A\cap B}{A\cup B}=\frac{2}{7} Jaccard(A,B)=ABAB=72

# 杰卡德相似度
def Jaccard(x,y):
    intersection = len(set.intersection(*[set(x),set(y)]))
    union = len(set.union(*[set(x),set(y)]))
    return intersection/float(union)

sim = Jaccard([0,1,2,5,6],[0,2,3,5,7,9])
print(sim)

杰卡德相似度为0.375

六、皮尔逊相关系数(Pearson Correlation Coefficient)

本质是余弦相似度去平均化之后的结果,考虑到欧式距离与余弦相似度表示的相似度量都仅仅关注了向量空间的一个角度,即距离或夹角,但实际样本的相关性与相似效果需要同时考虑。
两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
在这里插入图片描述
上式定义了总体相关系数,常用希腊小写字母ρ作为代表符号。估算样本的协方差和标准差,可得到皮尔逊相关系数,常用英文小写字母 r代表:
在这里插入图片描述
样本点的标准分数均值估计,得到与上式等价的表达式:
在这里插入图片描述

如果有两个变量:X、Y,最终计算出的相关系数的含义有如下理解:

  • 当相关系数为0时,X和Y两变量无关系。
  • 当X的值增大(减小),Y值增大(减小),两个变量为正相关,相关系数在0.00与1.00之间。
  • 当X的值增大(减小),Y值减小(增大),两个变量为负相关,相关系数在-1.00与0.00之间。
相关系数结果说明
0.8~1.0极强相关
0.6~0.8强相关
0.4~0.6中等程度相关
0.2~0.4弱相关
0.0~0.2极弱相关或无相关
# 皮尔逊相关系数
import numpy as np
x= [3,1,2,2,1,3]
y= [1,2,3,2,1,1]
sim = np.corrcoef(x,y)[0,1]  # 返回的结果是一个矩阵
print(sim)

-0.2738612787525831

七、相似性排序

  • TopN:固定数量的邻近样本
  • 阈值K:基于相似度阈值的邻近样本
    在这里插入图片描述
    根据上面的方法选出相似性比较高的样本个体,再进一步分析。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值