news 2026/4/24 14:49:57

KNN算法的API实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
KNN算法的API实现

简述:
1. KNN算法介绍:(K Nearest Neighbor-K近邻算法)

2. 原理
1️⃣ 基于欧氏距离(欧氏距离=对应维度差值平方和,开平方根,简单理解:勾股定理)(或其他距离计算方式)计算测试集和每个调试集之间的距离,再根据距离排序,找到最近的K个样本
2️⃣ 基于K个样本投票,票组多的就作为最终预测结果 ==》分类问题;
3️⃣ 基于K个样本计算均值,作为最终预测结果 ==》回归问题;

3. 实现思路:
1️⃣ 分类问题:适用于:适用于有特征、有标签且标签是不连续的(离散的);
2️⃣ 回归问题:适用于:适用于有特征、有标签且标签是连续的;

4. KNN算法分类问题思路
1️⃣ 计算测试集和每个训练的样本之间的距离;
2️⃣基于距离进行升序排序;
3️⃣找到最近的K个样本;
4️⃣①分类问题:K个样本进行投票;|| ②回归问题:基于K个样本的标签计算均值;
5️⃣①分类问题:票数多的结果,作为最终预测结果;|| ②回归问题:将计算出的均值,作为最终的预测结果;

5. 代码实现思路:
1️⃣ 导包;
2️⃣准备数据集(测试集 和 训练集);
3️⃣ 创建模型对象(KNN模型对象/ KNN回归对象);
4️⃣ 模型训练;
5️⃣ 模型预测;

6. 总结:
K值过小,容易受到异常值的影响且会导致模型学到大量"脏的特征",导致出现:过拟合;
K值过大,模型会变得简单,容易发生:欠拟合;

1. KNN算法分类API

# 1.导包;fromsklearn.neighborsimportKNeighborsClassifier#KNN算法的 分类模型# 2.准备数据集(测试集 和 训练集);x_train=[[0],[1],[2],[3]]#训练集的特征数据:因为特征可以有多个,所以是一个二维数组y_train=[0,0,1,1]#训练集的标签数据:因为标签是离散的,所以是一个一维数组x_test=[[5]]#测试集的特征数据:要和测试集特征格式保持一致# 3.创建模型对象(KNN模型对象);# estimator:估计器,模型对象,也可以用变量名model做接收estimator=KNeighborsClassifier(n_neighbors=3)# 4.模型训练;# 传入训练集的特征数据、训练集的标签数据estimator.fit(x_train,y_train)#不需要返回值# 5.模型预测;# 传入测试集的特征数据,获取到:预测结果(测试集的标签:y_test)y_pred=estimator.predict(x_test)# 6.打印预测结果print(f'预测值为:{y_pred}')# 求谁离5最近?3(因为5-3=2,2平方=4,4开根号=2即为根号4)# 5和2之间的距离:5-2=3,3的平方=9,9开根号=3# n_neighbors=2求的是距离x_test=5最近的2个即3,2,对3,2对应的y_train进行投票,投票结果:都是1,所以最终预测结果是1# n_neighbors=3求的是距离x_test=5最近的3个即3,2,1,对3,2,1对应的y_train进行投票,投票结果:1个0、2个1,所以最终预测结果是1# n_neighbors=4求的是距离x_test=5最近的4个即4,3,2,1,对4,3,2,1对应的y_train进行投票,投票结果:2个0、2个1,# 但是0<1,两个预测值哪个结果小就认为哪个模型更简单,根据奥卡姆剃刀原则(给定两个具有相同泛化误差的模型,较简单的模型 比 较复杂的模型更可取),所以最终预测结果是0;# 当票数相同时,优先选择再训练集中最早出现的类别,在y_train=[0,0,1,1],0比1更早出现,所以最终预测结果是0# 当票数相同时,会比较Unicode,0更小,所以预测结果是0# Scikit-learn中平票处理:默认选择数值较小的标签,可以通过设置weights='distance',让距离近的样本有更大权重、选择距离最近的标签;

2. KNN算法回归API

# 1.导包;fromsklearn.neighborsimportKNeighborsRegressor#KNN算法的 回归模型# 2.准备数据集(测试集 和 训练集);# 差值:(3,11,9) (2,10,10) (0,1,0) (1,0,2)# 平方和:211 204 1 5# 开根号:14.53 14.28 1 2.24x_train=[[0,0,1],[1,1,0],[3,10,10],[4,11,12]]#训练集的特征数据:因为特征可以有多个,所以是一个二维数组y_train=[0.1,0.2,0.3,0.4]#训练集的标签数据:因为标签是连续的,所以是一个一维数组x_test=[[3,11,10]]#测试集的特征数据:要和测试集特征格式保持一致# 3.创建模型对estimator=KNeighborsRegressor(n_neighbors=4)# 4.模型训练estimator.fit(x_train,y_train)# 5.模型预测y_pre=estimator.predict(x_test)# 6.打印预测结果:print("预测结果:",y_pre)# n_neighbors=3:3邻距,求距离最近(平方和/开根号 最小)的3个值分别对应的y_train的值,即 0.2, 0.3, 0.4,三者平均值是0.3,所以预测结果为0.3;# n_neighbors=2:2邻距,求距离最近(平方和/开根号 最小)的2个值分别对应的y_train的值,即 0.3, 0.4,两者平均值是0.35,所以预测结果为0.35;# n_neighbors=4:4邻距,求距离最近(平方和/开根号 最小)的4个值(即跟样本数一致)分别对应的y_train的值,即 0.1, 0.2, 0.3, 0.4,求平均数,所以预测结果为0.25;# (因为找的数是所有的全算,即k=n,当k=n时永远取全部数字的平均值,即k值过大会发生欠拟合,k值过小会发生过拟合)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 14:46:26

宁德时代股东减持5800万股:套现238亿 UBS斥资60亿接盘

雷递网 雷建平 4月23日宁德时代&#xff08;证券代码&#xff1a;300750&#xff09;今日发布公告称&#xff0c;持股5%以上股东宁波联合创新新能源投资管理合伙企业&#xff08;有限合伙&#xff09;&#xff08;简称“宁波联创”&#xff09;减持&#xff0c;持股比例从6.23%…

作者头像 李华
网站建设 2026/4/24 14:46:24

无需重启!llama2.c实现运行时动态切换模型的3个关键技术

无需重启&#xff01;llama2.c实现运行时动态切换模型的3个关键技术 【免费下载链接】llama2.c Inference Llama 2 in one file of pure C 项目地址: https://gitcode.com/GitHub_Trending/ll/llama2.c llama2.c是一个用纯C语言实现Llama 2推理的轻量级项目&#xff0c;…

作者头像 李华
网站建设 2026/4/24 14:46:23

超高效llama2.c批量推理:内存节省50%的实战技巧

超高效llama2.c批量推理&#xff1a;内存节省50%的实战技巧 【免费下载链接】llama2.c Inference Llama 2 in one file of pure C 项目地址: https://gitcode.com/GitHub_Trending/ll/llama2.c llama2.c是一个轻量级项目&#xff0c;它允许在纯C语言环境中实现Llama 2模…

作者头像 李华
网站建设 2026/4/24 14:42:22

终极德州扑克GTO求解器:Desktop Postflop完整使用指南

终极德州扑克GTO求解器&#xff1a;Desktop Postflop完整使用指南 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/desktop-postflop …

作者头像 李华
网站建设 2026/4/24 14:42:19

Phi-3.5-mini-instruct部署优化:vLLM引擎参数调优提升GPU利用率50%

Phi-3.5-mini-instruct部署优化&#xff1a;vLLM引擎参数调优提升GPU利用率50% 1. 模型简介与部署基础 Phi-3.5-mini-instruct是一个轻量级的开放模型&#xff0c;属于Phi-3模型家族。它基于高质量、推理密集的数据集构建&#xff0c;支持128K令牌的上下文长度。该模型经过监…

作者头像 李华