您的位置:

曼哈顿距离与欧几里得距离

一、曼哈顿距离

曼哈顿距离又叫L1距离,它是点在坐标系上的曼哈顿距离。对于平面上的两个点(x1, y1)和(x2, y2),它们之间的曼哈顿距离是|x1-x2|+|y1-y2|,也就是横向和纵向距离各自相加的值。

曼哈顿距离可以用于解决很多实际问题,例如出租车在城市里行驶的费用问题。在一个网格状道路的城市中,出租车需要按照交通规则行驶,不能直线行驶,所以到达目的地的最短距离并不一定是直线距离。因此我们可以在城市中以红绿灯、标志、路口等为网格,以曼哈顿距离作为距离,来求得出租车到达目的地的最短距离。

def manhattan_distance(point1, point2):
    return abs(point1[0]-point2[0]) + abs(point1[1]-point2[1])

二、欧几里得距离

欧几里得距离又叫L2距离,是点在坐标系上的直线距离。对于平面上的两个点(x1, y1)和(x2, y2),它们之间的欧式距离是√((x1-x2)²+(y1-y2)²)。

欧几里得距离可以用于解决很多实际问题,例如机器学习中的KNN(K-Nearest Neighbors)分类算法。在KNN算法中,我们需要找到距离输入数据最近的K个数据点,然后按照这K个数据点所属的类别,来确定输入数据的类别。此时我们就可以使用欧几里得距离来计算数据点之间的距离,以确定哪些数据点是最近的。

import math

def euclidean_distance(point1, point2):
    return math.sqrt((point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)

三、曼哈顿距离与欧几里得距离的比较

曼哈顿距离和欧几里得距离都是常用的距离度量。相比之下,曼哈顿距离更适合用于计算网格状的数据结构,如城市街道,棋盘等;欧几里得距离更适合用于连续空间的数据结构,如三维坐标、时间序列等。曼哈顿距离更容易计算,但它忽略了直线距离的影响;欧几里得距离更准确,但计算量相对较大。

def compare_distance(point1, point2):
    manhattan_dis = manhattan_distance(point1, point2)
    euclidean_dis = euclidean_distance(point1, point2)
    if manhattan_dis > euclidean_dis:
        print("欧几里得距离更优")
    elif manhattan_dis == euclidean_dis:
        print("曼哈顿距离和欧几里得距离等效")
    else:
        print("曼哈顿距离更优")