恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Orange3 距离度量模块(Orange.distance)完全指南:从欧氏距离到马氏距离的实战用法

  • 首页
  • 资讯中心
  • /
  • Orange3 距离度量模块(Orange.distance)完全指南:从欧氏距离到马氏距离的实战用法

相关资讯

avalon 属性操作进阶:`ms-attr` 从指令拆分到对象化表达的演进与源码解析 2026/10/12 1:58:47
注意力机制计算规则学习 2026/10/12 1:58:47
CAN控制器与收发器深度解析|全网独家拆解层级分工与硬件协同逻辑、厘清信号转换链路、助力车载工业CAN总线高可靠稳定通信 2026/10/12 1:58:47

最新资讯

tokscale 与 9Router 桥接实战:用 gjc 格式 JSONL 打通路由网关的用量、图表与成本估算
Claude记忆层claude-mem:从上下文窗口到外挂记忆的完整实践
Ohm 解析入门指南:从文法定义到语义实现的完整实践
为什么我们公司要全力去做低代码
Claude Code Agent Skills 深度解析:从加载到执行的完整生命周期与 TaoToken 统一接入实践
Pi 1.0 原生集成 MCP:从插件到内建的架构升级与迁移指南

今日推荐

Debian新手入门:从部署到日常操作的完整指南
MongoDB复制集扩缩容实战:从rs.add到选主事故复盘
条形码目标检测数据集实战:从YOLOv8训练到部署

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Orange3 距离度量模块(Orange.distance)完全指南:从欧氏距离到马氏距离的实战用法

发布时间:2026/10/12 2:03:47
Orange3 距离度量模块(Orange.distance)完全指南:从欧氏距离到马氏距离的实战用法 人工智能机器学习数据分析数据可视化【免费下载链接】orange3 :bar_chart: :bulb: Orange: Interactive data analysis项目地址https://gitcode.com/gh_mirrors/or/orange3点击查看免费下载本文基于 Orange3 数据挖掘库官方参考文档 distance.rst系统讲解Orange.distance模块中全部距离度量Euclidean、Manhattan、Cosine、Jaccard、四种相关系数距离、Mahalanobis 等的编程接口、归一化机制与缺失值处理原理。读完本文你将掌握如何在 Python 中快速计算行间/列间距离、如何通过fit训练距离模型并复用于新数据、如何求解最近邻以及每种距离在离散/缺失数据下的精确行为可直接用于 Orange3 数据挖掘脚本与自有实验。模块概览与快速上手Orange.distance是 Orange3 数据挖掘库参考文档位于 doc/data-mining-library/source/reference/distance.rst中负责计算数据行、列之间距离的核心模块其公开 API 定义在 Orange/distance/init.pyfrom Orange.distance import (Distance, DistanceModel, Euclidean, Manhattan, Cosine, Jaccard, SpearmanR, SpearmanRAbsolute, PearsonR, PearsonRAbsolute, Mahalanobis, MahalanobisDistance, Hamming, Bhattacharyya)模块的完整实现位于 Orange/distance/distance.py 与 Orange/distance/base.py其中核心数值计算由 Cython 实现Orange/distance/_distance.pyx。下面以 Iris 数据集演示最基本的三类用法与官方文档示例一致 from Orange.data import Table from Orange.distance import Euclidean iris Table(iris) dist_matrix Euclidean(iris) # 计算所有行两两之间的距离 # 前两个样本之间的距离 dist_matrix.X[0, 1] 0.53851648要计算所有列属性之间的距离把axis设为 0 Euclidean(iris, axis0) DistMatrix([[ 0. , 36.17927584, 28.9542743 , 57.1913455 ], [ 36.17927584, 0. , 25.73382987, 25.81259383], [ 28.9542743 , 25.73382987, 0. , 33.87270287], [ 57.1913455 , 25.81259383, 33.87270287, 0. ]])还可以计算两张表之间所有行对的距离 iris1 iris[:100] iris2 iris[100:] dist Euclidean(iris1, iris2) # 注意原文档此处笔误写为 iris_even/iris_odd dist.shape (100, 50)按切片逻辑iris1含 100 行、iris2含 50 行因此结果矩阵形状应为 (100, 50)原文档示例输出 (75, 100) 与切片定义不一致属文档笔误。通用接口Distance、DistanceModel 与 fit 训练模式所有距离度量共享同一套接口其抽象基类定义在 Orange/distance/base.py。Distance基类支持两种用法一次性用法魔数构造函数构造时直接传入一个或两个数据表内部自动完成fit并计算距离矩阵两阶段用法推荐尤其针对新数据先用无数据参数构造再调用fit(data)得到DistanceModel之后用模型对新的数据计算距离。 dist_model Euclidean(normalizeTrue).fit(iris1) # 在训练数据上拟合 dist dist_model(iris2[:3]) # 对前 3 行新数据计算距离 dist DistMatrix([[ 0. , 1.36778277, 1.11352233], [ 1.36778277, 0. , 1.57810546], [ 1.11352233, 1.57810546, 0. ]])上面的距离是在iris2的前三行上计算的归一化所用的均值与方差来自iris1拟合阶段的数据。fit的底层流程在 Orange/distance/base.py将数据转为 numpy 数组根据axis选择调用fit_rows或fit_cols生成对应的FittedDistanceModelFittedDistanceModel会保存属性列表、离散/连续列掩码、归一化统计量均值/方差或中位数/MAD以及缺失值补偿表详见 Orange/distance/base.py。构造函数参数Distance的通用构造参数Orange/distance/base.py参数类型默认值说明e1Table/Instance/np.ndarray/NoneNone用于拟合模型并计算距离的数据e2同上None若给定则计算两张表/两组数据行对之间的距离axisint1计算距离的轴1表示行、0表示列imputeboolFalse为True时结果矩阵中的 nan 被替换为 0inf 被替换为极大数callbackcallableNone计算过程中的进度回调函数similarityboolFalse为True时计算相似度而非距离仅supports_similarity的度量支持此外Euclidean与Manhattan还支持normalize参数见下文。能力标志位每个度量类通过类属性声明其能力Orange/distance/base.pysupports_discrete是否支持离散属性参与距离计算supports_missing是否原生支持缺失值支持时优先让度量自行处理而不是预先插补supports_normalization是否接受normalizeTrue参数supports_sparse是否支持稀疏数据目前支持稀疏的类依赖 sklearn 距离作为回退实现此时不支持离散值与缺失值supports_similarity是否支持similarityTrue计算相似度。这些标志不仅被文档引用也是 GUI 组件如 Distances 控件启用/禁用选项的依据见 Orange/widgets/unsupervised/owdistances.py 中的refresh_radios。返回类型 DistMatrix距离计算统一返回Orange.misc.DistMatrixOrange/misc/distmatrix.py它是numpy.ndarray的子类额外携带row_items行对应的数据、col_items列对应的数据与axis属性。因此可以直接使用 numpy 的切片、np.argsort等操作。它还提供submatrix切片、save/from_file持久化支持.dst文本格式与.xlsx、is_symmetric与auto_symmetricized等方法。最近邻查找实战两阶段用法天然适合在训练集上拟合、对查询点找最近邻的场景。文档给出了找到iris2[0]在iris1中五个最近邻居的示例 import numpy as np dist0 dist_model(iris1, iris2[0]) # 与 iris1 所有行的距离 neigh_idx np.argsort(dist0.flatten())[:5] # 最小的 5 个距离对应下标 iris1[neigh_idx] [[5.900, 3.200, 4.800, 1.800 | Iris-versicolor], [6.700, 3.000, 5.000, 1.700 | Iris-versicolor], [6.300, 3.300, 4.700, 1.600 | Iris-versicolor], [6.000, 3.400, 4.500, 1.600 | Iris-versicolor], [6.400, 3.200, 4.500, 1.500 | Iris-versicolor] ]这里dist_model(iris1, iris2[0])计算的是查询实例与iris1全部行之间的距离向量内部会把RowInstance包装成二维数组np.argsort(...)[:5]取出距离最小的五个下标再用下标对iris1取行即可得到最近邻。离散数据与缺失数据的处理原则文档明确了两条核心原则也是 Orange3 距离模块区别于朴素实现的关键离散值按度量类型处理欧氏/曼哈顿距离把一对离散值视为相同或不同贡献 0 或 1 的平方差/绝对差而 Jaccard、余弦距离把离散值视为零或非零见 Orange/distance/distance.py 的discrete_to_indicators将所有非零离散值置 1。缺失值不做简单插补假设每个变量的值服从某个未知分布在不假设分布形状的前提下计算期望距离。以欧氏距离为例已知值与缺失值的期望平方距离等于该已知值到缺失变量均值的距离平方、加上该变量的方差。欧氏距离的缺失值公式含推导依据官方设计文档 Orange/distance/distances.md 给出了完整的数学推导数值特征归一化$x \frac{x - \mu}{\sqrt{2\sigma^2}}$归一化后均值为 0、方差为 1/2一个已知值 $v$ 与一个缺失值之间的期望平方差$(v - \mu)^2 \sigma^2$两个缺失值之间的期望平方差$2\sigma^2$同行、同分布假设下列间距离时两个缺失值来自不同分布$\sigma_x^2 \sigma_y^2 (\mu_x - \mu_y)^2$归一化数据下已知值与缺失值之差为 $v^2 1/2$两个缺失值之差为 1离散特征已知值与缺失值的期望差为 $1 - p(v)$已知值取到的概率两个都缺失时为 $1 - \sum_x p(x)^2$即 Gini 指数。这些公式在代码中有精确对应连续列统计量由Euclidean.get_continuous_stats计算Orange/distance/distance.py归一化时dist_missing2_cont 1否则为2 * var离散列统计量由FittedDistance.get_discrete_stats计算Orange/distance/base.py。测试用例 Orange/distance/tests/test_distance.py 用人工手算/Excel 核对的方式验证了缺失离散值的期望距离表。支持的八种距离度量详解1. Euclidean 欧氏距离对数值型数据欧氏距离是行/列两两平方差的平方根对离散值两值不同则加 1。在处理数值与离散混合数据、或希望所有数值属性同量纲时文档强烈推荐开启normalizeTrue dist Euclidean(iris, normalizeTrue)归一化时数值被减去均值、除以偏差乘以根号 2即 $\sqrt{2\sigma^2}$。均值与偏差在调用fit时取自训练数据当直接对两张表计算、未显式调用fit时均值和方差只从第一张表计算。均值与方差始终按列计算与计算距离的轴无关因为列代表变量、来自某个分布。Euclidean的实现类为 Orange/distance/distance.py行模型EuclideanRowsModel借鉴 sklearn 的x² − 2xy y²技巧用row_normssafe_sparse_dot加速再调用 Cython 的fix_euclidean_rows(_normalized)修正含 nan 的行对并叠加离散列贡献列模型EuclideanColumnsModel类似。零方差列在归一化下会被剔除无贡献全缺失或常数列会触发ValueError见测试 test_distance.py。2. Manhattan 曼哈顿距离曼哈顿距离是绝对值差的累加。归一化与缺失值处理逻辑与欧氏距离类似区别在于**使用中位数median和中位数绝对偏差MAD**代替均值和方差归一化公式为 $x (x - m)/(2a)$。离散列上因为相同/不同仍只贡献 0 或 1所以曼哈顿距离与欧氏距离对离散列的结果一致代码中直接复用euclidean_rows_discrete见 Orange/distance/distance.py。 dist Manhattan(iris, axis1, normalizeTrue) model Manhattan(normalizeTrue).fit(iris1)实现位于 Orange/distance/distance.py统计量计算见get_continuous_statsL355-L371。3. Cosine 余弦距离余弦相似度为点积除以长度乘积长度为某行/列与自身的点积的平方余弦距离 1 − 相似度。关键行为缺失值用均值替换点积层面近似插补理论上有微小偏差见 distances.md 的讨论非零离散值一律替换为 1由此引入基值概念取值列表中的第一个值这通常在指示变量二值/布尔属性上才有意义不支持任何列归一化supports_normalization为 False但支持similarityTrue直接输出相似度。 dist Cosine(iris, axis1) sim Cosine(iris, similarityTrue) # 直接得到相似度矩阵实现见 Orange/distance/distance.pyfit_rows计算各列均值用于插补CosineModel.compute_distances插补缺失值、按行/列归一化为单位长度后做点积最后裁剪到 [-1, 1] 并输出1 - dist或dist。4. Jaccard 杰卡德距离Jaccard 相似度 两个集合交集大小 / 并集大小距离 1 − 相似度。在 Orange 中属性值被解释为集合成员指示按行计算时列被解释为集合行中非零值包括数值特征的负值表示该行属于相应集合按列计算时行是集合值表示该列属于哪些集合。缺失值处理用训练数据中的相对频率作为属于集合的概率。按行计算时统计每列非零值的相对频率按列计算时反之。计算集合交集并集时用两者都任一属于的概率替换 0/1 贡献。fit_rows通过p_nonzero统计每列非零值频率Orange/distance/distance.py稠密/稀疏分别走jaccard_rows/jaccard_cols或_compute_sparse的集合运算实现L486-L556。注意 Jaccard 不支持归一化但支持稀疏数据与similarityTrue。 dist Jaccard(data) # data 为 0/1 或含负值的指示数据 sim Jaccard(data, similarityTrue)5. SpearmanR / AbsoluteSpearmanR / PearsonR / AbsolutePearsonR四种基于相关系数的距离度量统一等于 (1 − 相关系数) / 2AbsoluteSpearmanR与AbsolutePearsonR取系数的绝对值即距离 1 − |ρ|。它们不支持缺失值与离散值supports_missing False基类 Orange/distance/distance.py。 dist PearsonR(data, axis1) # 距离 (1 - ρ) / 2 dist SpearmanRAbsolute(data, axis0) # 距离 1 - |ρ|实现上PearsonModel用 numpy 的corrcoef或自实现的_corrcoef2求两表行/列两两相关系数SpearmanModel先对数据做stats.rankdata秩变换再求相关_spearmanr2Orange/distance/distance.py。GUI 中的工具提示也明确写出了公式见 Orange/widgets/unsupervised/utils.py。6. Mahalanobis 马氏距离马氏距离与余弦距离形式相似但数据先被投影到 PCA 空间——实现上等价于使用训练数据协方差矩阵的逆fit中计算np.cov并求逆Orange/distance/distance.py然后调用 sklearn 的pairwise_distances(metricmahalanobis, VIvi)。它不支持缺失值与离散值supports_missing False且要求特征数量与协方差矩阵维度一致否则抛出ValueError(Incorrect number of features.)L843-L845。由于需要计算协方差逆矩阵文档与控件均提示大数据集上代价较高——Distances 控件对马氏距离限定了规模约 1000 行/列以内见 owdistances.py。 model Mahalanobis().fit(train_data) # 存储协方差逆矩阵 dist model(test_data)另有一个为向后兼容保留的旧类MahalanobisDistanceOrange/distance/distance.py新代码请直接使用Mahalanobis。7. Hamming 汉明距离汉明距离在 Orange/distance/distance.py 中实现基于 sklearn 的pairwise_distances(metrichamming)支持离散值、不支持稀疏与缺失值。测试见 test_distance.py。8. Bhattacharyya 巴氏距离Bhattacharyya 距离Orange/distance/distance.py将输入归一化为概率分布后计算 $-\log\sum\sqrt{p_i q_i}$经_prob_dist归一化支持稀疏数据、不支持离散值它并非严格度量不满足三角不等式代码注释中明确说明。距离计算与 GUI 的集成Distances 控件Orange.distance也是图形界面中Distances 控件Orange.widgets.unsupervised.owdistances.OWDistances的后端。该控件允许用户在行/列之间切换axis、选择 12 种度量含归一化变体并输出DistMatrix。其调用方式是理解库接口的最佳实践示例Orange/widgets/unsupervised/owdistances.pykwargs {axis: 1 - axis, impute: True, callback: callback} if metric.supports_normalization and normalized_dist: kwargs[normalize] True return metric(data, **kwargs)控件还会根据度量能力做数据预处理对不支持离散值的度量调用distance.remove_discrete_features(data, to_metasTrue)把离散列移到 meta 区、对 Jaccard 只保留二值属性remove_nonbinary_features、对不支持缺失值的度量调用distance.impute(data)插补并在界面上给出相应警告。这些辅助函数同样通过 Orange/distance/init.py 导出可直接在脚本中复用。性能与实现细节可中断计算Euclidean、Manhattan等大规模矩阵运算通过_interruptible_dot、_interruptible_sqrt按块默认每 100 列执行并周期调用callback上报进度Orange/distance/distance.pyGUI 的进度条与取消能力正依赖于此StepwiseCallbacks按各阶段权重划分进度见 L67-L77。Cython 加速欧氏/曼哈顿的 nan 修正、离散列贡献、Jaccard 行/列计算均落在 Orange/distance/_distance.pyx 的 Cython 函数中如fix_euclidean_rows、fix_manhattan_rows_normalized、jaccard_rows、jaccard_cols无缺失值的快循环与含缺失值的慢循环分离兼顾正确性与速度。稀疏数据回退Euclidean/Manhattan/Cosine/Jaccard声明supports_sparse True实际通过SklDistanceOrange/distance/base.py回退到 sklearn 的pairwise_distances这些回退不支持离散与缺失值使用时应自行预处理。测试验证模块的数值正确性由 Orange/distance/tests/test_distance.py 覆盖值得关注的点CommonTests.test_sparse验证稠密/稀疏输入结果一致L39-L57CommonFittedTests.test_mismatching_attributes拟合所用属性与预测数据属性不一致时抛ValueErrorL62-L71CommonNormalizedTests.test_zero_variance零方差列在归一化下不影响行距离列距离归一化遇常数列/全缺失列抛ValueErrorL77-L116各距离的稠密数值断言标注为手动或 Excel 计算非回归测试L173-L174即结果是经过独立核算的基准值辅助函数remove_discrete_features、remove_nonbinary_features的域变换行为也有专门测试L1071-L1105。小结Orange.distance提供了一套统一、可训练、对缺失值有严谨期望距离处理的距离计算接口Euclidean与Manhattan支持归一化与离散/缺失数据Cosine与Jaccard提供相似度模式并对离散值做零/非零解释四种相关系数距离与Mahalanobis面向纯数值数据Hamming、Bhattacharyya补充了更多场景。配合DistMatrix的 numpy 兼容能力与 Cython 加速实现既可支撑脚本化的最近邻、聚类预处理也是 Orange3 可视化工作流Distances 控件等的底层引擎。深入阅读 Orange/distance/distances.md 可了解全部归一化与缺失值公式的数学推导Orange/distance/tests/test_distance.py 则是核对具体数值结果的最佳参考。赞分享人工智能机器学习数据分析数据可视化【免费下载链接】orange3 :bar_chart: :bulb: Orange: Interactive data analysis项目地址https://gitcode.com/gh_mirrors/or/orange3点击查看免费下载相关推荐终极指南如何用1Remote统一管理所有远程连接协议终极指南如何用1Remote统一管理所有远程连接协议 在现代IT工作中远程连接管理是每个技术人员都面临的挑战。你是否厌倦了在不同工具间频繁切换为记住各种桌面应用网络Django REST Framework实战构建高性能API的架构设计与最佳实践Django REST Framework实战构建高性能API的架构设计与最佳实践 Django REST FrameworkDRF作为Python生态中文档教程终极TensorFlow欧氏距离完整指南从基础概念到实战应用的10个技巧终极TensorFlow欧氏距离完整指南从基础概念到实战应用的10个技巧 TensorFlow Course是一个专门为初学者和普通用户设计的开源项目提供了教程深度学习机器学习上一篇Minecraft PCL启动器终极指南10分钟打造个性化游戏世界下一篇思源宋体CN终极使用指南7种字重免费开源字体快速入门创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号