机器学习-KNN分类算法

1.1 KNN分类

        KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法。它是概念极其简单,而效果又很优秀的分类算法。1967年由Cover T和Hart P提出。

        KNN分类算法的核心思想:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

        如图,假设已经获取一些动物的特征,且已知这些动物的类别。现在需要识别一只新动物,判断它是哪类动物。首先找到与这个物体最接近的k个动物。假设k=3,则可以找到2只猫和1只狗。由于找到的结果中大多数是猫,则把这个新动物划分为猫类。

KNN方法有三个核心要素:

1.K值

        如果k取值太小,好处是近似误差会减小。但同时预测结果对近邻的样本点非常敏感,仅由非常近的训练样本决定预测结果。使模型变得复杂,容易过拟合。如果k值太大,学习的近似误差会增大,导致分类模糊,即欠拟合。

        下面举例看k值对预测结果的影响。对图5.2中的动物进行分类,当k=3时,分类结果为“猫:狗=2:1”,所以属于猫;当k=5时,表决结果为“猫:狗:熊猫=2:3:1”,所以判断目标动物为狗。

 

        那么K值到底怎么选取呢?涉及到距离的度量问题。

2.距离的度量

        不同的距离所确定的近邻点不同。平面上比较常用的是欧式距离。此外还有曼哈顿距离、余弦距离、球面距离等。

可以得到距离如下所示

3.分类决策规则

        分类结果的确定往往采用多数表决原则,即由输入实例的k个最邻近的训练实例中的多数类决定输入实例的类别。

1.2 初识KNN——鸢尾花分类

1.查看数据

SKlearn中的iris数据集有5个key,分别如下:

  • target_names : 分类名称,包括setosa、versicolor和virginica类。
  • data : 特征数据值。
  • target:分类(150个)。
  • DESCR: 数据集的简介。
  • feature_names: 特征名称。

【例】查看鸢尾花iris数据集。

#【例1.1】对鸢尾花iris数据集进行调用,查看数据的各方面特征。
from sklearn.datasets import load_iris
iris_dataset = load_iris()
#下面是查看数据的各项属性
print("数据集的Keys:\n",iris_dataset.keys())     #查看数据集的keys。
print("特征名:\n",iris_dataset['feature_names'])  #查看数据集的特征名称
print("数据类型:\n",type(iris_dataset['data']))    #查看数据类型
print("数据维度:\n",iris_dataset['data'].shape)    #查看数据的结构
print("前五条数据:\n{}".format(iris_dataset['data'][:5]))  #查看前5条数据
#查看分类信息
print("标记名:\n",iris_dataset['target_names']) 
print("标记类型:\n",type(iris_dataset['target']))
print("标记维度:\n",iris_dataset['target'].shape)
print("标记值:\n",iris_dataset['target'])
#查看数据集的简介
print('数据集简介:\n',iris_dataset['DESCR'][:20] + "\n.......")  #数据集简介前20个字符
运行结果: 
数据集的Keys:dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
特征名:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
数据类型:<class 'numpy.ndarray'>
数据维度:(150, 4)
前五条数据:
[[5.1 3.5 1.4 0.2][4.9 3.  1.4 0.2][4.7 3.2 1.3 0.2][4.6 3.1 1.5 0.2][5.  3.6 1.4 0.2]]
标记名:['setosa' 'versicolor' 'virginica']
标记类型:<class 'numpy.ndarray'>
标记维度:(150,)
标记值:[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2]
数据集简介:Iris Plants Database
.......
 2.数据集拆分

        使用train_test_split函数。train_test_split函数属于sklearn.model_selection类中的交叉验证功能,能随机地将样本数据集合拆分成训练集和测试集。

【例】对iris数据集进行拆分,并查看拆分结果。

#【例1.2】对iris数据集进行拆分,并查看拆分结果。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split( iris_dataset['data'], iris_dataset['target'], random_state=2)
print("X_train",X_train)
print("y_train",y_train)
print("X_test",X_test)
print("y_test",y_test)
print("X_train shape: {}".format(X_train.shape))
print("X_test shape: {}".format(X_test.shape))
运行结果:
X_train [[5.5 2.3 4.  1.3][6.9 3.1 5.1 2.3][6.  2.9 4.5 1.5][6.2 2.9 4.3 1.3][6.8 3.2 5.9 2.3][5.  2.3 3.3 1. ][4.8 3.4 1.6 0.2][6.1 2.6 5.6 1.4][5.2 3.4 1.4 0.2][6.7 3.1 4.4 1.4][5.1 3.5 1.4 0.2][5.2 3.5 1.5 0.2][5.5 3.5 1.3 0.2][4.9 2.5 4.5 1.7][6.2 3.4 5.4 2.3][7.9 3.8 6.4 2. ][5.4 3.4 1.7 0.2][6.7 3.1 5.6 2.4][6.3 3.4 5.6 2.4][7.6 3.  6.6 2.1][6.  2.2 5.  1.5][4.3 3.  1.1 0.1][4.8 3.1 1.6 0.2][5.8 2.7 5.1 1.9][5.7 2.8 4.1 1.3][5.2 2.7 3.9 1.4][7.7 3.  6.1 2.3][6.3 2.7 4.9 1.8][6.1 2.8 4.  1.3][5.1 3.7 1.5 0.4][5.7 2.8 4.5 1.3][5.4 3.9 1.3 0.4][5.8 2.8 5.1 2.4][5.8 2.6 4.  1.2][5.1 2.5 3.  1.1][5.7 3.8 1.7 0.3][5.5 2.4 3.7 1. ][5.9 3.  4.2 1.5][6.7 3.1 4.7 1.5][7.7 2.8 6.7 2. ][4.9 3.  1.4 0.2][6.3 3.3 4.7 1.6][5.1 3.8 1.5 0.3][5.8 2.7 3.9 1.2][6.9 3.2 5.7 2.3][4.9 3.1 1.5 0.1][5.  2.  3.5 1. ][4.9 3.1 1.5 0.1][5.  3.5 1.3 0.3][5.4 3.7 1.5 0.2][6.8 3.  5.5 2.1][6.3 3.3 6.  2.5][5.  3.4 1.6 0.4][5.2 4.1 1.5 0.1][6.3 2.5 5.  1.9][7.7 2.6 6.9 2.3][6.  2.2 4.  1. ][7.2 3.6 6.1 2.5][4.9 2.4 3.3 1. ][6.1 2.8 4.7 1.2][6.5 3.  5.2 2. ][5.1 3.5 1.4 0.3][7.4 2.8 6.1 1.9][5.9 3.  5.1 1.8][6.4 2.7 5.3 1.9][4.4 2.9 1.4 0.2][5.6 2.8 4.9 2. ][5.1 3.4 1.5 0.2][5.  3.3 1.4 0.2][5.7 2.6 3.5 1. ][6.9 3.1 5.4 2.1][5.5 2.6 4.4 1.2][6.3 2.8 5.1 1.5][7.  3.2 4.7 1.4][6.8 2.8 4.8 1.4][6.5 3.2 5.1 2. ][6.9 3.1 4.9 1.5][5.5 2.4 3.8 1.1][5.6 3.  4.5 1.5][6.  3.  4.8 1.8][6.  2.7 5.1 1.6][5.8 2.7 5.1 1.9][5.9 3.2 4.8 1.8][5.1 3.8 1.6 0.2][6.2 2.2 4.5 1.5][5.6 3.  4.1 1.3][5.6 2.5 3.9 1.1][5.8 2.7 4.1 1. ][6.4 3.1 5.5 1.8][6.6 2.9 4.6 1.3][5.5 4.2 1.4 0.2][4.4 3.  1.3 0.2][6.3 2.9 5.6 1.8][6.4 3.2 4.5 1.5][7.3 2.9 6.3 1.8][5.  3.6 1.4 0.2][7.1 3.  5.9 2.1][4.9 3.1 1.5 0.1][6.5 3.  5.5 1.8][6.7 3.3 5.7 2.1][5.4 3.4 1.5 0.4][6.1 2.9 4.7 1.4][4.6 3.2 1.4 0.2][6.7 3.  5.2 2.3][5.7 3.  4.2 1.2][5.  3.4 1.5 0.2][6.5 3.  5.8 2.2][6.6 3.  4.4 1.4][5.  3.5 1.6 0.6][4.6 3.6 1.  0.2][6.3 2.5 4.9 1.5][5.7 4.4 1.5 0.4]]
y_train [1 2 1 1 2 1 0 2 0 1 0 0 0 2 2 2 0 2 2 2 2 0 0 2 1 1 2 2 1 0 1 0 2 1 1 0 11 1 2 0 1 0 1 2 0 1 0 0 0 2 2 0 0 2 2 1 2 1 1 2 0 2 2 2 0 2 0 0 1 2 1 2 11 2 1 1 1 2 1 2 1 0 1 1 1 1 2 1 0 0 2 1 2 0 2 0 2 2 0 1 0 2 1 0 2 1 0 0 10]
X_test [[4.6 3.4 1.4 0.3][4.6 3.1 1.5 0.2][5.7 2.5 5.  2. ][4.8 3.  1.4 0.1][4.8 3.4 1.9 0.2][7.2 3.  5.8 1.6][5.  3.  1.6 0.2][6.7 2.5 5.8 1.8][6.4 2.8 5.6 2.1][4.8 3.  1.4 0.3][5.3 3.7 1.5 0.2][4.4 3.2 1.3 0.2][5.  3.2 1.2 0.2][5.4 3.9 1.7 0.4][6.  3.4 4.5 1.6][6.5 2.8 4.6 1.5][4.5 2.3 1.3 0.3][5.7 2.9 4.2 1.3][6.7 3.3 5.7 2.5][5.5 2.5 4.  1.3][6.7 3.  5.  1.7][6.4 2.9 4.3 1.3][6.4 3.2 5.3 2.3][5.6 2.7 4.2 1.3][6.3 2.3 4.4 1.3][4.7 3.2 1.6 0.2][4.7 3.2 1.3 0.2][6.1 3.  4.9 1.8][5.1 3.8 1.9 0.4][7.2 3.2 6.  1.8][6.2 2.8 4.8 1.8][5.1 3.3 1.7 0.5][5.6 2.9 3.6 1.3][7.7 3.8 6.7 2.2][5.4 3.  4.5 1.5][5.8 4.  1.2 0.2][6.4 2.8 5.6 2.2][6.1 3.  4.6 1.4]]
y_test [0 0 2 0 0 2 0 2 2 0 0 0 0 0 1 1 0 1 2 1 1 1 2 1 1 0 0 2 0 2 2 0 1 2 1 0 21]
X_train shape: (112, 4)
X_test shape: (38, 4)
3.使用散点矩阵查看数据特征关系

        在数据分析中,同时观察一组变量的散点图是很有意义的,这也被称为散点图矩阵(scatter plot matrix)。创建这样的图表工作量巨大,可以使用scatter_matrix函数。scatter_matrix函数是Pandas提供了一个能从DataFrame创建散点图矩阵的函数。

【例】对鸢尾花数据结果,使用scatter_matrix显示训练集与测试集的散点图矩阵。

#【例5.3】使用scatter_matrix显示训练集与测试集。
import pandas as pd
iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
# 创建一个scatter matrix,颜色值来自y_train
pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=.8)
运行结果:

4.建立KNN模型

        在Python中,实现KNN方法使用的是KNeighborsClassifier类,KNeighborsClassifier类属于Scikit-learn的neighbors包。

核心操作包括以下三步:

  1. 创建KNeighborsClassifier对象,并进行初始化
  2. 调用fit()方法,对数据集进行训练
  3. 调用predict()函数,对测试集进行预测

使用KNN对鸢尾花iris数据集进行分类的完整代码如下:

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
#导入鸢尾花数据并查看数据特征
iris = datasets.load_iris()
print('数据集结构:',iris.data.shape)
# 获取属性
iris_X = iris.data
# 获取类别
iris_y = iris.target
# 划分成测试集和训练集
iris_train_X,iris_test_X,iris_train_y,iris_test_y=train_test_split(iris_X,iris_y,test_size=0.2, random_state=0)
#分类器初始化
knn = KNeighborsClassifier()
#对训练集进行训练
knn.fit(iris_train_X, iris_train_y)
#对测试集数据的鸢尾花类型进行预测
predict_result = knn.predict(iris_test_X)
print('测试集大小:',iris_test_X.shape)
print('真实结果:',iris_test_y)
print('预测结果:',predict_result)
#显示预测精确率
print('预测精确率:',knn.score(iris_test_X, iris_test_y))

运行结果:

数据集结构: (150, 4)
测试集大小: (30, 4)
真实结果: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 1 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0]
预测结果: [2 1 0 2 0 2 0 1 1 1 2 1 1 1 2 0 1 1 0 0 2 1 0 0 2 0 0 1 1 0]
预测精确率: 0.9666666666666667

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/436357.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊 C#中有趣的 SourceGenerator生成器

一&#xff1a;背景 1. 讲故事 前些天在看 AOT的时候关注了下 源生成器&#xff0c;挺有意思的一个东西&#xff0c;今天写一篇文章简单的分享下。 二&#xff1a;源生成器探究之旅 1. 源生成器是什么 简单来说&#xff0c;源生成器是Roslyn编译器给程序员开的一道口子&am…

【架构】NewSQL

文章目录 NewSQLTiDBTiDB 主要组件特点使用场景安装与部署 推荐阅读 NewSQL NewSQL是一种数据库管理系统(DBMS)的类别&#xff0c;它结合了NoSQL数据库的可扩展性和传统SQL数据库的事务一致性。具体来说&#xff0c;NewSQL数据库旨在解决传统关系型数据库在处理大规模并发事务…

我是如何将 Java 基础 docker 镜像大小从 674Mb 优化到 58Mb的

我是如何将 Java 基础 docker 镜像大小从 674Mb 优化到 58Mb的 如果您是 Java 开发人员&#xff0c;并且正在使用 Docker 打包应用程序&#xff0c;您可能已经注意到&#xff0c;即使是“hello world”类型的项目&#xff0c;最终镜像的大小也可能非常大。在本文中&#xff0c…

D18【python接口自动化学习】-python基础之内置数据类型

day18 综合练习&#xff1a;实现手机通讯录&#xff08;下&#xff09; 学习日期&#xff1a;20240925 学习目标&#xff1a;内置数据类型--27 小试牛刀&#xff1a;如何使用类型转换实现手机通讯录&#xff08;下&#xff09; 学习笔记&#xff1a; 实现手机通讯录 案例文…

【C语言】字符和字符串函数(2)

文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr的使用和模拟实现五、strtok函数的使用六、strerr函数的使用 一、strncpy函数的使用 我们之前学习的strcpy的作用是把源字符串拷贝到目标空间内&#xff0c;而且经过我们的模拟实现&#x…

【Linux:线程概念】

目录 概念&#xff1a; 创建线程的函数&#xff1a;​编辑 ​编辑 有多进程为什么还需要有多线程&#xff1f; 线程调度的成本为什么低&#xff1f; 进程与线程的区别&#xff1a; 概念&#xff1a; 线程是CPU的基本调度单位&#xff0c;在进程内部运行。在内核中&#xff…

数据库系统

数据库管理系统 DBMS Database Management System分为三类&#xff1a; 关系数据库系统&#xff08;Relation Database System&#xff09; 面向对象数据库系统 (Object-Oriented Database System) 对象关系数据库系统 (Object-Oriented Relation Database System) 数据库设…

Stable Diffusion绘画 | SDXL模型使用注意事项

注意事项 SDXL模型的使用&#xff0c;对电脑配置要求更高&#xff0c;需要 8GB 以上显存的显卡SDXL模型兼容性不太好&#xff0c;容易出现错误&#xff0c;对 Mac 电脑不友好只能选择 SDXL模型 训练的 LoRA 使用不能使用旧的 VAE文件 SDXL 专用 VAE 文件&#xff1a;sdxl_vae.…

在矩池云使用 Llama-3.2-11B-Vision 详细指南

Llama 3.2-Vision是Meta开发的一系列多模态大型语言模型&#xff08;LLMs&#xff09;&#xff0c;包含11B和90B两种规模的预训练和指令调整模型。 这些模型专门优化用于视觉识别、图像推理、字幕生成和回答有关图像的一般问题。Llama 3.2-Vision模型在常见行业基准测试中的表…

【网络安全】内部应用中的多重漏洞利用

未经许可,不得转载。 文章目录 初步发现:帐户枚举利用帐户枚举发现 IDOR 导致帐户接管拦截请求洪水攻击:注册拒绝服务目标网站:https://redacted.com 初步发现:帐户枚举 在最近的一次渗透测试中,我对一个仅供员工使用的内部应用程序进行了评估,重点关注身份验证和帐户…

HR告诉你:HCIE证书到底是职场神话还是锦上添花?真相大解析

在职场内卷的赛道上&#xff0c;每个人都在寻找能让自己脱颖而出的光环。而HCIE证书&#xff0c;作为IT领域的一项高含金量认证&#xff0c;莫过于优势最高最让人垂涎的光环&#xff0c;许多人相信它能开启通往理想职位的大门。 但在这个快速变化的时代&#xff0c;HCIE证书真的…

基于Hive和Hadoop的电商消费分析系统

本项目是一个基于大数据技术的电商消费分析系统&#xff0c;旨在为用户提供全面的电商消费信息和深入的消费行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 S…

望繁信科技CTO李进峰受邀在上海外国语大学开展流程挖掘专题讲座

2023年&#xff0c;望繁信科技联合创始人兼CTO李进峰博士受邀在上海外国语大学国际工商管理学院&#xff08;以下简称“上外管院”&#xff09;开展专题讲座&#xff0c;畅谈流程挖掘的发展及对企业数字化转型的价值。演讲吸引了上外教授和来自各行各业的领军企业学员百余人。 …

easyExcel使用模版填充excel,合并单元格

一、最终效果 二、制作模版 1、制作填充模版 模版在代码中保存的位置 2、Controller /*** 下载模板*/ RequestMapping(value "exportData") public void exportData(KqKqb kqKqb,HttpServletResponse response, HttpServletRequest request) throws IOExceptio…

高级算法设计与分析 学习笔记10 平摊分析

动态表&#xff0c;可以变长。 一溢出就另起一个两倍大小的表。 可以轻易证明把n个数字放进去的时间复杂度是O(n)&#xff0c;n n/2 n/4……也就2n&#xff0c;插入数字本身也就是n&#xff0c;加起来最多不超过3n. 这种复杂度究竟是怎么算的&#xff1f;毕竟每次插入复杂度…

Vulhub zico 2靶机详解

项目地址 https://download.vulnhub.com/zico/zico2.ova实验过程 将下载好的靶机导入到VMware中&#xff0c;设置网络模式为NAT模式&#xff0c;然后开启靶机虚拟机 使用nmap进行主机发现&#xff0c;获取靶机IP地址 nmap 192.168.47.1-254根据对比可知Zico 2的一个ip地址为…

阿里云ACP认证考试题库

最近有好些同学&#xff0c;考完阿里云ACP了&#xff0c;再来跟我反馈&#xff1a;自己花700买的阿里云ACP题库&#xff0c;结果答案是错的&#xff01; 或者考完后发现&#xff0c;买的阿里云ACP题库覆盖率只有50%&#xff01; 为避免大家继续踩坑&#xff0c;给大家分享一个阿…

短视频去水印解析api接口使用文档

短视频去水印解析api接口&#xff0c;支持各大平台短视频和图集。 请求示例&#xff1a;https://www.dspqsy.vip/spapi?key密钥&url短视频链接 返回数据格式&#xff1a;JSON 请求方式&#xff1a;GET/POST 请求参数&#xff1a;url (短视频分享的URL) PHP 源码&…

从存储到人工智能洞察: 利用 MinIO 和 Polars 简化数据管道

将 MinIO 的高性能、可扩展企业对象存储的强大功能与 Polars&#xff08;闪电般快速的 DataFrame 库&#xff09;的快速内存数据处理功能相结合&#xff0c;可以显著提高数据管道的性能。在 AI 工作流中尤其如此&#xff0c;其中预处理大型数据集和执行特征选择是关键步骤。在这…

Linux操作系统中dubbo

1、简介 dubbo框架是做微服务通信的&#xff0c;是由阿里巴巴开发&#xff0c;后捐赠给阿帕奇基金会。 2、与OpenFeign的区别 dubbo是采用RPC协议实现微服务通信&#xff0c;OpenFeign是采用Http请求的方式实现的。 OpenFeign 最简单的&#xff0c;就是Spring公司开发的&am…