KNN 算法知识点全面解析
KNN 算法知识点全面解析KNN 算法知识点知识导图KNN算法 ├─ 核心K近邻 → 多数表决/平均值 ├─ 流程距离计算 → 排序 → 取K邻 → 决策 ├─ 距离欧氏、曼哈顿、切比雪夫、闵可夫斯基 ├─ K值小→过拟合大→欠拟合调优网格搜索交叉验证 ├─ 预处理归一化(鲁棒差)、标准化(推荐) ├─ APIKNeighborsClassifier/Regressor └─ 案例电影分类、鸢尾花、手写数字识别1 KNN 算法简介名词解释KNNK-Nearest NeighborK 近邻算法根据样本在特征空间中K 个最相似邻居的类别通过多数表决判断自身类别回归任务取 K 个邻居目标值的平均值。核心思想样本距离越近 → 相似度越高 → 类别 / 属性越接近。2 KNN 执行流程2.1 分类流程5 步计算未知样本到所有训练样本的距离按距离升序排序选取最近的 K 个样本统计 K 个样本的类别频次多数表决→ 确定类别2.2 回归流程5 步计算未知样本到所有训练样本的距离按距离升序排序选取最近的 K 个样本计算 K 个样本目标值的平均值平均值作为预测结果3 距离度量方法3.1 欧氏距离3.2 曼哈顿距离3.3 切比雪夫距离3.4闵可夫斯基距离3.5.1 三种常见距离汇总欧氏距离d √[(x1-x2)² (y1-y2)²] 曼哈顿距离d |x1-x2| |y1-y2| 切比雪夫距离d max(|x1-x2|, |y1-y2|) 闵可夫斯基距离d (Σ|xi-yi|^p)^(1/p)3.5.2 三种距离单位圆画图4 特征预处理4.1 为什么预处理特征量纲 / 数值范围差异大 → 距离被大数值特征主导 → 模型失效。4.2 归一化后分布4.3 归一化代码fromsklearn.preprocessingimportMinMaxScaler data[[90,2,10],[60,4,15],[75,3,13]]transMinMaxScaler()print(trans.fit_transform(data))4.4 标准化分布4.5 标准化代码fromsklearn.preprocessingimportStandardScaler data[[90,2,10],[60,4,15],[75,3,13]]transStandardScaler()print(trans.fit_transform(data))4.6 归一化 vs 标准化对比辨析方法抗异常值适用场景推荐度归一化差小数据、干净数据低标准化好大数据、嘈杂数据高5 K 值选择与超参数调优5.1 K 值影响K 过小模型复杂 → 过拟合K 过大模型简单 → 欠拟合KN永远预测多数类5.2 交叉验证及网格搜索原理5.3 网格搜索实例这段代码是K 近邻KNN分类器的网格搜索调参代码功能是自动遍历所有参数组合找出 5 折交叉验证下效果最好的超参数。# 1. 导入依赖库fromsklearn.model_selectionimportGridSearchCVfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_split# 2. 加载示例数据鸢尾花数据集dataload_iris()Xdata.data# 特征ydata.target# 标签# 3. 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 4. 定义参数网格param_grid{n_neighbors:[1,3,5,7],weights:[uniform,distance],p:[1,2]}# 5. 网格搜索5折交叉验证gridGridSearchCV(KNeighborsClassifier(),param_grid,cv5)grid.fit(X_train,y_train)# 6. 输出结果print(最优超参数,grid.best_params_)print(最优交叉验证准确率,round(grid.best_score_,4))6 sklearn KNN API6.1 分类 APIfromsklearn.neighborsimportKNeighborsClassifier X[[0],[1],[2],[3]]y[0,0,1,1]knnKNeighborsClassifier(3)knn.fit(X,y)print(knn.predict([[4]]))6.2 回归 APIfromsklearn.neighborsimportKNeighborsRegressor X[[0,0,1],[1,1,0],[3,10,10]]y[0.1,0.2,0.3]knnKNeighborsRegressor(2)knn.fit(X,y)print(knn.predict([[3,11,10]]))7 实战案例7.1 鸢尾花分类完整代码fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.neighborsimportKNeighborsClassifier irisload_iris()X_train,X_test,y_train,y_testtrain_test_split(iris.data,iris.target,test_size0.2,random_state22)transStandardScaler()X_traintrans.fit_transform(X_train)X_testtrans.transform(X_test)knnKNeighborsClassifier(3)knn.fit(X_train,y_train)print(准确率,knn.score(X_test,y_test))7.2 手写数字识别完整代码importpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifier datapd.read_csv(手写数字识别.csv)Xdata.iloc[:,1:]/255ydata.iloc[:,0]X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2)knnKNeighborsClassifier(3)knn.fit(X_train,y_train)print(准确率,knn.score(X_test,y_test))8 核心考点总结8.1 核心考点总结KNN 是惰性学习无显式训练过程距离度量 K 值是两大核心必须做标准化否则距离计算失真超参数调优 网格搜索 交叉验证适合低维、小样本、分类 / 回归任务8.2 核心考点解析KNN 是惰性学习无显式训练过程意思KNN不训练模型fit\(\)只是把数据存起来不计算任何参数、不学习任何规则。关键点训练极快只是存数据预测很慢现场算所有距离没有 “学习” 过程所以叫惰性学习一句话背KNN 不训练只存数据预测时临时算距离。距离度量 K 值 是两大核心KNN 算法只靠这两个东西决定结果别的都不重要。① 距离度量怎么算 “近不近”p1曼哈顿距离格子走法p2欧氏距离直线距离② K 值找几个邻居投票K 太小 → 过拟合太敏感受噪声影响K 太大 → 欠拟合太笼统失去局部特征一句话背距离算相似度K 值定模型复杂度。必须做标准化否则距离计算失真这是 KNN 最容易丢分、最容易错的考点为什么必须标准化因为 KNN完全依赖距离。如果特征量纲不一样比如一个 0~1一个 0~10000数值大的特征会直接 “吃掉” 距离例子身高170cm收入10000 元不标准化 → 收入主导距离 → 模型完全失效。标准化方法StandardScaler或MinMaxScaler一句话背KNN 必须标准化不标准必失真。超参数调优 网格搜索 交叉验证KNN 没有要学习的参数只能手动调超参数。要调的参数n\_neighborsK 值weightsuniform / distancep距离公式调参方法固定搭配GridSearchCV 5 折交叉验证作用遍历所有参数组合自动选出最优的一组防止过拟合保证泛化能力一句话背KNN 调参 网格搜索 交叉验证。适合低维、小样本、分类 / 回归任务KNN优点缺点都很明显所以使用场景非常固定。✅ 适合数据维度不高低维数据数据量不大小样本分类任务、回归任务都能做❌ 不适合高维数据维度灾难距离失效大数据量预测太慢实时性要求高的场景一句话背KNN 适合低维小样本大数据高维别用它。