在数据分析、机器学习、模式识别等领域,距离函数用于衡量两个对象(向量、集合、字符串等)之间的相似性或差异性。不同的距离函数适用于不同的数据类型和业务场景,以下是常见距离函数的总结,按应用场景分类整理:
一、适用于连续型向量的距离(数值型数据)
这类距离主要用于衡量欧几里得空间中两个点(向量)的距离,适用于连续数值特征(如身高、体重、像素值等)。
距离名称 | 定义与公式 | 适用场景 | 特点 |
---|---|---|---|
欧几里得距离(Euclidean Distance) | 两点之间的直线距离,是最常用的距离度量。 公式:对于向量 (a=(a_1,a_2,...,a_n)) 和 (b=(b_1,b_2,...,b_n)), (d(a,b) = \sqrt{\sum_{i=1}^n (a_i - b_i)^2}) | 计算机视觉(如特征点匹配)、推荐系统(用户偏好向量比较)、聚类分析(K-Means默认距离) | 直观且符合人类对"距离"的认知;但受量纲影响大(如厘米和米需先标准化)。 |
曼哈顿距离(Manhattan Distance) | 各维度坐标差的绝对值之和,又称"城市街区距离"。 公式:(d(a,b) = \sum_{i=1}^n | a_i - b_i | ) |
切比雪夫距离(Chebyshev Distance) | 各维度坐标差的最大值。 公式:(d(a,b) = \max_{i=1...n} | a_i - b_i | ) |
闵可夫斯基距离(Minkowski Distance) | 欧几里得、曼哈顿、切比雪夫距离的推广,由参数 (p) 控制。 公式:(d(a,b) = (\sum_{i=1}^n | a_i - b_i | p){1/p}) |
标准化欧几里得距离 | 先对数据标准化(消除量纲),再计算欧几里得距离。 公式:(d(a,b) = \sqrt{\sum_{i=1}^n (\frac{a_i - b_i}{\sigma_i})^2}),其中 (\sigma_i) 是第 (i) 维度的标准差。 | 特征量纲差异大的场景(如"年龄(0-100)"和"收入(0-100万)") | 解决了欧几里得距离的量纲问题,更适合跨维度比较。 |
马氏距离(Mahalanobis Distance) | 考虑特征间协方差的距离,不受量纲影响,且能消除维度相关性。 公式:(d(a,b) = \sqrt{(a-b)^T \Sigma^{-1} (a-b)}),其中 (\Sigma) 是数据的协方差矩阵。 | 异常检测(如信用卡欺诈识别)、同一分布内的点距离度量 | 对高维、特征相关的数据更友好;但需已知数据分布(协方差矩阵)。 |
二、适用于向量方向的距离(不关注大小,仅关注方向)
这类距离更注重向量的"方向相似性",而非绝对数值大小,常用于文本、图像等高维稀疏数据。
距离名称 | 定义与公式 | 适用场景 | 特点 |
---|---|---|---|
余弦距离(Cosine Distance) | 基于余弦相似度的距离((1 - \text{余弦相似度}))。 余弦相似度公式:(\cos\theta = \frac{a \cdot b}{ | a | |
角度距离(Angular Distance) | 向量夹角的弧度值。 公式:(d(a,b) = \arccos(\cos\theta))((\cos\theta) 为余弦相似度) | 需严格度量方向差异的场景(如方向传感器数据比较) | 直接反映夹角大小,范围为 ([0, \pi]),比余弦距离更直观。 |
三、适用于集合或二进制数据的距离(0-1特征、布尔值)
这类数据通常表示"有无"(如"是否购买商品""基因是否表达"),距离需反映集合的重叠程度。
距离名称 | 定义与公式 | 适用场景 | 特点 |
---|---|---|---|
杰卡德距离(Jaccard Distance) | 基于杰卡德系数(集合交集与并集的比值),衡量两个集合的不相似度。 公式:(d(A,B) = 1 - \frac{ | A \cap B | }{ |
汉明距离(Hamming Distance) | 两个等长字符串(或二进制向量)中,对应位置元素不同的数量。 公式:对二进制向量 (a,b),(d(a,b) = \sum_{i=1}^n | a_i - b_i | ) |
dice距离(Dice Distance) | 基于Dice系数的距离((1 - \text{Dice系数}))。 Dice系数公式:(\frac{2 | A \cap B | }{ |
四、适用于字符串的距离(序列数据)
用于衡量两个字符串(或序列)的差异,需考虑插入、删除、替换等操作。
距离名称 | 定义与公式 | 适用场景 | 特点 |
---|---|---|---|
编辑距离(Levenshtein Distance) | 将一个字符串转换为另一个所需的最少插入、删除、替换操作次数。 (无简洁公式,需动态规划计算) | 拼写纠错(如"teh"到"the"的距离为1)、自然语言处理(文本相似度)、DNA序列比对 | 灵活处理不同长度的字符串;但计算复杂度较高((O(nm)),(n,m) 为字符串长度)。 |
最长公共子序列距离(LCS Distance) | 基于最长公共子序列(LCS)长度的距离:(d = 1 - \frac{ | LCS(a,b) | }{\max(len(a), len(b))}) |
五、选择距离函数的核心原则
- 数据类型优先:连续数值优先用欧几里得/曼哈顿;二进制/集合用杰卡德/汉明;字符串用编辑距离。
- 业务目标:关注"大小差异"用欧几里得;关注"方向差异"用余弦距离;关注"极端值"用切比雪夫。
- 数据特性:高维稀疏数据优先余弦距离(避免维度灾难);特征相关数据用马氏距离;量纲差异大时用标准化距离。
实际应用中,常需通过实验(如对比不同距离下模型的准确率)选择最优方案。