Python28-4 KNN近邻算法

图片

KNN(K-Nearest Neighbors)算法是一种常用的机器学习算法,主要用于分类和回归问题。

1. KNN算法的基本概念

KNN算法是一种基于实例的学习算法,也称为惰性学习(Lazy Learning)算法,因为它在训练阶段并不进行显式的模型训练,而是将所有的训练数据存储起来,直到需要进行预测时才进行计算。KNN的基本思想是:如果一个样本在特征空间中的k个最相似(即特征空间距离最小)的样本中的多数属于某一个类别,则该样本也属于这个类别。

2. KNN算法的工作原理

KNN算法的工作原理可以分为以下几个步骤:

  1. 选择参数k:选择一个正整数k,表示在进行预测时需要考虑的最近邻居的数量。

  2. 计算距离:使用距离度量方法(如欧氏距离、曼哈顿距离等)计算待分类样本与训练集中所有样本之间的距离。

  3. 找到k个最近邻居:根据计算的距离从小到大排序,选取前k个距离最近的样本。

  4. 投票或平均

    • 分类问题:对k个最近邻居的类别进行投票,选择票数最多的类别作为预测类别。

    • 回归问题:对k个最近邻居的值进行平均,作为预测值。

3. 距离度量方法

常用的距离度量方法有:

  • 欧氏距离(Euclidean Distance):适用于连续变量。计算公式为:

  • 曼哈顿距离(Manhattan Distance):适用于高维空间。计算公式为:

  • 明氏距离(Minkowski Distance):欧氏距离和曼哈顿距离的泛化形式。计算公式为:

  • 其中,当p=2时为欧氏距离,当p=1时为曼哈顿距离。

4. KNN算法的优缺点

优点

  • 简单易懂,易于实现。

  • 无需显式训练,适用于在线学习。

缺点

  • 计算复杂度高,存储开销大,特别是在大规模数据集上。

  • 对于高维数据,距离度量可能失效(即“维度灾难”问题)。

  • 受噪声数据和不相关特征的影响较大,需要数据标准化。

5. KNN算法的改进

为了提升KNN算法的性能,常用的改进方法包括:

  • 数据标准化:在计算距离前对数据进行标准化处理,使得每个特征对距离的影响相等。

  • 权重KNN:给不同的邻居分配不同的权重,距离越近的邻居权重越大。

  • 快速近邻搜索:利用KD树、球树等数据结构加速最近邻搜索。

6. 应用领域

KNN算法广泛应用于各种领域,包括:

  • 文本分类:如垃圾邮件检测、文档分类。

  • 图像识别:如手写数字识别、人脸识别。

  • 推荐系统:如用户兴趣预测、商品推荐。

7. KNN的python实现

以下是一个使用Python的scikit-learn库实现KNN分类的示例:

import matplotlib.pyplot as plt  # 导入Matplotlib库,用于数据可视化
from sklearn.datasets import make_moons  # 从scikit-learn库导入make_moons数据集生成函数
from sklearn.model_selection import train_test_split  # 从scikit-learn库导入数据集拆分函数
from sklearn.neighbors import KNeighborsClassifier  # 从scikit-learn库导入KNN分类器
from sklearn.metrics import accuracy_score, ConfusionMatrixDisplay  # 从scikit-learn库导入计算准确率和显示混淆矩阵的函数

# 生成数据集
X, y = make_moons(n_samples=300, noise=0.3, random_state=42)  # 生成一个包含300个样本的make_moons数据集,添加噪声0.3,随机种子42

# 数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  # 将数据集拆分为训练集和测试集,测试集占30%,随机种子设为42

# 创建KNN分类器,选择K=5
knn = KNeighborsClassifier(n_neighbors=5)  # 实例化一个KNN分类器对象,K值设为5

# 训练模型
knn.fit(X_train, y_train)  # 使用训练集数据训练KNN模型

# 进行预测
y_pred = knn.predict(X_test)  # 使用训练好的模型对测试集进行预测

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)  # 计算预测结果的准确率
print(f"Accuracy: {accuracy:.2f}")  # 输出准确率,保留两位小数

# 混淆矩阵可视化
disp = ConfusionMatrixDisplay.from_estimator(knn, X_test, y_test, display_labels=["Class 0", "Class 1"], cmap=plt.cm.Blues)
# 创建混淆矩阵显示对象,并使用测试集的预测结果和真实结果,设置类别标签为“Class 0”和“Class 1”,颜色图为蓝色渐变
plt.title("Confusion Matrix")  # 设置图表标题
plt.show()  # 显示混淆矩阵图表

# 绘制特征空间中的决策边界
def plot_decision_boundaries(X, y, model, title="Decision Boundaries"):
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1  # 计算第一个特征的取值范围,并扩展边界
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1  # 计算第二个特征的取值范围,并扩展边界
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))  # 创建网格坐标,步长为0.1
    
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])  # 对网格上的每个点进行预测
    Z = Z.reshape(xx.shape)  # 将预测结果的形状重塑为与网格相同
    
    plt.contourf(xx, yy, Z, alpha=0.3)  # 绘制决策边界,用颜色表示不同的类别区域,alpha设置透明度
    plt.scatter(X[:, 0], X[:, 1], c=y, s=30, edgecolor='k')  # 绘制样本点,c=y表示点的颜色由标签决定,s=30设置点的大小,edgecolor='k'设置点的边缘颜色为黑色
    plt.title(title)  # 设置图表标题
    plt.xlabel('Feature 1')  # 设置x轴标签
    plt.ylabel('Feature 2')  # 设置y轴标签
    plt.show()  # 显示图表

# 使用训练好的模型绘制决策边界
plot_decision_boundaries(X, y, knn, title="KNN Decision Boundaries with K=5")  # 调用函数绘制决策边界,传入数据、标签和模型,设置标题

图片

混淆矩阵是一种特殊的矩阵,用于评估分类模型的性能。它展示了实际类别与预测类别之间的对应关系。混淆矩阵的每一行代表实际类别,每一列代表预测类别。通过混淆矩阵,可以直观地看出模型在哪些类别上表现良好,在哪些类别上存在误差。混淆矩阵还可以用来计算各种性能指标,如准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1分数(F1 Score)。

图片

决策边界图展示了模型如何在不同的特征区域内进行分类,通常用于可视化二分类或多分类问题。通过类别决策图,可以直观地看出模型的决策边界,以及各类别在特征空间中的分布情况。决策边界是不同类别之间的分界线,模型在这条线的两侧做出不同的分类决策。类别决策图可以帮助识别模型在不同特征区域内的分类表现,观察是否存在决策边界过于复杂或过于简单的情况。


以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快递物流仓库管理系统java项目springboot和vue的前后端分离系统java课程设计java毕业设计

文章目录 快递物流仓库管理系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 快递物流仓库管理系统 一、项目演示 快递物流仓库管理系统 二、项目介绍 语言: Java 数据库:MySQL 前…

苹果手机图片识别文字出现日期?这里教你如何调整

一、问题原因分析 首先,我们需要理解为什么会出现这种情况。通常,苹果手机在识别图片中的文字时,会根据图片的内容和上下文来显示相关信息。如果图片中包含明显的日期信息,或者手机的某些设置将图片识别与日期显示相关联&#xf…

MicroBin好用的粘贴板工具

有时候你可能想从一台电脑上粘贴文本到另一台电脑上,或者是你想要分享一张图片或者是一些文件,某些设备上登陆qq和微信有不太方便,那么就可以使用MicroBin,它不但可以实现跨设备复制粘贴的功能,还支持文件上传等功能 …

Games101学习笔记 Lecture 14: Ray Tracing 2 (Acceleration Radiometry)

Lecture 14: Ray Tracing 2 (Acceleration & Radiometry 一、加速光线追踪 AABB1.均匀网格 Uniform Spatial Partitions (Grids)①前处理-构建加速网格②射线与场景相交③网格分辨率④适用情况 2.空间划分KD-Tree①预处理②数据结构③遍历④问题 3.对象划分 & 包围盒层…

表单外链,支持查看方式设置

06/19 主要更新模块概览 外链设置 跳转缩放 打印调整 数据校验 01 表单管理 1.1 【表单外链】-填写外链新增查看方式设置 说明: 原表单填写外链,填写字段权限和查看权限统一字段设置,用户在填写时看到数据与查看数据一致…

Python | 基于支持向量机(SVM)的图像分类案例

支持向量机(SVM)是一种监督机器学习算法,可用于分类和回归任务。在本文中,我们将重点关注使用SVM进行图像分类。 当计算机处理图像时,它将其视为二维像素阵列。数组的大小对应于图像的分辨率,例如&#xf…

常用图片处理操作

静态图片文件转base64 import base64 with open(1.png, rb) as f:source f.read() base64_img base64.b64encode(source)base64转静态图片文件 imgdata base64.b64decode(base64_img)# 将图片保存为文件 with open("new.png", wb) as f:f.write(imgdata)PS:这里…

精密空气加热器负载组

小型便携式 :精密空气加热器(负载组)能够对数据中心热通道/冷通道冷却系统进行全面测试。EAK 是一款 19 英寸机架式设备(10U 高),可轻松安装到各种标准服务器机架中。通过集成可调节的热量水平(…

【计算机毕业设计】061互助学习微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Redis学习——Redisson 分布式锁集成及其简单使用

文章目录 引言1. Redisson概述1.1 Redisson的基本概念1.2 Redisson的主要功能1.3 Redisson的优点 2. 开发环境3. Redisson的安装与配置3.1 添加依赖3.2 配置Redisson 4. 使用Redisson4.1 可重入锁4.1.1 可重入锁的概念4.1.2 可重入锁的实现原理4.1.3 简单使用锁的获取和释放 4.…

无线麦克风哪个品牌音质最好,一篇看懂无线领夹麦克风怎么挑选

在数字化时代背景下,直播和个人视频日志(Vlog)已成为新的文化现象,这些趋势不仅重塑了内容创作,也促进了音频设备市场的繁荣。无线领夹麦克风,以其设计上的轻便和录音上的高效率,成为视频创作者…

手把手带你薅一台云服务器

前两篇,带着大家在自己本地搞了一台 Linux 虚拟机: 【保姆级教程】Windows上安装Linux子系统,搞台虚拟机玩玩【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH VS Code,开发必备 问题来了:本…

nacos漏洞小结

Alibaba Nacos是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理…

51单片机第18步_将TIM0用作13位定时器

本章重点学习将TIM0用作13位定时器。 1、定时器0工作在模式0框图 2、定时器0工作在模式0举例 1、Keil C51中有一些关键字,需要牢记: interrupt 0:指定当前函数为外部中断0; interrupt 1:指定当前函数为定时器0中断…

onInterceptTouchEvent() 与 onTouch() 事件分析

前言 本文主要分析 onTouch() 与 onTouchEvent() 事件的差异 正文 先看布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <com.longzhiye.intercepttouch.MyFrameLayout xmlns:android"http://schemas.android.com/apk/res…

PointNet++论文导读

PointNet论文导读 主要改进网络结构&#xff1a;非均匀采样下的特征学习的鲁棒性利用点特征传播处理数据集分割 论文链接:https://arxiv.org/abs/1612.00593 主要改进 PointNet的基本思想是学习每个点的空间编码&#xff0c;然后将所有单个点的特征聚合成一个全局点云标签&am…

模块化编程(二)

模块的导入 经常有这样一句话&#xff1a;“不要重复造轮子”&#xff0c;知道别人已经造好了轮子&#xff0c;并且轮子也好用&#xff0c;那就直接拿别人的轮子来用&#xff0c;此处的“模块导入”就是“拿别人的轮子过来”。前文提到模块化编程的好处之一就是“代码复用性高…

【6.26更新】Win10 22H2 19045.4598镜像:免费下载!

当前微软已经发布了六月最新的KB5039299更新补丁&#xff0c;用户完成升级后&#xff0c;系统版本号将更新至19045.4598。此次更新解决了任务栏上应用跳转列表失败、可能导致系统无法从休眠状态恢复等多个问题&#xff0c;推荐大家升级。如果您不知道去哪里才能下载到该版本&am…

mac|tableau public 仪表盘使用

对华东地区的利润进行仪表盘可视化 选择下面的功能表的新建仪表盘,把上面的表1表2放入其中 通过下图操作将两个表联合起来&#xff0c;即上图使用筛选器时下面的表随之改变 将上图设置为筛选器&#xff0c;可以通过点击地区查看数据

防护用品穿戴自动监测摄像机

随着技术的不断发展&#xff0c;防护用品穿戴自动监测摄像机作为现代安全监控领域的创新应用&#xff0c;正逐渐成为各类工作场所和特定环境中的重要设备。这种摄像机不仅能够实时记录和监控员工的工作状态和安全情况&#xff0c;还能提供数据支持和预警功能&#xff0c;显著提…