Loading

常见距离度量与其简单实现

欧几里得距离


  在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。

def euclid(x, y):
    return np.linalg.norm(x - y)

计算方式的局限。

  比如说计算两个点的距离,点A(10,10000)、点B(1,500),第二个维度对于距离d的贡献是远远超过第一个维度的。在这里我们只是向量中的各个因素分别进行了处理,并没有考虑维度之间的相互关系,以及不同维度对于距离d的贡献程度。另外一点局限是,从距离角度来看,它认为两点之间,始终是可以通过直线距离到达的(更适用于欧氏空间)。

  这是非常重要的一个基础,以后的几种距离都会与欧氏距离进行对比。

标准化欧氏距离 (Standardized Euclidean distance )


  标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集\(X\)的均值(mean)为\(m\),标准差(standard deviation)为\(s\),那么\(X\)的“标准化变量”表示为:

def std_euclid(x, y):
    std=np.vstack([x,y])
    return np.sqrt(((x-y)**2/np.var(std)).sum())

曼哈顿距离


  计程车几何(Taxicab geometry)或曼哈顿距离(Manhattan distance or Manhattan length)或方格线距离是由十九世纪的赫尔曼·闵可夫斯基所创辞汇,为欧几里得几何度量空间的几何学之用语,用以标明两个点上在标准坐标系上的绝对轴距之总和。

\[d = \sum_{k=1}^{n}|a_k-b_k| \]

def manhattan(x, y):
    return np.sum(np.abs(x-y))

切比雪夫距离


  国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子\((x_1,y_1)\)走到格子\((x_2,y_2)\)最少需要多少步?自己走走试试。你会发现最少步数总是\(\text{max}( | x_2-x_1 | , | y_2-y_1 | )\) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。

闵可夫斯基距离


  明氏距离又叫做明可夫斯基距离,是欧氏空间中的一种测度,被看做是欧氏距离和曼哈顿距离的一种推广。

其中p是一个变参数。

  • 当p=1时,就是曼哈顿距离
  • 当p=2时,就是欧氏距离
  • 当p→∞时,就是切比雪夫距离
    根据变参数的不同,闵氏距离可以表示一类的距离。
def minkowski(x, y, p):
    return np.linalg.norm(x - y, ord=p)

余弦距离


def cos_dis(x, y):
    return np.dot(x, y)/(np.linalg.norm(x)*np.linalg.norm(y))
posted @ 2020-04-13 16:42  selfcs  阅读(498)  评论(0编辑  收藏  举报