机器学习算法-KNN代码实现

article/2025/9/7 7:57:33

机器学习算法-KNN代码实现

  • 一、KNN算法初步理解
  • 二、代码实现
    • 1.数据集处理
    • 2.创建model
    • 3.可视化
  • 总结

一、KNN算法初步理解

统计学习方法书上的解释:给定一个训练数据集,对于新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类。

二、代码实现

1.数据集处理

数据集是使用的是鸢尾花数据集,在代码中直接从sklearn中导入即可。
要对数据集进行处理,必须得先知道数据集的特点,鸢尾花共有150个样本,类别数为3.
0~50个样本label=0,50-100样本label=1,100-150个样本label=2。并且鸢尾花特征数=4。
1.使用pandas展示数据集

from sklearn.datasets import load_iris
import pandas as pd
#导入数据集
iris = load_iris()
#iris.data得到数据,columns为列即4个特征
df = pd.DataFrame(iris.data, columns=iris.feature_names)
#添加标签label列
df['label'] = iris.target

注:iris.data得到样本特征,iris.target得到标签。
panda中dataframe用法
鸢尾花数据集分布:

在这里插入图片描述
2.数据处理
取出数据中前100个样本,并且将特征1(“speal length”)和特征2(“speal width”)作为特征
特征数目等于2。
用matplotlib中将样本可视化
plt.scatter()用法


plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()

在这里插入图片描述
准备数据集


#取前100个样本,然后特征1和特征2和label
data=np.array(df.iloc[:100,[0,1,-1]])
#数据集
X,y=data[:,:-1],data[:,-1]
#train、test的划分train/test=4:
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.2)

2.创建model


#model
class KNN():#初始化,设置neighbors=3,使用L2范数求距离def __init__(self,x_train,y_train,n_neighbors=3,p=2):self.x_train=x_trainself.y_train=y_trainself.n=n_neighborsself.p=pdef predict(self,x):#创建一个列表knn_list=[]for i in range(self.n):#求距离dist=np.linalg.norm(x-self.x_train[i],ord=self.p)#向列表knn_list添加前三个训练样本的距离和label,为元组(dist,label)#比如knn_list=[(dist0,0),(dist1,0),(dist2,1)]knn_list.append((dist,self.y_train[i]))#从第四个样本开始for i in range(self.n,len(self.x_train)):#找到knn_list中最大值索引max_index=knn_list.index(max(knn_list,key=lambda x:x[0]))dist = np.linalg.norm(x - self.x_train[i], ord=self.p)#与最大值比较,要把最大值踢出去,就是不断缩小预测样本与训练样本之间的距离if knn_list[max_index][0]>dist:knn_list[max_index]=(dist,self.y_train[i])#统计-看看有没有误判的类别,计算损失#knn列表存储了三个label值knn=[k[-1] for k in knn_list]#用key-value的形式记录label=0或1的1个数有多少个count_pairs=Counter(knn)#[0:1,1:2],得到最大计数值是label,少数服从多数原则max_count=sorted(count_pairs.items(),key=lambda x:x[-1])[-1][0]return max_countdef score(self,x_test,y_test):right_count=0n=10for x,y in zip(x_test,y_test):#调用了KNN.predictlabel=self.predict(y)if label==y:right_count+=1return right_count/len(x_test)

最后实例化类,再送入训练数据训练模型。测试集得分。


#创建model
model=KNN(X_train,Y_train)
# model.predict(X_train)
print(model.score(X_test,Y_test))
test_point=[6.0,3.0]
print('Test_point:{}'.format(model.predict(test_point)))

输出:

0.4
Test_point:1.0

3.可视化


#可视化
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
plt.plot(test_point[0], test_point[1], 'bo', label='test_point')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()

在这里插入图片描述

总结

1.KNN这种训练的过程和一般意义的训练过程不一样,KNN训练时需要给一个新的数据,让这个数据与训练集数据计算距离,并最终以少数服从多数的原则判断给定数据属于哪一类。因此KNN不具备显式的学习过程。
2.没有之前在感知机里的权重参数w和b,只有超参数k。
3.比较赞同书上的这句话:KNN算法中当训练集、距离度量、k值及分类决策规则确定后,对于任何一个新的输入实例,它所属于的类已经确定好了。就相当于把特征空间划分为一些子空间,确定子空间的每个点所属于的类,点落在这个子空间内即这个点属于这个类。
知识点:
1.k值的过大或过小会带来什么影响?
k值过大,那就意味着算法不需要花太多力气给一个数据我给它归属于一个类,也能取得很好的效果。
k值过小,意味者对数据太过敏感,模型变得复杂,容易过拟合。考虑周围有噪声等情况。


http://chatgpt.dhexx.cn/article/uWQ52M3K.shtml

相关文章

【数据挖掘基础】——KNN算法+sklearn代码实现(6)

🤵‍♂️ 个人主页:@Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 介绍算法的例子 KNN算法原理

KNN的优化算法1:距离加权

参考文章:https://www.cnblogs.com/bigmonkey/p/7387943.html 对参考文章中最后一部分说的有问题的地方进行了修改。 权值加权:为每个点的距离增加一个权重,使得距离近的点可以得到更大的权重,在此描述如何加权。 反函数 该方法最…

机器学习之深入理解K-means、与KNN算法区别及其代码实现

K-means方法是一种非监督学习的算法,它解决的是聚类问题。 1、算法简介:K-means方法是聚类中的经典算法,数据挖掘十大经典算法之一;算法接受参数k,然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足聚类中的对象…

KNN算法代码实现

原理: KNN 算法也叫K近邻算法。假设给定一个训练数据集,其中的实例类别已定。它是通过找到一个数据集中与目标数据最近的K个邻居,然后通过多数表决等方式来预测目标数据的分类结果进行预测。 三要素: 距离度量、K值、分类决策规…

KNN中的优化算法KD-tree

我们知道KNN是基于距离的一个简单分类算法,熟悉KNN的都知道,我们要不断计算两个样本点之间的距离,但是,试想一下,如果数据量特别大的时候,我们要每个都计算一下,那样计算量是非常大的&#xff0…

KNN算法代码

一、K近邻算法 KNN是一种监督学习类别的算法,全称(K-NearestNeighbor)直译为K个最近的邻居,是一种聚类算法。该算法认为我们在判断一个物体的类别可以根据与他非常相似的K个物体的类别(这K个物体的类别是已知的&#x…

KNN数据缺失值填充(附源码和数据)不调用包

KNN估计 数据缺失值填充—KNN估计一、基本思想二、步骤1.导入数据2.查看空缺值3.取出要分析的数据4.计算平均值5.计算标准差6.规范化7.计算欧几里得距离8.最优解9.画图 总结 数据缺失值填充—KNN估计 运行环境 python3.6 jupyter notebook 一、基本思想 先将数据标准化&…

数据挖掘——KNN算法的实现

👨‍💻作者简介:练习时长两年半的java博主 📖个人主页:君临๑ 🎁 ps:点赞是免费的,却可以让写博客的作者开心好几天😎 文章目录 一、k-最近邻分类算法介绍 二、k-NN的特…

KNN算法调优

1.所用方法: 交叉验证与网格搜索 交叉验证(为了让被评估的模型更加精确可信): 所有训练集数据分成N等分,几等分就是几折交叉验证 网格搜索:调参数 K-近邻:超参数K 2.API: sklearn.model_selection.GridSearchCV: CV即cross validation…

计算机编程—必备基础知识点

目录: 1. 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别 2. 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1. 编程语言 1.1 编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编…

计算机概论--计算机基础知识快速入门

0.前言1.计算机:辅助人脑的好工具 1.1计算机硬件的五大单元1.2CPU的种类1.3接口设备1.4运作流程 2.个人计算机架构与接口设备 2.1CPU2.2内存2.3显卡2.4硬盘与存储设备2.5主板 3.软件程序执行 3.1机器程序与编译程序3.2操作系统 3.2.1操作系统内核3.2.2系统调用 3.3小…

0基础如何开始学习计算机知识?

一、计算机的基本操作 计算机中只有文件和文件夹 计算机中,只有两样东西,文件和文件夹。 文件夹:本身不存储数据内容。文件夹是用来组织和管理文件的。 文件: 所有的txt文本文档,音乐,视频,图…

【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解

这是一个新坑,希望大家喜欢 电脑的基础知识大全,你确定都知道? 一、软件系统 软件系统包括:操作系统、应用软件等。应用软件中电脑行业的管理软件,IT电脑行业的发展必备利器,电脑行业的erp软件。 二、硬件系统 硬件系…

计算机知识01:计算机基础知识入门

1. 计算机运行流程 如果不是很了解电脑运行流程的话,我们可以类比一下,假设电脑是一个人体,那么每个元件对应到哪个地方呢?可以这样思考: CPU脑袋:每个人会做的事情都不一样(微指令集的差异&a…

IP地址(IP Address)

IP Address在网络中,通信节点都需要一个IP地址 以点分十进制表示,有32位二进制构成(大约43亿) 分为两个部分:网络位和主机位 网络位:代表IP地址所属的网段 主机位:代表网点上的某个节点 由子…

IP地址构成 ,以及如何求“网络地址“以及“广播地址“

IP地址(英语:IP Address, 全称:Internet Protocol Address)又称互联网协议地址。当设备连接网络,设备将被分配一个IP地址,用作标识。通过IP地址,设备间可以互相通讯,如果没有IP地址&…

电话号码对应的英语单词

问题: 电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb......... 1、您能否可以根据这样的对应关系设计一个程序&#xff…

地址的概念

前言:地址的概念 1. 地址概念及各个单位换算1.1 地址的概念1.2 单位换算1.3 举例说明,加深理解1.4 关于地址的宽度 1. 地址概念及各个单位换算 1.1 地址的概念 计算机内的数据是存储在地址里面的,地址又是以字节(Byte&#xff09…

地址的地址?

在visual studio 2019中 #include <stdio.h> #include <stdlib.h> typedef struct student { int value; struct student* next_stu; }Student; Student * creatlist(); void insertlist(Student * list,int value); int main() { Student *my_list…

GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)

转载▼ 标签&#xff1a; 杂谈 国内的有道词典和金山词典由于使用方便、宣传到位得到了许多同学的喜爱。在开源软件的领域&#xff0c;也有一款非常好用的词典GoldenDict&#xff0c;它的强项在于可以直接使用众多词典厂商的词库。那些正规的词典厂商通常购买了词典的版权…