机器学习中的‘距离’与‘相似度’:深入理解欧氏空间、内积与度量矩阵
机器学习中的‘距离’与‘相似度’:深入理解欧氏空间、内积与度量矩阵
第一次接触KNN分类器时,我盯着屏幕上那些被直线划分开的彩色数据点,突然意识到一个根本问题:计算机如何"看见"这些点之间的距离?后来在PCA降维项目中,当原始数据被压缩成二维散点图时,我又困惑于那些保持相对位置不变的投影点。直到系统学习了欧氏空间的数学本质,才明白这些算法背后统一的几何语言——内积定义的度量空间。
1. 欧氏空间:机器学习的几何舞台
2012年ImageNet竞赛中,AlexNet通过128维特征向量实现图像分类,这个高维空间正是典型的欧氏空间。当我们谈论"向量化"特征时,本质上是在构建一个几何环境——每个特征对应一个坐标轴,样本成为空间中的点。
欧氏空间的三大支柱:
- 内积运算:
(x,y) = Σxᵢyᵢ衡量向量对齐程度 - 向量长度:
||x|| = √(x,x)表征向量规模 - 夹角公式:
cosθ = (x,y)/(||x||·||y||)定义方向关系
在推荐系统中,用户偏好向量与商品特征向量的夹角越小(余弦接近1),匹配度越高。这正是余弦相似度的几何解释:
def cosine_similarity(a, b): dot_product = np.dot(a, b) norm_a = np.linalg.norm(a) norm_b = np.linalg.norm(b) return dot_product / (norm_a * norm_b)注意:当向量经过L2归一化后,余弦相似度等同于内积运算,这是许多推荐算法加速计算的技巧
2. 度量矩阵:隐式几何的密码本
在核方法中,我们常遇到看似违反直觉的现象:在原始空间线性不可分的数据,通过核函数映射后变得可分。这背后的数学魔术就是度量矩阵的变换。
考虑高斯核函数:
K(x,y) = exp(-γ||x-y||²)其对应的度量矩阵A满足:
Aᵢⱼ = K(xᵢ,xⱼ)通过Mercer定理,这个正定矩阵隐含定义了某个高维特征空间的内积。下表对比了常见核函数对应的几何特性:
| 核函数类型 | 公式 | 隐含维度 | 适用场景 |
|---|---|---|---|
| 线性核 | xᵀy | 原始维度 | 线性可分数据 |
| 多项式核 | (γxᵀy + r)^d | C(n+d,d) | 有序特征 |
| Sigmoid核 | tanh(γxᵀy + r) | ∞ | 神经网络前置 |
| 高斯核 | exp(-γ | x-y |
在SVM实践中,选择不同的核函数实质是在调整度量矩阵,从而改变空间的基本几何属性。我曾在一个电商用户分群项目中测试发现:对于稀疏行为数据,多项式核的效果反而优于高斯核——因为前者更好地保持了原始特征的序关系。
3. 正交性:特征解耦的数学表达
PCA算法的核心是寻找数据的主成分方向,这些方向在数学上表现为协方差矩阵的特征向量,且彼此正交。这种正交性意味着:
cov(Xᵢ, Xⱼ) = 0 (i≠j)实现PCA时,我们通常这样计算:
# 数据标准化 X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0) # 计算协方差矩阵 cov_mat = np.cov(X_std.T) # 特征分解 eigen_vals, eigen_vecs = np.linalg.eig(cov_mat) # 按特征值排序 eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:,i]) for i in range(len(eigen_vals))] eigen_pairs.sort(key=lambda k: k[0], reverse=True)提示:实际应用中常使用SVD计算更稳定,特别是当特征维度高于样本量时
在自然语言处理中,词向量的正交性也很有意思。通过观察Word2Vec生成的词向量,我们发现:
- 同义词具有较小夹角
- "国王-男人+女人≈女王"这类关系对应向量加减
- 语义无关的词向量接近正交
这种几何关系使得词向量空间成为语义推理的绝佳载体。
4. 距离度量:算法选择的数学依据
在KNN和聚类算法中,距离函数的选择直接影响模型性能。除了常见的欧氏距离,其他度量各有适用场景:
主要距离度量对比:
| 距离类型 | 公式 | 特性 | 典型应用 |
|---|---|---|---|
| 欧氏距离 | √Σ(xᵢ-yᵢ)² | 旋转不变 | 物理测量数据 |
| 曼哈顿距离 | Σ | xᵢ-yᵢ | |
| 切比雪夫距离 | max | xᵢ-yᵢ | |
| 马氏距离 | √(x-y)ᵀS⁻¹(x-y) | 考虑协方差 | 多元统计分析 |
| 余弦距离 | 1 - (xᵀy)/( | x |
在实现推荐系统时,我遇到过用户评分数据的稀疏性问题。这时采用带权重的改进余弦相似度效果更好:
def adjusted_cosine(a, b, weights): mask = np.logical_and(a != 0, b != 0) a_masked = a[mask] b_masked = b[mask] w_masked = weights[mask] if len(a_masked) == 0: return 0 dot_product = np.dot(w_masked * a_masked, b_masked) norm_a = np.linalg.norm(np.sqrt(w_masked) * a_masked) norm_b = np.linalg.norm(np.sqrt(w_masked) * b_masked) return dot_product / (norm_a * norm_b)5. 实践中的几何陷阱与解决方案
即使理解理论,实践中仍会遇到意外情况。以下是三个典型问题及应对策略:
问题1:维度灾难
- 现象:高维空间中所有点对距离趋于相同
- 解决方案:特征选择/降维 + 距离加权
问题2:量纲差异
- 现象:不同特征尺度差异淹没真实模式
- 修复方法:标准化 (Z-score) 或归一化 (Min-Max)
问题3:非欧数据
- 挑战:图数据、文本等非数值结构
- 对策:设计专用核函数或嵌入方法
在社交网络分析项目中,我们处理图数据时采用拉普拉斯矩阵特征映射,将节点嵌入到欧氏空间:
import networkx as nx from sklearn.manifold import SpectralEmbedding G = nx.karate_club_graph() embedding = SpectralEmbedding(n_components=2, affinity='precomputed') pos = embedding.fit_transform(nx.to_numpy_array(G))这种技术的数学基础正是欧氏空间中的谱理论,通过图的拉普拉斯矩阵实现拓扑结构与几何空间的连接。
