R 示例
R 提供多种计算欧氏距离的方法。我们将编写一个自定义函数,并与来自 stats 库的 dist() 函数进行比较。
euclidean_distance <- function(point1, point2) {
sqrt(sum((point1 - point2)^2))
}
# 2D example
point_a <- c(1, 2)
point_b <- c(4, 6)
distance_2d <- euclidean_distance(point_a, point_b)
print(paste("2D Euclidean distance:", round(distance_2d, 2)))
# 3D example
point_c <- c(1, 2, 3)
point_d <- c(4, 6, 8)
distance_3d <- euclidean_distance(point_c, point_d)
print(paste("3D Euclidean distance:", round(distance_3d, 2)))
# Using the dist() function from stats
distance_builtin <- stats::dist(rbind(point_c, point_d), method = "euclidean")
print(paste("3D Euclidean distance (built-in):", round(as.numeric(distance_builtin), 2)))
运行上述 R 代码应产生如下输出:
[1] "2D Euclidean distance: 5"
[1] "3D Euclidean distance: 7.07"
[1] "3D Euclidean distance (built-in): 7.07"
我们自定义的 euclidean_distance 函数利用了 R 的向量化运算,简洁且高效。stats 包中的 dist() 函数返回相同结果,验证了自定义函数的正确性。两种方法都返回一个矩阵。
欧氏距离的应用
欧氏距离是一种直观的远近度量方式,广泛用于涉及空间与距离问题的各类场景。
K 近邻(KNN)
在 k 近邻算法中,欧氏距离用于寻找某个点的最近邻。这有助于对新数据进行分类——例如根据相似邮件判断是否为垃圾邮件,或向用户推荐与其偏好相似的商品。
K-means 聚类
在 k-means 聚类 中,欧氏距离通过将每个点连接到最近的聚类中心来帮助将数据划分为组。这有助于按相似性组织数据,常用于客户分群或研究中将相似对象归为一类。
多维尺度分析(MDS)
多维尺度分析使用欧氏距离将复杂数据简化为更易于可视化与理解的形式。它把高维数据降到更便于查看与分析的维度,帮助更清晰地发现趋势与模式。
图像处理
在边缘检测或目标识别等任务中,欧氏距离可衡量像素颜色变化的幅度,从而帮助勾勒目标轮廓或识别图像中的关键特征。这在医学成像(识别病灶)或安防系统(识别人脸或物体)等领域很有用。
机器人学
对于机器人(如无人机或自动驾驶汽车),欧氏距离可用于计算从一点到另一点的最简路径,帮助其高效、安全地移动,避开障碍并规划通往目标地点的最便捷路线。
与其他距离度量的比较
欧氏距离只是众多距离度量中的一种,不同情境适合不同方法。以下是与其他常见度量的对比:
曼哈顿距离
曼哈顿距离(也称“城市街区”距离)为各维度上绝对差值之和。好比走在棋盘式城市街道上,逐街区行进的距离即为曼哈顿距离。该方法在类网格环境(如城市导航或某些游戏)中特别有用;在超高维数据中,当欧氏距离可靠性下降时,它也常更合适。延伸阅读:Manhattan distance 教程。
余弦距离
余弦距离关注两点或向量之间的夹角。它不强调两者之间连线的长度,而是关注它们的方向关系。因此在文本分析或推荐系统中尤为有用,此时数据的“方向”(如文章词频分布或用户偏好)比“量级”(多少)更重要。更多内容参阅 cosine distance 文章。
切比雪夫距离
切比雪夫距离关注任一维度上的最大差异。可类比国际象棋中国王的走法:不论水平、垂直还是对角,目标是在最少步数内到达最远的格子。当需要只关注多个差异中最大者时,该度量尤其有用。详见 Chebyshev distance 教程。
欧氏距离的局限性
尽管欧氏距离因其直观与易算而被广泛应用,但也存在一些显著局限。理解这些局限有助于选择合适的距离度量,或通过数据处理来缓解问题。
对量纲的敏感性
欧氏距离容易受特征量纲影响而产生不成比例的结果。例如,在包含收入与年龄的数据集中,收入通常跨越的范围要远大于年龄(可能是数千或数万,而年龄通常不超过百)。这种差异会导致收入在距离计算中占主导,进而使结果偏向其量纲。
缓解方法:通过对数据进行归一化或标准化来平衡不同特征的量纲,避免单个特征对距离计算产生过度影响。
维度灾难
维度灾难指的是随着数据维度增多而出现的各种现象,其中之一是“接近度”或“距离”的概念变得不再有意义——距离趋于收敛,难以有效区分远近。
缓解方法:可采用主成分分析(PCA)或 t 分布随机邻域嵌入(t-SNE)等降维技术,提炼方差最大的关键信息,从而简化数据。
对离群点的敏感性
欧氏距离计算也容易受到离群点的显著影响。在高维空间中,单个离群点就可能大幅改变距离关系,使某些数据点看起来比实际更加相似或更加不同。
事实上,线性回归对离群点的敏感性与欧氏距离的概念相关。这是因为在线性回归中,模型最小化残差平方和(观测值与预测值之差),实质上是在测量观测点到回归线的欧氏距离。离群点会对该距离产生不成比例的影响,因为较大偏差的平方增长速度远快于较小偏差。
缓解方法:采用对离群点不那么敏感的更稳健度量(如在某些数据类型中使用曼哈顿距离)。此外,可在预处理阶段识别并处理离群点——调整或移除它们,以免扭曲距离计算。
替代思路:考虑使用加权欧氏距离。该变体为不同维度或特征分配不同权重,从而对易受离群点或噪声影响的特征降低权重。
结论
正如我们所见,欧氏距离是众多分析与技术领域的基础度量,为两点之间的直线距离提供了直观方法。理解并运用欧氏距离,有助于提升从机器学习算法到空间分析等众多应用的准确性与有效性。
欢迎您在项目中尝试应用欧氏距离,并通过 Designing Machine Learning Workflows in Python 与 Anomaly Detection in Python Course 等课程继续深入学习。

Vinod Chugani 的职业生涯始于东京,曾任摩根大通最年轻的对冲基金销售台负责人,随后在雷曼兄弟创下个人销售纪录,之后又打造了覆盖 30 个国家的电子分销业务,营收突破 1 亿新元,随后转向数据领域。他毕业于杜克大学经济学专业,亦为 NYC Data Science Academy 校友,并在 100 多名申请者中成为Hugo Bowne-Anderson 在 Maven 开设的 “Building AI Applications” 课程的三位奖学金获得者之一。目前,他为 DataCamp、KDnuggets、Machine Learning Mastery 和 Statology 撰稿,内容涵盖从统计学到代理式 AI 等主题,并在 NYC Data Science Academy 指导数据从业者,已完成超过 1,000 场一对一辅导。
欧氏距离常见问题
为什么欧氏距离在机器学习中很重要?
欧氏距离通过量化数据点之间的相似与差异,在分类、聚类与异常检测等任务中发挥重要作用,因此在多种机器学习算法中很关键。
欧氏距离是否始终是数据科学中测量距离的最佳选择?
并非总是如此。最佳的距离度量取决于数据类型与具体问题。例如,对超高维数据或更符合网格式移动的情形,曼哈顿距离可能更合适。
欧氏距离如何处理负坐标?
欧氏距离衡量对应坐标之间的绝对差异,对正负坐标一视同仁进行处理。
欧氏距离能用于类别型数据吗?
不能。欧氏距离通常需要数值型输入来计算距离。对于分类数据,常使用海明距离或其他自定义相似性度量。
选择欧氏距离会如何影响如 K-means 之类聚类算法的性能?
在 K-means 等聚类算法中使用欧氏距离会直接影响聚类形状,因为它决定了聚类的几何性质。欧氏距离倾向于形成以均值为中心的球形簇。当数据的天然簇并非球形时,这种特性可能影响聚类效果。
欧氏距离这一概念可追溯至古希腊数学,如今已成为现代数据科学、机器学习与空间分析中的基础工具。该度量以著名数学家欧几里得命名,用于衡量空间中两点之间的直线距离,不论是在二维还是更高维空间。
什么是欧氏距离?
欧氏距离表示欧氏空间中两点间的最短路径。它相当于用尺子量出的直线距离,并可扩展到任意维度。其思想深植于勾股定理:在直角三角形中,斜边长度的平方等于另外两边长度平方之和。
“Philosopher teaching Euclidean distance.” Image by Dall-E
欧氏距离公式
我们按不同维度来分解欧氏距离公式:
二维欧氏距离
在二维平面上,点 A(x₁, y₁) 与 B(x₂, y₂) 的欧氏距离为:
例如,计算点 A(1, 2) 与 B(4, 6) 之间的距离:
二维欧氏距离可视化
为更直观地理解二维欧氏距离,让我们进行可视化:
二维欧氏距离。图片由作者提供
该图展示了二维平面上两点的欧氏距离。红色直线代表两点间的直接距离,虚线构成直角三角形,用以演示勾股定理的作用。
三维欧氏距离
扩展到三维,对于点 A(x₁, y₁, z₁) 与 B(x₂, y₂, z₂),公式为:
三维欧氏距离可视化
我们来可视化三维欧氏距离:
三维欧氏距离。图片由作者提供
该三维图展示了三维空间中两点之间的欧氏距离。绿色虚线表示两点之间的直接距离。
n 维欧氏距离
在 n 维空间中,点 A(a₁, a₂, ..., aₙ) 与 B(b₁, b₂, ..., bₙ) 的欧氏距离为:
使用求和符号可以更为简洁地表示:
与线性代数概念的关系
理解欧氏距离不仅是掌握两点之间最短路径的度量,更是通过线性代数的视角去看待这些距离。线性代数利用向量及其性质来描述与求解空间与维度的问题。若想进一步了解,可探索 Linear Algebra for Data Science in R 课程,系统讲解相关概念。
作为向量范数的欧氏距离
欧氏距离衡量空间中两点的远近。想象有两个点,一个在登山步道的起点,一个在山顶。从起点到山顶的直线路径就可视为欧氏距离。在线性代数中,这好比找到一支“箭头”(即向量),从起点(点 A)直指山顶(点 B),其长度称为向量的“范数”,也就是这条直线的长度。
点积与夹角余弦
在处理方向问题时,点积帮助我们理解两支箭头之间的夹角。例如,若您站在两条道路的交叉口,点积能告诉您一条路在多大程度上“指向”另一条路。它由两条路的长度(类似前述范数)及其夹角共同决定。该值越接近 0,两条路越接近彼此垂直。与距离联系起来时,点积公式可将欧氏距离分解为更易处理的分量,显示方向变化如何影响总体距离。
欧氏距离与向量相减
用向量求两点的欧氏距离,实质是用一个点减去另一个点,得到一支新向量。该向量从一处直指另一处,其长度即为我们关心的欧氏距离。好比在地图上用坐标差绘出从您家到最近超市的直线路线,这条线(向量)展示了您可走的最短路径。
在 Python 与 R 中计算欧氏距离
我们将分别在 Python 与 R 中实现欧氏距离计算。既编写自定义函数,也使用内置库以提升效率。
Python 示例
在 Python 中,我们可借助 NumPy 高效进行数组运算,并使用 SciPy 进行专门的距离计算。以下是实现欧氏距离的方法:
运行该代码后,预期输出类似于:
SciPy 的函数通常更快、更优化,特别适合高维数据;而我们的自定义函数有助于阐释底层计算原理。