1. KNN算法概述:从生活直觉到数学表达
K近邻算法(K-Nearest Neighbors,简称KNN)是机器学习领域最直观的算法之一。我第一次接触这个算法时,就被它"物以类聚"的朴素思想所吸引——这不就是我们日常生活中做判断的思维方式吗?比如在超市挑选水果时,我们会不自觉地观察周围相似的水果来判断品质;在陌生城市找餐馆时,也会优先选择顾客多的店面。
1.1 算法核心思想
KNN的核心逻辑可以用三句话概括:
- 保存所有训练样本(这就是所谓的"懒惰学习")
- 对新样本,计算它与所有训练样本的距离
- 找出距离最近的K个邻居,根据这些邻居的类别进行投票决策
这种思想在统计学中被称为"基于实例的学习"或"非泛化学习",因为它不像其他算法那样尝试学习一个泛化的模型,而是直接使用训练实例进行预测。
1.2 算法关键特性
KNN有几个显著特点值得特别注意:
- 无显式训练过程:与大多数机器学习算法不同,KNN没有"训练"阶段。所谓的"训练"其实就是把数据存储起来,这导致:
- 优点:新增数据时不需要重新训练
- 缺点:预测时需要计算与所有训练样本的距离,计算量大
- 基于局部信息:决策仅依赖于最近的几个样本,而不是全局数据分布
- 距离敏感:算法性能高度依赖于距离度量的选择
注意:虽然KNN看起来简单,但在实际应用中,选择合适的距离度量和K值需要仔细考虑。我在第一次使用时,就因为没有对特征进行标准化而得到了糟糕的结果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法数学基础与实现细节
2.1 距离度量详解
距离度量是KNN的核心,决定了"相似性"的量化方式。除了常见的欧氏距离和曼哈顿距离,实际应用中还有其他选择:
2.1.1 欧氏距离(L2距离)
最常用的距离度量,几何意义就是两点间的直线距离:
$$
d(x,y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}
$$
特点:
- 对大的差异更敏感(因为平方操作放大了大偏差的影响)
- 适用于连续变量
- 对异常值敏感
2.1.2 曼哈顿距离(L1距离)
也称为城市街区距离:
$$
d(x,y) = \sum_{i=1}^{n}|x_i - y_i|
$$
特点:
- 对异常值比欧氏距离更鲁棒
- 计算速度稍快(省去了平方和开方运算)
- 在某些情况下能更好地保持原始数据的几何特性
2.1.3 余弦相似度
特别适用于文本数据和高维稀疏数据:
$$
\text{similarity} = \frac{x \cdot y}{||x|| \cdot ||y||}
$$
特点:
- 关注向量方向而非大小
- 对绝对数值不敏感
- 常用于文档相似度计算
2.1.4 马氏距离
考虑特征间相关性的距离度量:
$$
D_M(x,y) = \sqrt{(x-y)^T S^{-1} (x-y)}
$$
其中S是协方差矩阵。
特点:
- 自动处理不同尺度的问题
- 考虑特征相关性
- 计算成本较高
2.2 K值选择策略
K值的选择对算法性能有重大影响。经过多个项目的实践,我总结出以下经验:
2.2.1 常用选择方法
- 经验法则
