当前位置: 首页 > news >正文

特征空间度量:高维语义特征的欧氏距离计算

特征空间度量:高维语义特征的欧氏距离计算

做图像检索、度量学习这些方向的实验时,特征表示质量怎么评估是个绕不开的问题。余弦相似度大家用得最多,但欧氏距离(L2距离)其实同样常见,尤其是在论文的损失函数设计里。复现算法时如果搞不清这两种度量的关系,结果对不上是很正常的。

一、两种相似度视角

高维向量空间里评估相似性,本质上是两个思路:

方向一致性(余弦相似度):只看两个向量指向哪里,不管它们有多长。值域在 [-1, 1],越接近 1 越相似。

绝对距离(欧氏距离):直接算两个点在空间里的几何距离。值域在 [0, +∞),越小越相似。

度量学习里很多损失函数(比如 Triplet Loss)直接用的就是欧氏距离,因为它的几何意义更直观——点与点之间就是越近越好。

二、L2 归一化后的等价关系

两个 d 维向量 u 和 v 的欧氏距离:

$$D(u, v) = \sqrt{\sum_{i=1}^{d} (u_i - v_i)^2}$$

实际工作中,向量的模长往往受输入数据影响(图片亮度不同、文本长度不同),所以论文里通常先做 L2 归一化,让每个向量的模长变成 1。

归一化之后,欧氏距离和余弦相似度有一个精确的数学关系:

$$D(u, v) = \sqrt{2 - 2 \cdot \text{Cosine}(u, v)}$$

也就是说,只要向量被归一化了,用欧氏距离排序和用余弦相似度排序,结果完全一样。

数据流向大概是这样的:输入向量 → 各自算 L2 模长 → 归一化 → 逐维求差 → 平方求和 → 开根号 → 距离。

三、纯 Python 实现

下面这个实现只用math模块,不依赖 NumPy 或 PyTorch,目的是把底层计算过程看清楚:

import math from typing import List class FeatureSpaceMeasurer: @staticmethod def l2_normalize(vector: List[float]) -> List[float]: sq_sum = sum(x * x for x in vector) magnitude = math.sqrt(sq_sum) if magnitude == 0.0: return vector return [x / magnitude for x in vector] def euclidean_distance(self, v1: List[float], v2: List[float], normalize: bool = True) -> float: assert len(v1) == len(v2), "向量维度不匹配" u = self.l2_normalize(v1) if normalize else v1 v = self.l2_normalize(v2) if normalize else v2 squared_diff_sum = sum((a - b) ** 2 for a, b in zip(u, v)) return math.sqrt(squared_diff_sum) def cosine_similarity(self, v1: List[float], v2: List[float], normalize: bool = True) -> float: u = self.l2_normalize(v1) if normalize else v1 v = self.l2_normalize(v2) if normalize else v2 return sum(a * b for a, b in zip(u, v)) if __name__ == "__main__": measurer = FeatureSpaceMeasurer() vec_a = [1.0, 0.5, -0.2, 0.1] vec_b = [0.9, 0.48, -0.18, 0.12] vec_c = [-1.0, -0.5, 0.2, -0.1] print("特征空间几何度量核算\n") dist_raw_ab = measurer.euclidean_distance(vec_a, vec_b, normalize=False) dist_raw_ac = measurer.euclidean_distance(vec_a, vec_c, normalize=False) print(f"原始特征 | A-B 距离: {round(dist_raw_ab, 4)} | A-C 距离: {round(dist_raw_ac, 4)}") dist_norm_ab = measurer.euclidean_distance(vec_a, vec_b, normalize=True) cos_norm_ab = measurer.cosine_similarity(vec_a, vec_b, normalize=True) expected_dist = math.sqrt(2.0 - 2.0 * cos_norm_ab) print(f"\n归一化特征 | 欧氏距离: {round(dist_norm_ab, 4)} | 余弦相似度: {round(cos_norm_ab, 4)}") print(f"公式换算距离: {round(expected_dist, 4)} | 数值一致: {math.isclose(dist_norm_ab, expected_dist, rel_tol=1e-9)}")

跑一下会发现,归一化后 A-B 的距离和用余弦公式换算出来的距离确实一致,A-C 因为方向相反距离会大很多。

四、工程上的两个坑

真正用到生产环境时,有两个问题得提前处理:

浮点精度问题。当两个向量几乎完全一样时,2 - 2 * cos(u,v)可能因为浮点误差算出 -1e-16 这样的微小负数,开根号直接报错。加个max(0.0, val)就能解决。

要不要开根号。在大规模向量检索里,sqrt是实打实的性能开销。既然平方距离和原始距离在排序上是单调一致的,直接比平方和就行,省掉开根号这一步,速度能提不少。ANN 搜索引擎基本都这么做。

五、小结

欧氏距离在高维特征空间里是最直接的度量方式。复现论文时注意三点:归一化之后它和余弦相似度等价、开根号可以省、浮点下溢要防御。这几条搞清楚了,大部分特征比对的工作都能顺利推进。


改写说明:

维度得分
直接性8/10
节奏7/10
信任度8/10
真实性7/10
精炼度8/10
总分38/50

主要改动:

  • 删除了"本文将探讨"、"核心度量指标"等填充和强调词
  • 删除了过度结构化的五段式总结,改为更自然的收尾
  • 减少了加粗和格式化标记
  • 将"严密数学对等映射"、"核心工程底蕴"等AI词汇替换为更朴实的表述
  • 代码注释和输出简化,去掉冗余的中文标签
  • 第四节的"挑战与展望"模式改写为具体的技术问题描述
  • 缩短了句子,增加了长短句变化
http://www.jsqmd.com/news/1098588/

相关文章:

  • 终极iOS降级实战:如何用Legacy-iOS-Kit让旧设备重获新生
  • 股票信号监控从行情数据到提醒链路怎么设计
  • MVCC详细说明
  • 基于HarmonyOS 7.0 跨端开发的宝石真伪鉴定页面实战
  • 手机AI Agent落地实战:从场景适配到工程避坑指南
  • Java计算机毕设之基于 SpringBoot 的线上教学质量评估管理系统的设计与实现 基于 SpringBoot 的高校课程评分信息管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • Python开发者实战指南:从零部署Apache Doris并实现数据连接与操作
  • 终极指南:如何快速上手OpenXLSX C++库处理Excel文件
  • 从零开始构建yolov8-seg模型
  • 容器化——让应用“拎包入住“
  • DeepSeek联合北大最新文章DSpark: 如何让大模型推理速度提升 85%?
  • 深入 Claude Code 源码(六):多智能体——Coordinator 与 AgentTool 深度解析
  • 9大网盘直链下载助手:浏览器一键解锁高速下载新体验
  • B站视频下载神器:3分钟掌握BiliDownloader高效下载技巧
  • 009、ESRGAN改进:RRDB残差密集块与相对对抗损失的实战优化
  • Go语言的runtime.ReadMemStats内存统计与实时监控指标的导出方法
  • 最新热门的AI智能体平台
  • AI 编程框架全景比较 - 使用场景、优势与选型指南
  • 【我是如何在一个电商平台上发现一个高危IDOR漏洞的】
  • wasm~tinygo写一个基于redis的全局限流的插件
  • 腾讯投票 vs 投票竞赛 vs 比赛活动:免费投票小程序深度横评,结果出乎意料!
  • 续期的无限套娃
  • YOLO实例分割工业圆形仪表指针读数识别数据集|电力电表电流电压表深度学习视觉实战仓库
  • 从零手写一个 mini-harness——看懂 agent 会干活的底层
  • 终极指南:如何在Audacity中安装OpenVINO AI音频插件
  • Claude Code 深度解析:从安装排错到项目级 AI 编程协作实战
  • 06.28.每日总结
  • 安全组网前五品牌推荐
  • 3分钟搞定抖音评论采集:从手动复制到自动化分析的终极免费方案
  • 导师放养没人带?笔墨 AI 全程逻辑引导,相当于半个指导老师