使用 Scikit-Learn 在 Python 中查找欧几里得距离

2024年8月29日 | 阅读 8 分钟

欧几里得距离是欧几里得空间中的距离;这两个概念都以古希腊数学家欧几里得的名字命名,他的《几何原本》长期以来一直是几何学的标准教科书。长度和距离的概念在各种文化中都非常广泛,可以追溯到公元前四千年的苏美尔最早的“质数硝酸盐”管理记录(远在欧几里得之前),并且据推测,它们在儿童中比速度和时间等相关概念发展得更早。但是,距离(作为一个从两个点定义的数字)的概念在欧几里得的《几何原本》中并不一定出现。相反,欧几里得通过线段的全等、通过线段长度的比较以及通过比例概念来内在地处理这个概念。

欧几里得空间中两个点之间的欧几里得距离是连接这两个点的线段的长度。它可以通过这些点的笛卡尔坐标利用勾股定理来计算,因此有时被称为勾股距离。这些名称来自古希腊数学家欧几里得和毕达哥拉斯,尽管欧几里得并未将距离视为数字,并且直到十八世纪才将勾股定理与距离测量联系起来。

两个非点对象之间的距离通常定义为这两个对象上点对之间的最小距离。已知存在计算不同类型对象之间距离的公式,例如点到线的距离。在高等数学中,距离的概念已被推广到抽象度量空间,并且已经研究了不同于欧几里得距离的距离。在统计学和优化的一些应用中,使用欧几里得距离的平方而不是实际距离。

距离公式

一维

实数线上任意两点之间的距离是它们坐标的数学差的绝对值,即它们的绝对差。因此,如果 p 和 q 是实数线上的两个点,则它们之间的距离由下式给出

d(p, q) = |p-q|

一个更复杂的公式,给出相同的值,但更容易推广到更高维度,是

d(p, q) = √(p-q)2

在此公式中,计算然后取平方根会保持任何正数不变,但会将任何负数替换为其绝对值。

二维

在欧几里得平面上,设点 p 的笛卡尔坐标为 q 的坐标为,则 p 和 q 之间的距离由下式给出

d(p, q) = √(q1-p1)2+(q2-p2)2

这应该可以通过将勾股定理应用于一条直角三角形,其水平和垂直边具有连接 p 和 q 的线段作为其斜边来理解。平方根内的两个平方项表示水平和垂直边的正方形的面积,而外部平方根将斜边上的正方形面积转换为斜边的长度。

也可以计算由极坐标给出的点的距离。如果 p 的极坐标是 (r, θ) 并且 q 的极坐标是 (s, ψ),则它们的距离由余弦定律给出

d(p, q) = √r2+s2-2rs cos(θ-ψ)

当 p 和 q 在复平面上表示为复数时,可以使用与表示为实数的一维点相同的公式,尽管这里绝对值符号表示复数模

d(p, q) = |p-q|

性质

欧几里得距离是度量空间中距离的原型示例,并且满足度量空间的所有定义属性

它是对称的,这意味着对于所有点 p 和 q,d(p, q) = d(q, p)。也就是说(与单向道路的街道距离不同),两点之间的距离不取决于哪两点是起点,哪一点是终点。

它是正的,意味着任意两不同点之间的距离是一个正数,而从任何点到自身的距离为零。

它满足三角不等式:对于任意三个点 p、q 和 r,直观地说,通过 q 从 p 到 r 的路程不应比直接从 p 到 r 的路程更短。

另一个性质是托勒密不等式,它涉及四个点 p、q、r 和 s 之间的欧几里得距离。它陈述如下:

d(p, q).d(r, s) + d(q, r).d(p, s) >= d(p, r).d(q, s)

对于平面上的点,这可以改写为表示对于任何四边形,对边乘积加上对角线乘积至少与对角线乘积一样大。然而,托勒密的不等式更普遍地适用于任何维度的欧几里得空间中的点,无论它们是如何排列的。对于非欧几里得空间的度量空间中的点,此不等式可能不成立。欧几里得距离数学侧重于欧几里得距离的性质,如托勒密的不等式,以及它们在测试给定距离集是否来自欧几里得空间中的点时的应用。

根据贝克曼-夸尔斯定理,任何保持单位距离的欧几里得平面或更高维欧几里得空间的变换都必须是等距变换,保留所有距离。

使用 Scikit-Learn 计算欧几里得距离

对于 Python 中的人工智能,Scikit-Learn 是最好也是最有用的库。它包含许多工具,包括回归、分类、聚类和其他有用的机器学习算法。欧几里得距离是聚类算法用来确定簇如何得到优化,即簇的优化程度的度量之一。

我们都使用二维中著名的距离公式来计算计算中两点之间的距离

欧几里得距离公式

d(x, y) = √(x1-x2)2+(y1-y2)2

其中,(x1, x2) 和 (y1, y2) 是笛卡尔平面上的点。

参数

  • X {array-like, sparse matrix} 形状为 (n_samples_X, n_features)

一个数组,其中每一行是一个样本,每一列是一个特征。

  • Y {array-like, sparse matrix} 形状为 (n_samples_Y, n_features),默认值为 None

一个数组,其中每一行是一个样本,每一列是一个特征。如果为 None,则该方法使用 Y=X。

  • Y_norm_squared array-like 形状为 (n_samples_Y,) 或 (n_samples_Y, 1) 或 (1, n_samples_Y),默认值为 None

Y 中向量的预计算点积(例如,(Y**2).sum(axis=1)) 有时可能被忽略,请参阅下面的注释。

  • squared bool,默认值为 False

返回平方欧几里得距离。

  • X_norm_squared array-like 形状为 (n_samples_X,) 或 (n_samples_X, 1) 或 (1, n_samples_X),默认值为 None

X 中向量的预计算点积(例如,(X**2).sum(axis=1)) 有时可能被忽略,请参阅下面的注释。

返回值

distancesndarray of shape (n_samples_X, n_samples_Y)

返回 X 的行向量与 Y 的列向量之间的距离。

算法(步骤)

以下是执行所需任务的计算/步骤:

  • 使用 import 关键字从 sklearn 模块导入 euclidean_distances() 函数。
  • 使用 import 关键字以别名导入 numpy 模块。
  • 使用 numpy.array() 函数创建一个 NumPy 数组并为其提供随机数组元素。
  • 使用 euclidean_distances() 函数通过将输入数组和原点列表作为参数传递来计算给定 NumPy 数组元素(坐标)与原点 (0,0,0) 之间的欧几里得距离。
  • 打印结果欧几里得距离。

示例

以下项目使用 sklearn 模块的 scikit learn 函数的 euclidean_distances() 返回数组元素与原点之间的欧几里得距离。

输出

执行后,上述程序将生成以下结果

The Resultant euclidean distance of the array using the Scikit-learn method is:
[[ 6.28490254]
 [ 4.58257569]
 [12.04159458]]

方法 2:计算两个数组之间的欧几里得距离

两个数组元素之间的欧几里得距离可以以类似的方式计算。因此,如果列表分别有 m 和 n 个元素,则结果数组将有 m * n 个元素。

算法(步骤)

以下是执行所需任务的计算/步骤。

  • 使用 import 关键字从 sklearn 模块导入 euclidean_distances 函数。
  • 使用 import 关键字以别名导入 numpy 模块。
  • 使用 numpy.array() 函数创建一个第一个 NumPy 数组并创建一个变量来存储它。
  • 使用 numpy.array() 函数创建一个第二个 NumPy 数组并创建另一个变量来存储它。
  • 使用 euclidean_distances() 函数通过将输入数组 1 和输入数组 2 作为参数传递来计算两个给定输入数组元素之间的欧几里得距离。
  • 打印结果欧几里得距离。

示例

以下项目使用 sklearn 模块的 euclidean_distances() 函数返回两个相应输入数组元素之间的欧几里得距离。

输出

执行后,上述程序将生成以下结果

The Resultant euclidean distance between Ar1 and Ar2 is:
[[4.18330013 4.30116263 5.12347538]
 [4.         3.31662479 8.7321246 ]
 [8.1240384  9.21954446 4.82182538]]

说明

如您所见,结果是一个二维数组。此数组中的每个元素包含第一个数组(称为“Ar1”)中的点与第二个数组(称为“Ar2”)中的另一组点之间的距离。