1. KNN算法核心原理剖析
KNN(K-Nearest Neighbors)作为机器学习中最直观的算法之一,其核心思想可以用一个生活场景来理解:当你搬到一个新小区,想了解这个区域的房价水平时,最直接的方法就是询问离你最近的几户邻居的成交价。这正是KNN的本质——通过样本在特征空间中的最近邻来判断其类别。
1.1 算法数学表达
给定训练集 $T={(x_1,y_1),(x_2,y_2),...,(x_n,y_n)}$ 其中$x_i$为特征向量,$y_i$为类别标签。对于待分类样本$x_q$,其预测类别$\hat{y}$由以下步骤决定:
- 计算$x_q$与所有$x_i$的距离$d(x_q,x_i)$
- 选取距离最小的k个样本构成集合$N_k$
- 根据$N_k$中样本的类别进行投票:$\hat{y}=\arg\max_{c}\sum_{(x_i,y_i)\in N_k}I(y_i=c)$
其中距离度量通常采用:
- 欧氏距离:$d=\sqrt{\sum_{j=1}^m(x_{qj}-x_{ij})^2}$
- 曼哈顿距离:$d=\sum_{j=1}^m|x_{qj}-x_{ij}|$
- 余弦相似度:$d=1-\frac{x_q\cdot x_i}{||x_q||\cdot||x_i||}$
1.2 关键参数解析
k值选择是算法核心:
- k过小:模型对噪声敏感,容易过拟合(如k=1时就是简单复制邻居标签)
- k过大:模型变得过度平滑,可能忽略局部特征(极端情况k=n时所有预测都是多数类)
经验法则:
- 分类问题:k通常取奇数避免平票
- 回归问题:k取$\sqrt{n}$附近的奇数值
- 实际项目中需要通过交叉验证确定最优k
提示:在sklearn中可通过GridSearchCV进行k值调优,建议搜索范围3-15的奇数
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现与工程优化
2.1 基础实现方案
使用Python手动实现核心逻辑:
python复制import numpy as np
from collections import Counter
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X
