KNN算法做预测的几个例子

准备工作

# 安装机器学习算法所用到的第三方库
pip install numpy
pip install pandas
pip install scikit-learn
pip install matplotlib

KNN算法

示例一: 鸢尾花数据集分类

  • Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。
  • 数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性(花萼长度,花萼宽度,花瓣长度,花瓣宽度)。
  • 可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于山鸢尾杂色鸢尾维吉尼亚鸢尾3个种类中的哪一类。
# 1.导入必要的库
# numpy 和 pandas:用于数据处理
import numpy as np
import pandas as pd
# train_test_split:用于将数据集拆分为训练集和测试集
from sklearn.model_selection import train_test_split
# StandardScaler:用于标准化特征数据,确保各特征的均值为0,方差为1
from sklearn.preprocessing import StandardScaler
# KNeighborsClassifier:KNN分类器模型
from sklearn.neighbors import KNeighborsClassifier
# accuracy_score:用于评估分类器性能的准确率
from sklearn.metrics import accuracy_score
# 生成一个简单的示例数据集(例如鸢尾花数据集)
from sklearn.datasets import load_iris
# 导入 matplotlib 库的 pyplot 模块,提供简便的绘图接口
import matplotlib.pyplot as plt
# 导入 ListedColormap 类,用于创建基于颜色列表的离散颜色映射
from matplotlib.colors import ListedColormap# 2.加载鸢尾花数据集
iris = load_iris()
# 为了简化可视化,我们只选择了前两个特征(花萼长度和花萼宽度),存储在X中
X = iris.data[:, :2] 
# 标签数组:标签 y 包含这150个样本的类别标签(0、1、2)
y = iris.target# 3.切分数据集为训练集和测试集(70%训练,30%测试)
# 使用train_test_split将数据集分为训练集和测试集,其中70%的数据用于训练,30%的数据用于测试
# random_state=42确保每次运行代码时数据拆分是相同的,这样便于结果的复现
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 特征标准化处理:KNN对特征的尺度非常敏感,因此需要进行标准化,使用StandardScaler对数据进行标准化处理,使每个特征的均值为0,方差为1
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 4.创建KNN分类器,选择邻居数为3
# 我们创建了一个KNeighborsClassifier实例,并指定邻居数(n_neighbors=3)
# KNN的核心是根据测试样本与训练样本的距离来选择最近的K个邻居。这里我们选择3个邻居进行投票决策
knn = KNeighborsClassifier(n_neighbors=3)# 5.训练KNN模型
# 使用knn.fit(X_train, y_train)来训练模型。训练过程是根据训练数据来学习各个数据点之间的距离
knn.fit(X_train, y_train)# 6.预测测试集结果
# 使用knn.predict(X_test)对测试集进行预测,得到预测的类别标签
y_pred = knn.predict(X_test)# 7.计算预测准确率
# 使用accuracy_score(y_test, y_pred)计算模型在测试集上的准确率,并输出结果
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的预测准确率为: {accuracy * 100:.2f}%")# 8.可视化部分
# 8.1 绘制数据点的散点图
# 设置字体配置,支持中文标签
plt.rcParams['font.family'] = ['sans-serif']# 设置字体为无衬线字体
plt.rcParams['font.sans-serif'] = ['SimHei']# 设置字体为 SimHei(黑体)以支持中文显示
plt.rcParams['axes.unicode_minus']=False# 解决负号显示问题,使得负号正常显示
plt.figure(figsize=(12, 6))# 创建一个 12x6 的画布大小# 绘制训练集的散点图
plt.subplot(1, 2, 1)# 1行2列的第一个子图
# 绘制 X_train 中的花萼长度和花萼宽度,并根据标签 y_train 给数据点上色,使用 Paired 颜色映射
# edgecolors='k' 设置点的边缘颜色为黑色,s=30 设置点的大小为30
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.Paired, edgecolors='k', s=30)
plt.title("训练集 - 花萼长度 vs 花萼宽度")# 子图标题
plt.xlabel("花萼长度 (cm)")# x轴标签
plt.ylabel("花萼宽度 (cm)")# y轴标签
# 绘制测试集的散点图
plt.subplot(1, 2, 2)# 1行2列的第二个子图
# 绘制 X_test 中的花萼长度和花萼宽度,并根据预测值 y_pred 给数据点上色,使用 Paired 颜色映射
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap=plt.cm.Paired, edgecolors='k', s=30)
plt.title("测试集 - 花萼长度 vs 花萼宽度")# 子图标题
plt.xlabel("花萼长度 (cm)")# x轴标签
plt.ylabel("花萼宽度 (cm)")# y轴标签
plt.tight_layout()# 自动调整子图的布局,避免标签和标题重叠
plt.show()# 显示图形# 8.2 可视化KNN决策边界
# 这里我们仅用前两个特征来简化可视化
X_train_2d = X_train[:, :2]# 提取训练集的前两个特征(花萼长度和花萼宽度)
X_test_2d = X_test[:, :2]# 提取测试集的前两个特征(花萼长度和花萼宽度)
# 创建KNN模型并训练
knn_2d = KNeighborsClassifier(n_neighbors=3)# 创建 KNN 分类器,设置邻居数量为3
knn_2d.fit(X_train_2d, y_train)# 用训练集的前两个特征进行模型训练
# 创建一个网格来绘制决策边界
x_min, x_max = X_train_2d[:, 0].min() - 1, X_train_2d[:, 0].max() + 1 # x 轴的范围,添加边距
y_min, y_max = X_train_2d[:, 1].min() - 1, X_train_2d[:, 1].max() + 1 # y 轴的范围,添加边距
# 使用 np.meshgrid 创建网格(以 0.1 为步长),覆盖整个特征空间
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
# 使用训练好的 KNN 分类器对网格上的每个点进行预测
Z = knn_2d.predict(np.c_[xx.ravel(), yy.ravel()])# 将 xx 和 yy 网格点合并,然后预测
Z = Z.reshape(xx.shape)# 将预测结果重新 reshape 为网格的形状# 设置绘图字体,支持中文显示
plt.rcParams['font.family'] = ['sans-serif']# 设置字体为无衬线字体
plt.rcParams['font.sans-serif'] = ['SimHei']# 设置字体为 SimHei(黑体)以支持中文显示
plt.rcParams['axes.unicode_minus']=False# 解决负号显示问题,使得负号正常显示
plt.figure(figsize=(12, 6))# 创建一个 12x6 的画布大小# 绘制 KNN 决策边界和测试集的数据点
plt.subplot(1, 2, 1)# 1行2列的第一个子图
# 使用 contourf 绘制决策边界,alpha 设置透明度,cmap 设置颜色映射
plt.contourf(xx, yy, Z, alpha=0.3, cmap=ListedColormap(['red', 'green', 'blue']))
# 绘制测试集数据点,并根据真实标签 y_test 给数据点上色
plt.scatter(X_test_2d[:, 0], X_test_2d[:, 1], c=y_test, edgecolors='k', cmap=ListedColormap(['red', 'green', 'blue']))
plt.title('KNN决策边界 - 测试集')# 子图标题
plt.xlabel('花萼长度 (cm)')# x轴标签
plt.ylabel('花萼宽度 (cm)')# y轴标签
plt.tight_layout()# 自动调整子图的布局,避免标签和标题重叠
plt.show()# 显示图形

示例二:葡萄酒数据集分类

  • load_wine是一个葡萄酒数据集,是一类多重变量分析的数据集。
  • 数据集包含178个数据样本,分为3类,第一类59个样本,第二类71个样本,第三类48个样本,每个样本包含13个化学特征(这些化学特征包括酸度、灰分、酒精浓度等)。
  • 可通过酸度、灰分、酒精浓度等化学特征预测葡萄酒属于琴酒雪莉贝尔莫得3个种类中的哪一类。
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt# 加载 Wine 数据集
wine = load_wine()
X = wine.data[:, :2]  # 只使用前两个特征进行可视化
y = wine.target # wine.target:这是一个包含类别标签的数组,指示每个葡萄酒样本的分类(共有 3 类)。# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 初始化 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=5)# 训练模型
knn.fit(X_train, y_train)# 在测试集上进行预测
y_pred = knn.predict(X_test)# 计算预测准确率
# 使用accuracy_score(y_test, y_pred)计算模型在测试集上的准确率,并输出结果
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的预测准确率为: {accuracy * 100:.2f}%")# 可视化结果
plt.figure(figsize=(8, 6))# 绘制决策边界
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100),np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.Paired)
plt.title('KNN Classification (Wine Dataset)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

示例三:乳腺癌肿瘤数据集分类

  • load_breast_cancer是一个乳腺癌肿瘤数据集,是一类多重变量分析的数据集。
  • 数据集包含569个数据样本,分为2类,第一类357个样本,第二类212个样本,每个样本包含30个属性(这些属性包括肿瘤的半径、纹理、对称性等)。
  • 可通过半径、纹理、对称性等属性预测肿瘤属于良性(B)恶性(M)2个种类中的哪一类。
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt# 加载乳腺癌数据集
cancer = load_breast_cancer()
X = cancer.data[:, :2]  # 只使用前两个特征进行可视化
y = cancer.target # cancer.target:包含 0 和 1 的标签,分别表示良性(B)和恶性(M)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 初始化 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=5)# 训练模型
knn.fit(X_train, y_train)# 在测试集上进行预测
y_pred = knn.predict(X_test)# 计算预测准确率
# 使用accuracy_score(y_test, y_pred)计算模型在测试集上的准确率,并输出结果
accuracy = accuracy_score(y_test, y_pred)
print(f"模型的预测准确率为: {accuracy * 100:.2f}%")# 可视化结果
plt.figure(figsize=(8, 6))# 绘制决策边界
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100),np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.RdBu)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.RdBu)
plt.title('KNN Classification (Breast Cancer Dataset)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

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

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

相关文章

【论文阅读】处理器芯片敏捷设计方法:问题与挑战

作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…

20. 内置模块

一、random模块 random 模块用来创建随机数的模块。 random.random() # 随机生成一个大于0且小于1之间的小数 random.randint(a, b) # 随机生成一个大于等于a小于等于b的随机整数 random.uniform(a, b) …

嵌入式的软实时和硬实时系统

我觉得嵌入式的软实时和硬实时系统,一定要在应用场景里面去判断。假如你的需求是一个任务的执行时间,必须在2ms内响应,那么你选择的一个系统,系统的设计最晚响应时间是10us,那么这个系统对你来说就是硬实时的。 而且这…

Redis原理—4.核心原理摘要

大纲(9870字) 1.Redis服务器的Socket网络连接建立 2.Redis多路复用监听与文件事件模型 3.基于队列串行化的文件事件处理机制 4.完整的Redis Server网络通信流程 5.Redis串行化单线程模型为什么能高并发 6.Redis内核级请求处理流程与原理 7.Redis通信协议与内核级请求数据…

【UE5】制作插件 并调试【vs2022】

视频教程:好看视频-轻松有收获 https://www.youtube.com/watch?vIjpa9mI2b5I 官方:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/plugins-in-unreal-engine 原文:【UE】制作插件_ue插件-CSDN博客 C制作插件 1. 我们可…

cocos creator 的 widget组件的使用及踩坑

以下的内容基于cocos creator 3.8版本,如有错误,恳请指出。 👉官方文档的指引 应用:以上官方指引有非常清晰的使用方式,接下来说明一些注意事项: 1、与canvas搭配的使用,解决多分别率适配问题。…

十五、K8s计划任务JobCronJob

K8s计划任务CronJob&Job 一、Job可以干什么 Job 控制器用于管理 Pod 对象运行一次性任务,比方说我们对数据库备份,可以直接在 k8s 上启动一个 mysqldump 备份程序,也可以启动一个 pod,这个 pod 专门用来备份用的,备份结束 pod 就可以终止了,不需要重启,而是将 Pod…

关于LinuxWindows双系统在八月更新后出现的问题

问题描述类似于:Verifying shim SBAT data failed: If you are, this is caused by a reported problem in the August update if you can get into Windows, either uninstall the August update, or open Command Prompt as administrator and run this command,…

【Elasticsearch 中间件】Elasticsearch 客户端使用案例

文章目录 一、安装 Elasticsearch1.1 启动 Elasticsearch1.2 启动 Kibana 二、客户端代码2.1 导入依赖2.2 配置 application.yaml2.3 定义实体类2.4 连接 Elasticserach2.5 定义 Service 层接口2.6 实现 Service 层功能 三、测试项目3.1 添加数据3.2 搜索数据3.3 更新数据3.4 删…

一文掌握 OpenGL 几何着色器的使用

学习本文需要具备 OpenGL ES 编程基础,如果看起来比较费劲,可以先看入门文章 OpenGL ES 3.0 从入门到精通系统性学习教程 。 什么是几何着色器 几何着色器(Geometry Shader) OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心…

C++中多态

1) 什么是多态性?C中如何实现多态? 多态性是指通过基类指针或引用调用派生类的函数,实现不同的行为 多态性可以提高代码的灵活性和可扩展性,使程序能够根据不同的对象类型执行不同的操作。 2)C中如何实现多态&#…

PHP语法学习(第十天)—PHP 表单

各位🧍‍♂️ 周一愉快♪٩(ω)و♪ 我是练小杰,今天开启新的篇章——PHP 表单 另外,想要学习更多PHP语法相关内容点击 “PHP专栏”~~~ 今天由我强哥来带领大家学习~~ 文章目录 PHP 表单简介表单的基本结构表单数据操作PHP 中的 $_POST 和 $_…

跟李笑来学美式俚语(Most Common American Idioms): Part 67

Most Common American Idioms: Part 67 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…

卫生巾检测项目、检测标准梳理

为了确保卫生巾在使用过程中具备良好的吸收性、舒适性、透气性,并且符合卫生安全标准,避免对人体健康造成不良影响,需要对其进行一系列检测。 名找我 一、检测项目 外观质量 检查卫生巾的形状、尺寸是否与标识相符,表面是否平整…

windows C#-声明和使用读/写属性

属性提供了公共数据成员的便利性,且不会产生未受保护、不可控制和未经验证地访问对象的数据的风险。 属性声明访问器:从基础数据成员中赋值和检索值的特殊方法。 set 访问器可分配数据成员,get 访问器检索数据成员值。 此示例演示具有两个属…

架构13-持久化存储

零、文章目录 架构13-持久化存储 1、Kubernetes 存储设计 (1)存储设计考量 **设计哲学:**Kubernetes 遵循用户通过资源和声明式 API 描述意图,Kubernetes 根据意图完成具体操作。**复杂性:**描述用户的存储意图本身…

spring重点面试题总结

bean的生命周期 在 Spring 中,BeanDefinition、Bean 实例化、依赖注入、Aware 接口的处理、以及 BeanPostProcessor 的前置和后置处理等,都是 Spring 容器管理 Bean 生命周期的关键部分。下面我将详细解释这些过程。 1. 通过 BeanDefinition 获取 Bean…

【文件操作】写入json文件

一般用json.dump把dict或者list导出到文件 一般用json.dumps把dict或者list导出到字符串 dump是导出的意思,这样看dict和list是自己人,但是string和文件相对于代码就是外人 代码例子 import json import copyfid = open(origin.txt, r) lines = fid.readlines() res_list…

单片机的选择因素

在选择单片机型号时,需要根据具体的应用需求来选择合适的单片机。单片机(Microcontroller Unit, MCU)是一种将计算机的主要部分集成在一个芯片上的微型计算机,它通常包括处理器、存储器、输入/输出接口等。随着技术的发展&#xf…

使用wol-web通过NAS远程唤醒电脑

相信很多人都有远程开机的需求,有时候需要远程控制家中的电脑办公、玩游戏。远程控制比较好实现,安装类似向日葵的软件即可。而远程开机稍微麻烦一点,有的通过物理开关实现(开机棒)我们选择远程网络唤醒的方式实现&…