一文搞定K-近邻算法中有关于常见的距离度量的计算方法和解析

 1.欧氏距离

数学定义

对于n维空间中的两个点:

  • P = (p₁, p₂, ..., pₙ)

  • Q = (q₁, q₂, ..., qₙ)

它们之间的欧氏距离定义为:

几何解释

在二维空间中,欧氏距离就是两点间的直线距离(勾股定理)

在三维空间中:

python代码实现:

import numpy as np

def euclidean_distance(point1, point2):
    """
    计算两点之间的欧氏距离
    
    参数:
    point1, point2 -- 两个点的坐标(列表、元组或数组)
    
    返回:
    两点间的欧氏距离
    """
    # 将点转换为numpy数组
    p1 = np.array(point1)
    p2 = np.array(point2)
    
    # 计算坐标差值的平方和,然后开平方
    return np.sqrt(np.sum((p1 - p2)**2))

# 示例
pointA = [1, 2, 3]
pointB = [4, 5, 6]
distance = euclidean_distance(pointA, pointB)

print(f"点A({pointA})和点B({pointB})之间的欧氏距离: {distance:.4f}")
# 点A([1, 2, 3])和点B([4, 5, 6])之间的欧氏距离: 5.1962

2.曼哈顿距离

        曼哈顿距离(Manhattan Distance),也称为城市街区距离(City Block distance)、L1 距离出租车几何(Taxicab geometry),是一种在几何空间中度量两点间距离的方法。

核心概念

  1. 定义: 两个点在标准坐标系(笛卡尔坐标系)上的绝对轴距总和。

  2. 公式: 对于二维平面上两点 P1(x1,y1)P1(x1,y1) 和 P2(x2,y2)P2(x2,y2),它们的曼哈顿距离 dd 定义为:

    d(P1-P2)=|x1-x2|+|y1-y2|
  3. 推广到 n 维: 对于 n 维空间中的两点 P1(p1^{1},p1^{2},...,p1^{n})和 P1(p2^{1},p2^{2},...,p2^{n})

3.切比雪夫距离

        切比雪夫距离(Chebyshev distance),也称为棋盘距离(Chessboard distance)或 L∞ 度量(L-infinity metric),是一种在向量空间中定义的度量方式。它得名于俄罗斯数学家帕夫努季·切比雪夫(Pafnuty Chebyshev)。

对于 n 维空间中的两个点:

  • P = (p₁, p₂, ..., pₙ)

  • Q = (q₁, q₂, ..., qₙ)

它们的切比雪夫距离定义为 各坐标数值差绝对值的最大值

4.闵可夫斯基距离

        闵可夫斯基距离是多元空间中的广义距离度量,由德国数学家赫尔曼·闵可夫斯基提出。它统一了多种常见距离度量,通过参数 p 控制距离计算方式。

数学定义

对于 n 维空间中的两点:

  • P = (p₁, p₂, ..., pₙ)

  • Q = (q₁, q₂, ..., qₙ)

闵可夫斯基距离公式为:


其中 p ≥ 1 是决定距离计算方式的参数。

5.标准欧氏距离 

        标准欧氏距离是针对传统欧氏距离的改进版本,专门解决量纲差异和特征尺度不一致的问题。它通过对各维度进行标准化处理,使不同特征在距离计算中获得公平的权重。

核心定义

对于 n 维空间中的两个点:

  • X = (x₁, x₂, ..., xₙ)

  • Y = (y₁, y₂, ..., yₙ)

标准欧氏距离公式为:

其中:

  • $\mathbf{X} = (x_1, x_2, \dots, x_n)$$\mathbf{Y} = (y_1, y_2, \dots, y_n)$$n$ 维空间中的两个数据点

  • $x_i$$y_i$ 分别表示两个点在$i$ 个维度上的特征值

  • $s_i$$i$ 个维度在整个数据集上的标准差(样本标准差计算为 $s_i$ =\sqrt{\frac{1}{N-1}\sum_{k=1}^N (x_k^{(i)} - \mu_i)^2}

  • $n$ 是特征维度总数

完整数据集与标准欧氏距离计算示例

数据集描述

场景:电商用户行为分析
样本数:6位用户
特征维度

  1. 浏览时长(分钟/天):连续数值

  2. 点击次数(次/天):计数数据

  3. 消费金额(元):货币数据

  4. 收藏商品数(个):离散数值

计算目标

计算用户 U2 (62.8, 32, 1250.0, 12) 与 U6 (69.3, 41, 1560.8, 15) 的标准欧氏距离

分步计算过程
步骤1:计算各维度的标准差

使用样本标准差公式:

  1. 浏览时长

    • 数据:[45.2, 62.8, 28.5, 51.7, 37.9, 69.3]

    • 均值:$\mu_t = \frac{45.2+62.8+28.5+51.7+37.9+69.3}{6} = 49.23$

    • 方差:$\frac{(45.2-49.23)^2 + \cdots + (69.3-49.23)^2}{5} = 200.84$

    • 标准差:$s_t = \sqrt{200.84} = 14.17$

  2. 点击次数

    • 数据:[18, 32, 9, 24, 15, 41]

    • 均值:$\mu_c = 26.5$

    • 方差:$\frac{(18-26.5)^2 + \cdots + (41-26.5)^2}{5} = 121.9$

    • 标准差:$s_c = \sqrt{121.9} = 11.04$

  3. 消费金额

    • 数据:[320.5, 1250.0, 85.0, 780.3, 210.0, 1560.8]

    • 均值:$\mu_a = 701.27$

    • 方差:$\frac{(320.5-701.27)^2 + \cdots + (1560.8-701.27)^2}{5} = 329, 754.53$

    • 标准差:$s_a = \sqrt{329754.53} = 574.28$

  4. 收藏数

    • 数据:[7, 12, 3, 9, 5, 15]

    • 均值:$\mu_f = 8.5$

    • 方差:$\frac{(7-8.5)^2 + \cdots + (15-8.5)^2}{5} = 16.7$

    • 标准差:$s_f = \sqrt{16.7} = 4.09$

标准差汇总
$[s_t, s_c, s_a, s_f] = [14.17, 11.04, 574.28, 4.09]$


步骤2:计算标准化差异

对于每个特征维度,计算:标准化差异=\frac{|{x_{i}}-{y_{i}}|}{s_{i}}

  1. 浏览时长
    $\frac{|62.8 - 69.3|}{14.17} = \frac{6.5}{14.17} = 0.459$

  2. 点击次数
    $\frac{|32 - 41|}{11.04} = \frac{9}{11.04} = 0.815$

  3. 消费金额
    $\frac{|1250.0 - 1560.8|}{574.28} = \frac{310.8}{574.28} = 0.541$

  4. 收藏数
    $\frac{|12 - 15|}{4.09} = \frac{3}{4.09} = 0.733$


步骤3:计算平方和

平方和=∑(标准化差异)^2=(0.459)^2+(0.815)^2+(0.541)^2+(0.733)^2 =0.211+0.664+0.293+0.537=1.705=0.211+0.664+0.293+0.537=1.705


步骤4:计算最终距离

Dstd=\sqrt{1.705}=1.306

Python 完整实现验证
import numpy as np
from scipy.spatial.distance import seuclidean

# 原始数据集
data = np.array([
    [45.2, 18, 320.5, 7],   # U1
    [62.8, 32, 1250.0, 12],  # U2
    [28.5, 9, 85.0, 3],      # U3
    [51.7, 24, 780.3, 9],    # U4
    [37.9, 15, 210.0, 5],    # U5
    [69.3, 41, 1560.8, 15]   # U6
])

# 计算各列标准差
stds = np.std(data, axis=0, ddof=1)
# 输出: [14.17, 11.04, 574.28, 4.09]

# 提取目标用户
U2 = data[1]  # [62.8, 32, 1250.0, 12]
U6 = data[5]  # [69.3, 41, 1560.8, 15]

# 方法1:手动计算
diff = (U2 - U6) / stds
squared_sum = np.sum(diff**2)
manual_dist = np.sqrt(squared_sum)  # 1.306

# 方法2:Scipy函数
scipy_dist = seuclidean(U2, U6, stds)  # 1.306

# 方法3:sklearn标准化后计算欧氏距离
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(data)
U2_std = scaler.transform([U2])
U6_std = scaler.transform([U6])
sklearn_dist = np.linalg.norm(U2_std - U6_std)  # 1.306

6.余弦距离

        余弦距离是衡量两个向量方向差异的距离度量,通过计算它们夹角余弦值的补数得到。它在高维稀疏数据(如文本、推荐系统)中表现优异,对向量幅度不敏感。

核心定义

给定两个非零向量 A = (a₁, a₂, ..., aₙ) 和 B = (b₁, b₂, ..., bₙ),余弦距离公式为:

  • 分子:向量点积(内积)→ 衡量方向一致性

  • 分母:向量模的乘积 → 归一化处理

  • 范围:[0, 2]

    • 0:完全相同方向

    • 1:正交(90°夹角)

    • 2:完全相反方向(180°夹角)

几何意义

  • 只关注向量夹角θ,忽略长度差异

  • 距离值 = 1 - cosθ

  • 当向量平行时距离最小(θ=0° → cos0°=1 → 距离=0)

完整计算示例:新闻文档相似度

数据集描述

场景:3篇科技新闻的关键词词频统计
特征维度:["AI", "5G", "量子计算", "区块链"]
文档向量

分步计算过程
  1. 计算点积
    $\mathbf{D1} \cdot \mathbf{D2} = (12*8) + (3*2) + (0*6) + (8*1) = 96 + 6 + 0 + 8 = 110$

  2. 计算模长
    $||\mathbf{D1}|| = \sqrt{12^2 + 3^2 + 0^2 + 8^2} = \sqrt{144+9+0+64} = \sqrt{217} = 14.73$
    $||\mathbf{D2}|| = \sqrt{8^2 + 2^2 + 6^2 + 1^2} = \sqrt{64+4+36+1} = \sqrt{105} = 10.25$

  3. 计算余弦相似度
    $\text{cos}\theta = \frac{110}{14.73 × 10.25} = \frac{110}{150.98} = 0.729$

  4. 计算余弦距离
    $D_{\text{cos}} = 1 - 0.729 = 0.271$

7.了解内容

(1).汉明距离

        汉明距离(Hamming Distance)是信息论和计算机科学中衡量两个等长字符串差异程度的度量,定义为两个字符串在相同位置上不同字符的个数。

核心概念
  1. 定义

    • 对于两个长度相同的字符串 s1 和 s2​,汉明距离 dH​(s1​,s2​) 是满足 s1[i]≠s2[i]s1​[i]=s2​[i] 的位置 i 的数量。

    • 公式表示

      其中 [⋅] 是指示函数(若条件成立则为 1,否则为 0),n 是字符串长度。

  2. 关键限制
    仅适用于等长字符串!若长度不同,汉明距离无定义。

(2).杰卡德距离公式

        杰卡德距离(Jaccard Distance) 是衡量两个集合差异性的常用指标,与杰卡德相似系数(Jaccard Similarity Coefficient)互补。它广泛应用于数据挖掘、生态学、推荐系统等领域,特别适合处理非数值型数据(如集合、二进制向量、文本特征等)。

核心公式

设两个集合 AA 和 BB:

  • 杰卡德相似系数(Jaccard Similarity):

  • 杰卡德距离(Jaccard Distance):

其中:
  • ∣A∩B∣:集合 A 和 B 的交集大小(共同元素数量)

  • ∣A∪B∣:集合并集大小(所有唯一元素数量)

几何意义
  • 取值范围:[0,1]

    • dJ=0 → 两个集合完全相同(A=B)

    • dJ=1 → 两个集合无共同元素(A∩B=∅)

  • 对称性:dJ(A,B)=dJ(B,A)

  • 不满足三角不等式(非度量距离)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值