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.1Z = 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)。

图片

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


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

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

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

相关文章

51单片机第17步_外部中断

本章重点学习外部中断。 1、外部中断0框图: 2、外部中断1框图: 3、Keil C51中有一些关键字,需要牢记: interrupt 0:指定当前函数为外部中断0; interrupt 1:指定当前函数为定时器0中断&#x…

2 z变换与离散时间傅里叶变换

目录 序列的z变换 z变换的定义 常用典型序列的z变换 序列类型与z变换的收敛域 序列的分类 X(z)的极点与收敛域 单边序列 双边序列 z变换的性质 线性 序列移位 单边序列 双边序列 z域尺度变换 序列乘以n 复共轭序列的z变换 初值定理 终值定理 时域卷积定理 …

Spring事务及其传播机制(二)

目录 1.Transcational详解 1.1 rollbackFor 2事务隔离级别 2.1MySQL事务隔离级别回顾 2.2Spring事务隔离级别 3.Spring事务传播机制 3.1什么是事务传播机制 3.2事务的传播机制有哪些 3.3 Spring 事务传播机制使用和各种场景演示 3.3.1 REQUIRED(加入事务) 3.3.2 REQ…

Apache ZooKeeper 简介

介绍 Apache ZooKeeper 是一种分布式协调服务,旨在管理和同步大量分布式应用程序。ZooKeeper 是 Apache 软件基金会下的一个开源项目,它解决了维护分布式应用程序的配置信息、命名、分布式同步和组服务的复杂性。本文探讨了 ZooKeeper 的架构、功能、应…

商标字体的选择:企业和个人申请注册商标攻略!

对于汉字商标,就会涉及到字体的选择,普推商标老杨也经常看到企业因为文字商标字体侵权收到相关字体公司的律师函,所以商标字体选择上要特别注意。 建议选择可以商用的免费字体,常见的有黑体、宋体等,如果这些字体前面…

基于matlab的可乐标签模板匹配

1 建模思路 1.图像预处理: 如果目标图像和模板图像是彩色的(即RGB图像),则将它们转换为灰度图像,以便在单通道上进行匹配。使用rgb2gray函数进行灰度化。 2.获取模板大小: 使用size函数获取模板图像的高…

2000-2022年上市公司数字化转型与绿色创新质量匹配数据(含控制变量)

2000-2022年上市公司数字化转型与绿色创新质量匹配数据(含控制变量)https://download.csdn.net/download/a519573917/89501000 目录 上市公司数字化转型与绿色创新质量匹配的实证研究 一、引言 二、文献综述 三、实证模型 四、数据来源与描述性统计 …

tomcat8.5在windows下运行出现日志中文乱码

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

Linux 2-Vim使用

1 什么是vi及vim&#xff1f; vi是文本编辑器&#xff1b;vim是程序开发工具。 2 vi的几种模式 1 一般模式&#xff1a;vi <fileName> 就进入命令模式&#xff0c;可以删除或者复制粘贴 2 编辑模式&#xff1a;修改内容 3 命令行模式&#xff1a;最下面一行&#xf…

NetSuite Amount正负符号在Saved Search和DataSet中的不同含义

近期在一个项目中碰到Amount取值的Bug&#xff0c;原因是我们的代码中数据源从Saved Search转为了DataSet&#xff0c;由于这个转换导致了Amount的正负值混乱。今天记录一下。 正负号原则 • Saved Search&#xff0c; Amount的正负需要考虑科目类型。 Amount字段根据科目类型…

昇思25天学习打卡营第10天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成自己的个性化音乐 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型&#xff08;LM&#xff09;的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本&#xff0c;相关研究成果参考论文《Simple and Controllable …

远程过程调用PRC

简介 远程过程调用&#xff08;Remote Procedure Call, RPC)&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间的子程序&#xff0c;且不需要考虑交互作用的细节。 RPC是一种服务器&#xff0c;客户端模式&#xff0c;是一个通过发送请…

【效率提升】新一代效率工具平台utools

下载地址&#xff1a;utools uTools这款软件&#xff0c;是一款功能强大且高度可定制的效率神器&#xff0c;使用快捷键alt space(空格) 随时调用&#xff0c;支持调用系统应用、用户安装应用和市场插件等。 utools可以调用系统设置和内置应用&#xff0c;这样可以方便快捷的…

KV260视觉AI套件--PYNQ-DPU

目录 1. 简介 2. DPU 原理介绍 2.1 基本原理 2.2 增强型用法 3. DPU 开发流程 3.1 添加 DPU IP 3.2 在 BD 中调用 3.3 配置 DPU 参数 3.4 DPU 与 Zynq MPSoC互联 3.5 分配地址 3.6 生成 Bitstream 3.7 生成 BOOT.BIN 4. 总结 1. 简介 在《Vitis AI 环境搭建 &…

深入理解TCP协议格式(WireShark分析)

传输控制协议&#xff08;TCP&#xff09;是互联网中最为关键的通信协议之一。了解TCP协议的细节不仅对于网络工程师至关重要&#xff0c;对于任何涉及网络通信的软件开发人员而言都是必备的知识。本文旨在深入探讨TCP协议&#xff0c;从协议的基本概述到其工作机制&#xff0c…

【sqlite3】联系人管理系统

SQLite3实现简单的联系人管理系统 有关sqlite3的基础知识请点击&#xff1a;SQLite3的使用 效果展示&#xff1a; 创建一个名为contacts.db的数据库 首先&#xff0c;我们需要创建一个名为contacts.db的数据库&#xff0c;并建立一个名为"contact"的表&#xff0…

一篇文章理解堆栈溢出

一篇文章理解堆栈溢出 引言栈溢出ret2text答案 ret2shellcode答案 ret2syscall答案 栈迁移答案 堆溢出 unlink - UAF堆结构小提示 向前合并/向后合并堆溢出题答案 引言 让新手快速理解堆栈溢出&#xff0c;尽可能写的简单一些。 栈溢出 代码执行到进入函数之前都会记录返回地…

Android 10.0 关于定制自适应AdaptiveIconDrawable类型的动态日历图标的功能实现系列一

1.前言 在10.0的系统rom定制化开发中,在关于定制动态时钟图标中,原系统是不支持动态日历图标的功能,所以就需要从新 定制动态时钟图标关于自适应AdaptiveIconDrawable类型的样式,就是可以支持当改变系统图标样式变化时,动态日历 图标的背景图形也跟着改变,所以接下来就来…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学&#xff0c;是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216&#xff0c;论文提出了一种新的embedding模型&#xff0c;称为M3-Embedding&#xff0c;它在多语言性&#xff08;Multi-Linguality&#xff09;、多功能…

19 解决问题的策略

众所周知&#xff0c;每个学期都会有一个单元“解决问题的策略”。而在此文章&#xff0c;我们会把小学阶段所有策略都进行一一讲解。 每个年级的两个学期中的策略&#xff0c;其实有异曲同工之处。 三年级&#xff1a;从条件和问题出发解决问题四年级&#xff1a;用图表整理…