资讯动态

numpy-ml 距离度量模块全解析:euclidean、manhattan、chebyshev、minkowski 与 hamming 的公式、源码与实战

发布时间:2026/9/21 1:53:54 来源:尧图企业网站定制
机器学习人工智能【免费下载链接】numpy-mlMachine learning, in numpy项目地址https://gitcode.com/gh_mirrors/nu/numpy-ml点击查看免费下载距离度量是几乎所有基于相似性/邻近性的机器学习算法的基石numpy-ml 在numpy_ml/utils/distance_metrics.py中提供了一组Common distance functions常见距离函数并以 docs/numpy_ml.utils.distance_metrics.rst 作为其 API 参考文档。本篇以该文档为骨架逐一对euclidean、chebyshev、hamming、manhattan、minkowski五个函数展开数学定义、源码实现、参数语义与边界条件并结合仓库中 BallTree 与 KNN 的真实调用链以及 test_utils.py 中与 SciPy 的对拍测试讲解它们在项目中的实际角色。读完本文你将掌握如何在 numpy-ml 内直接调用这些距离函数、理解每个指标何时该用、何时不能用以及如何把它们作为可插拔metric注入到最近邻类模型中。模块定位numpy-ml 工具库中的距离函数numpy_ml.utils.distance_metrics是 numpy-ml 工具子包的一部分。在 numpy_ml/utils/init.py 中它与其他工具模块testing、data_structures、kernels、windows、graphs、misc一同被导出# numpy_ml/utils/__init__.py from . import testing from . import data_structures from . import distance_metrics from . import kernels from . import windows from . import graphs from . import misc因此你既可以通过from numpy_ml.utils.distance_metrics import euclidean精确导入也可以通过from numpy_ml.utils import distance_metrics走子包入口。全部函数均以纯 NumPy 向量化方式实现仅依赖numpy不引入 SciPy 等外部依赖——这正是Machine learning, in numpy项目理念在工具层的一个缩影。该模块共提供 5 个函数覆盖了向量空间中三类最常用的距离族函数别名/记号适用输入典型语义euclideanL2 距离任意实数向量欧氏空间中两点直线距离manhattanL1 距离 / cityblock任意实数向量沿坐标轴方向累加的曼哈顿街区距离chebyshevL∞ 距离任意实数向量各维度差的最大值棋盘距离minkowskiMinkowski-p 距离任意实数向量 阶数p上述 L1/L2 的泛化统一形式hamming汉明距离整数值向量逐位不一致比例常用于离散编码/标签下文按照 numpy_ml.utils.distance_metrics.rst 中罗列的顺序逐一展开。euclideanL2 欧氏距离数学定义与源码欧氏距离是两个实向量x、y逐分量差的平方和再开方d(x, y) sqrt( Σ_i (x_i - y_i)^2 )numpy_ml/utils/distance_metrics.py 中的实现只有一行完全对应上式def euclidean(x, y): Compute the Euclidean (L2) distance between two real vectors return np.sqrt(np.sum((x - y) ** 2))参数与返回值x, y形状均为(N,)的numpy.ndarray即两个一维实数向量且要求长度一致N相同。返回 dfloat即两向量间的 L2 距离。当x y时返回 0.0。使用要点由于欧氏距离天然满足对称性、非负性与三角不等式它是严格的度量metric也是仓库中最常用的默认距离。它也是下文 Minkowski 距离在p2时的特例。manhattanL1 曼哈顿距离数学定义与源码曼哈顿距离把两向量的差值绝对值沿所有维度直接累加d(x, y) Σ_i |x_i - y_i|对应实现见 numpy_ml/utils/distance_metrics.pydef manhattan(x, y): Compute the Manhattan (L1) distance between two real vectors return np.sum(np.abs(x - y))参数与返回值x, y形状(N,)的一维实数向量。返回 dfloatL1 距离。使用要点相比 L2L1 对离群分量不敏感不会像平方那样放大差值在稀疏/高维特征、以及沿网格移动这类场景中更贴合语义。它与 SciPy 的scipy.spatial.distance.cityblock等价这一等价关系被仓库测试直接利用见下文对拍验证小节。chebyshevL∞ 切比雪夫距离数学定义与源码切比雪夫距离取各维度差值绝对值中的最大值d(x, y) max_i |x_i - y_i|实现见 numpy_ml/utils/distance_metrics.pydef chebyshev(x, y): Compute the Chebyshev (L∞) distance between two real vectors return np.max(np.abs(x - y))参数与返回值x, y形状(N,)的一维实数向量。返回 dfloatL∞ 距离。使用要点L∞ 度量只关心最坏的那个维度差异多大因此适合用于棋盘移动、最大偏差控制等场景它同样是 Minkowski 距离在p → ∞时的极限情形。由于只取最大值它对其他维度的细微差异完全无感。minkowski可参数化的 Minkowski-p 距离数学定义与源码Minkowski 距离把 L1/L2 等统一为一个带阶数p的公式d(x, y) ( Σ_i |x_i - y_i|^p )^(1/p)实现见 numpy_ml/utils/distance_metrics.pydef minkowski(x, y, p): Compute the Minkowski-p distance between two real vectors. return np.sum(np.abs(x - y) ** p) ** (1 / p)参数与返回值x, y形状(N,)的一维实数向量。pfloat且要求p 1。它是距离函数的阶数参数。返回 dfloatMinkowski-p 距离。参数语义与边界条件重点这是 5 个函数中唯一带额外参数的其参数语义在源码 docstring 中有明确说明值得展开p 1退化为 L1 距离即manhattanp 2退化为 L2 距离即euclideanp 1Minkowski-p不满足三角不等式因而不是合法的距离度量not a valid distance metric。这一点在 numpy_ml/utils/distance_metrics.py 的 docstring 中特别标注。使用时若需要度量性质例如作为保证三角不等式的树/图算法的距离应确保p 1p → ∞时趋近于chebyshevL∞。hamming汉明距离数学定义与源码汉明距离统计两向量逐位不一致的比例除以向量长度做了归一化d(x, y) (1/N) · Σ_i 1{x_i ≠ y_i}实现见 numpy_ml/utils/distance_metrics.pydef hamming(x, y): Compute the Hamming distance between two integer-valued vectors. return np.sum(x ! y) / len(x)参数与返回值x, y形状(N,)的numpy.ndarraydocstring 明确要求两个向量都应为整数值integer-valued。若传入浮点向量严格相等的比较可能因精度问题产生非预期结果因此按约定应传入离散取值如整数标签、编码。返回 dfloat归一化后的不一致比例取值在[0, 1]区间——两向量完全一致为 0完全不一致为 1。使用要点汉明距离适合衡量离散序列、编码或标签向量的相异程度。注意它与前四个函数不同前四个度量数值大小的差异而汉明度量取值是否不同与差的量级无关。实战直接调用示例将模块与函数导入后即可直接使用所有函数都接受两个等长一维数组import numpy as np from numpy_ml.utils.distance_metrics import ( euclidean, manhattan, chebyshev, minkowski, hamming, ) x np.array([1.0, 2.0, 3.0]) y np.array([4.0, 6.0, 3.0]) print(euclidean(x, y)) # sqrt((3)^2 (4)^2 0) 5.0 print(manhattan(x, y)) # 3 4 0 7.0 print(chebyshev(x, y)) # max(3, 4, 0) 4.0 print(minkowski(x, y, 1)) # 7.0与 manhattan 一致 print(minkowski(x, y, 2)) # 5.0与 euclidean 一致 # 汉明距离针对整数/离散向量 a np.array([1, 0, 1, 1, 0]) b np.array([1, 1, 0, 1, 0]) print(hamming(a, b)) # 不一致位数 2 / 总位数 5 0.4在写调用代码前建议先阅读 numpy_ml.utils.distance_metrics.rst 对应的函数签名其中每个函数的参数、返回类型与数学公式均有完整说明源码 docstring 中的 NumPy/SciPy 风格注释与之一致。仓库中的真实调用链BallTree 与 KNN这些距离函数不是孤立存在的——它们以可注入 metric 回调的形式被最近邻类模型消费这是本模块在项目中最核心的应用场景。BallTree默认欧氏距离、动态传入任意距离numpy_ml/utils/data_structures.py 中的BallTree构造函数接受metric参数默认值为euclidean# numpy_ml/utils/data_structures.py from .distance_metrics import euclidean class BallTree: def __init__(self, leaf_size40, metricNone): ... self.metric metric if metric is not None else euclidean该self.metric被用于两处关键计算data_structures.py建树阶段每个节点/叶子的半径取max(metric(centroid, x) for x in X)即球心到球内最远点的距离查询阶段nearest_neighbors计算查询点与候选点的metric(x, n.key)并在_knn中使用dist_to_ball dist(x, root.centroid) - root.radius做剪枝data_structures.py。因此传入不同的距离函数会直接影响树结构半径大小与剪枝效率而不仅仅改变最终距离数值。KNN以 metric 参数对外暴露numpy_ml/nonparametric/knn.py 的KNN将metric透传给BallTree注释明确写明If None, use theeuclideanmetric by defaultclass KNN: def __init__(self, k5, leaf_size40, classifierTrue, metricNone, weightsuniform): ... self._ball_tree BallTree(leaf_sizeleaf_size, metricmetric)这意味着你可以像下面这样用manhattan、chebyshev或带特定p的minkowski构造 KNN 分类器/回归器from numpy_ml.nonparametric.knn import KNN from numpy_ml.utils.distance_metrics import manhattan model KNN(k5, classifierTrue, metricmanhattan, weightsuniform) model.fit(X_train, y_train) preds model.predict(X_test)从源码结构看只要传入满足metric(x, y) - float签名的任意函数不必局限于本模块的 5 个都能作为 KNN/BallTree 的距离度量——这是该模块可扩展性的体现。正确性验证与 SciPy 的对拍测试仓库测试 numpy_ml/tests/test_utils.py 将本模块各函数与 SciPy 的对应实现逐一比对作为正确性的事实依据本模块函数SciPy 对照实现测试位置euclideanscipy.spatial.distance.euclideantest_utils.pyhammingscipy.spatial.distance.hammingtest_utils.pyminkowskiscipy.spatial.distance.minkowskitest_utils.pychebyshevscipy.spatial.distance.chebyshevtest_utils.pymanhattanscipy.spatial.distance.cityblocktest_utils.py测试逻辑为固定随机种子如np.random.seed(12345)随机生成长度 1~100 的向量用np.testing.assert_almost_equal断言两者数值一致test_minkowski还会在[1, 11]区间随机采样p值覆盖不同阶数。此外test_nonparametric.py 用metriceuclidean的KNN回归器与 scikit-learn 的KNeighborsRegressor(p2, metricminkowski, algorithmball_tree)对拍间接印证了euclidean≡minkowski(p2)这一数学等价关系在端到端模型层面同样成立。使用注意事项小结结合源码 docstring 与调用方式使用本模块时有以下几点值得留意维度一致性所有函数都要求x、y形状均为(N,)长度不同会触发 NumPy 广播或直接报错调用前应自行校验。hamming 的输入类型应传入整数值向量见 distance_metrics.py 的 docstring 约定且返回的是归一化比例而非原始不匹配计数。minkowski 的p取值p 1/p 2分别对应 L1/L2p 1时不满足三角不等式不是合法度量distance_metrics.py在依赖度量性质的算法如 BallTree 剪枝中使用需谨慎。metric 的可插拔性在BallTree/KNN中不传metric时默认欧氏距离data_structures.py传入自定义函数即可替换但需保证签名兼容f(x, y) - float。延伸阅读模块 API 参考docs/numpy_ml.utils.distance_metrics.rst距离函数源码numpy_ml/utils/distance_metrics.py消费方之一球树数据结构numpy_ml/utils/data_structures.py消费方之二KNN 模型numpy_ml/nonparametric/knn.py与 SciPy 对拍的单测numpy_ml/tests/test_utils.py端到端 KNN 回归对比测试numpy_ml/tests/test_nonparametric.py赞分享机器学习人工智能【免费下载链接】numpy-mlMachine learning, in numpy项目地址https://gitcode.com/gh_mirrors/nu/numpy-ml点击查看免费下载相关推荐NumPy 窗函数完全指南bartlett、blackman、hamming、hanning 与 kaiser 的公式、实现与实战NumPy 窗函数完全指南bartlett、blackman、hamming、hanning 与 kaiser 的公式、实现与实战 本文以 NumPy 官方参科学计算数据分析palera1n 深度解析基于 checkm8 的越狱工具原理、实战与进阶配置palera1n 深度解析基于 checkm8 的越狱工具原理、实战与进阶配置 palera1n 是一款基于 checkm8 BootROM 硬件漏洞的越狱工机器学习人工智能numpy-ml 预处理模块实战FeatureHasher、OneHotEncoder、Standardizer 与 minibatch 全解析numpy ml 预处理模块实战FeatureHasher、OneHotEncoder、Standardizer 与 minibatch 全解析 本文是 nu机器学习人工智能上一篇2025最强AI开发工具链从0到1构建AI Agents自动化测试与CI/CD流水线下一篇Bubblezone性能优化指南让你的终端应用响应速度提升10倍的秘诀创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价