曼哈顿距离(Manhattan Distance)
曼哈顿距离(Manhattan Distance)
原理
曼哈顿距离(Manhattan Distance)也称为城市街区距离,是一种在几何空间中测量两点之间距离的度量方式。它表示两个点在标准坐标系上的绝对轴距总和。
定义
曼哈顿距离是标量空间中两点间各维度差的绝对值之和。在二维空间中,曼哈顿距离可以理解为从一个点到另一个点只能沿着水平或垂直方向行走的最小距离。
引伸义
曼哈顿距离在计算机科学、图像处理、数据挖掘等领域有着广泛的应用。例如,在推荐系统中,曼哈顿距离可以用于计算用户之间或物品之间的相似度;在图像处理中,可以用于衡量图像之间的相似性。
优点
- 计算简单:曼哈顿距离的计算不涉及平方根等复杂操作,因此计算速度快。
- 可解释性强:曼哈顿距离直接反映了两个点在每一维度上的差异程度。
缺点
- 对数据的分布敏感:如果数据的分布不均匀,曼哈顿距离可能会受到异常值的影响。
- 无法反映方向性:曼哈顿距离只考虑了两个点在各个维度上的差异程度,但没有考虑方向性。
公式
曼哈顿距离(Manhattan Distance),也称为城市街区距离(City Block Distance),是在多维空间中两点之间测量路径长度的一种方法。它定义为在各坐标轴方向上距离的总和。对于在n维空间中的两个点
、
曼哈顿距离可以通过以下公式计算得出:
简化为向量形式则是:
使用数据一步步举例演示
假设我们有两个二维空间中的点 (A(1, 2)) 和 (B(4, 6)),我们要计算它们之间的曼哈顿距离。
- 根据曼哈顿距离公式,我们分别计算两个点在横坐标和纵坐标上的差异:
- 横坐标差异:(|1 - 4| = 3)
- 纵坐标差异:(|2 - 6| = 4)
- 将两个差异相加得到曼哈顿距离:
- 曼哈顿距离:(3 + 4 = 7)
因此,点 (A(1, 2)) 和点 (B(4, 6)) 之间的曼哈顿距离为 7。
Java示例
public class ManhattanDistance { /** * 计算两个二维点之间的曼哈顿距离 * * @param x1 第一个点的x坐标 * @param y1 第一个点的y坐标 * @param x2 第二个点的x坐标 * @param y2 第二个点的y坐标 * @return 两个点之间的曼哈顿距离 */ public static double calculateManhattanDistance(int x1, int y1, int x2, int y2) { return Math.abs(x1 - x2) + Math.abs(y1 - y2); } /** * 计算两个多维点之间的曼哈顿距离 * * @param point1 第一个点的坐标数组 * @param point2 第二个点的坐标数组 * @return 两个点之间的曼哈顿距离 * @throws IllegalArgumentException 如果两个点的维度不同 */ public static double calculateManhattanDistance(int[] point1, int[] point2) { if (point1.length != point2.length) { throw new IllegalArgumentException("两个点的维度必须相同"); } double distance = 0; for (int i = 0; i < point1.length; i++) { distance += Math.abs(point1[i] - point2[i]); } return distance; } public static void main(String[] args) { // 示例:计算二维空间中两个点的曼哈顿距离 int x1 = 1, y1 = 2; int x2 = 4, y2 = 6; double distance2D = calculateManhattanDistance(x1, y1, x2, y2); System.out.println("二维空间中的曼哈顿距离: " + distance2D); // 示例:计算多维空间中两个点的曼哈顿距离 int[] pointA = {1, 2, 3}; int[] pointB = {4, 6, 5}; double distanceND = calculateManhattanDistance(pointA, pointB); System.out.println("多维空间中的曼哈顿距离: " + distanceND); } }
在这个代码中,calculateManhattanDistance(int x1, int y1, int x2, int y2)
方法用于计算二维空间中两个点的曼哈顿距离。而 calculateManhattanDistance(int[] point1, int[] point2)
方法则用于计算多维空间中两个点的曼哈顿距离。这两个方法都返回两个点之间的曼哈顿距离,作为 double
类型的值。
在 main
方法中,我们给出了两个示例,分别演示了如何计算二维空间和多维空间中两个点的曼哈顿距离。
回顾
曼哈顿距离得名于纽约曼哈顿区的网格布局,想象在这样的街道上从一个十字路口走到另一个十字路口,只能沿着横向或纵向的街道移动,不能直接对角线穿越,所走的总街区数即为两路口间的曼哈顿距离。
曼哈顿距离在路径规划、图像处理、数据分析等领域有广泛应用,尤其是在需要考虑沿坐标轴的独立移动成本时。
常见的相似度计算方法
余弦相似度(Cosine Similarity)
皮尔逊相关系数
曼哈顿距离(Manhattan Distance)
欧氏距离(Euclidean Distance)
修正余弦相似度(Adjusted Cosine Similarity)
皮尔逊χ²检验(Pearson's Chi-squared Test)