机器学习算法:K近邻算法-KNN

168 阅读4分钟

image.png

1. K近邻算法是什么?

定义:

K近邻是一种基于实例的懒惰学习(Lazy Learning)算法,用于分类和回归任务

  • 核心思想: “物以类聚” ——通过计算样本间的距离,找到目标点的最近K个邻居,根据邻居的多数类别(分类)或平均值(回归)进行预测。
  • 非参数模型:不假设数据分布,直接依赖数据本身的结构。

2. 核心原理

工作流程

  1. 计算距离:使用欧氏距离、曼哈顿距离等衡量样本间相似度

  2. 选择K值:确定参与投票的邻居数量(如K=3)。

  3. 投票或平均:

    1. 分类:统计K个邻居中多数类别作为预测结果。
    2. 回归:取K个邻居目标值的平均值。

关键参数

  • K值:

    • K过小 → 对噪声敏感,容易过拟合。
    • K过大 → 忽略局部特征,可能欠拟合。

  • 距离度量:

    • 欧氏距离(默认):适用于连续特征。
    • 曼哈顿距离:对异常值更鲁棒。
    • 余弦相似度:适合文本或高维稀疏数据。

数据预处理

  • 标准化/归一化:消除不同特征量纲的影响(如年龄范围0-100 vs 收入范围0-1e6)。
  • 处理缺失值:填充或删除缺失样本。

3. 实际生产中的例子

案例1:推荐系统(相似用户推荐)

  • 场景:视频平台根据用户观看记录推荐内容。

  • 实现:

    • 将用户表示为特征向量(如观看类型、时长、评分)。
    • 找到与目标用户最接近的K个用户,推荐他们喜欢的视频。
  • 优点:简单直观,适合冷启动问题

案例2:医疗诊断(疾病分类)

  • 场景:根据患者症状判断疾病类型。
  • 特征:体温、血压、化验指标、病史编码。
  • 输出:疾病类别(如流感、肺炎)。
  • 应用:辅助医生快速匹配相似病例。

案例3:金融风控(欺诈检测)

  • 场景:识别信用卡异常交易。
  • 特征:交易金额、时间、地点、商户类型。
  • 输出:正常(0)或欺诈(1)。
  • 应用:标记与历史欺诈交易最相似的K笔交易。

案例4:图像分类(简单图像识别)

  • 场景:手写数字识别(如MNIST数据集)。

  • 实现:

    • 将图像像素展开为特征向量。
    • 计算测试图像与训练集中所有图像的欧氏距离,取最近K个邻居的多数类别。
  • 局限:计算成本高,适合小规模数据。


4. 生产中的优化方法

降低计算复杂度

  • KD树或球树:空间数据结构,加速近邻搜索(适合低维数据)。
  • 近似最近邻(ANN):如Facebook的FAISS库,用哈希或量化技术牺牲精度换速度(适合高维大数据)。

处理类别不平衡

  • 加权投票:根据邻居距离赋予不同权重(近邻投票权重更大)。
  • 调整K值:增加K以包含更多潜在少数类样本。

特征选择与降维

  • 使用PCA或LDA减少特征维度,缓解“维度灾难”(高维下距离区分度下降)。

5. 优缺点

优点

  • ✅ 简单易懂,无需训练过程(“懒惰学习”)。
  • ✅ 对数据分布无假设,适应复杂模式。
  • ✅ 天然支持多分类和回归任务。

缺点

  • ❌ 计算成本高(需存储全部数据,预测时实时计算)。
  • 对高维数据和大规模数据性能差(维度灾难)
  • ❌ 对噪声和不相关特征敏感。

6. 代码工具示例(Python)

image.png

7. 与逻辑回归的对比

​​维度​​​​K近邻​​​​逻辑回归​​
​​模型类型​​非参数,基于实例参数,基于概率模型
​​训练速度​​无需训练(惰性学习)需迭代优化参数
​​预测速度​​慢(需计算所有样本距离)快(直接计算加权和)
​​可解释性​​低(依赖局部邻居)高(权重反映特征重要性)
​​适用场景​​小数据、低维、非线性关系大数据、线性或近似线性关系

8. 适用场景总结

  • 推荐使用KNN:

    • 数据量较小且特征维度低(如数百样本、几十维度)。
    • 需要快速验证简单模型(如原型验证阶段)。
    • 数据存在复杂局部模式且无需全局解释。
  • 避免使用:

    • 数据量极大(百万级以上)或特征维度极高(如文本、图像)。
    • 实时性要求高(如高频交易系统)。

一句话总结

K近邻是“近朱者赤”的直观算法,凭借简单性和无假设特性,在小规模、低维场景中表现优异,但计算成本限制了其在大数据中的应用。