机器学习算法基础--KNN分类算法

news2025/1/11 7:51:20

文章目录

    • 1.KNN算法原理介绍
    • 2.KNN分类决策原则
    • 3.KNN度量距离介绍
      • 3.1.闵可夫斯基距离
      • 3.2.曼哈顿距离
      • 3.3.欧式距离
    • 4.KNN分类算法实现
    • 5.KNN分类算法效果
    • 6.参考文章与致谢

1.KNN算法原理介绍

KNN(K-Nearest Neighbor)工作原理:
在一个存在标签的数据集中,当我们输入一个新的没有标签的样本时候,KNN算法的任务就是将该样本分类,即给定其对应的样本标签。
输入没有标签的数据后,将新数据中的每个特征与样本集中数据对应的特征进行比较,提取出样本集中特征最相似数据(最近邻)的分类标签。
一般来说我们选取的是新样本的最近的k个样本进行"投票"决策,这就是KNN算法中k的意思,
通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类作为新数据的分类。

2.KNN分类决策原则

  KNN算法一般是用多数表决方法,即由输入实例的K个邻近的多数类决定输入实例的类。这种思想也是经验风险最小化的结果。
  训练样本为 ( x i , y i ) (x_{i} ,y_{i}) (xi,yi)。当输入实例为 x,标记为c, N k ( x ) N_{_k}(x) Nk(x)是输入实例x的k近邻训练样本集。我们定义训练误差率是K近邻训练样本标记与输入标记不一致的比例,误差率表示为:
1 k ∑ x i ∈ N k ( x ) I ( y i ≠ c j ) = 1 − 1 k ∑ x i ∈ N k ( x ) I ( y i = c j ) \frac1k\sum_{x_i\in N_{k}(x)}I(y_i\neq c_j)=1-\frac1k\sum_{x_i\in N_{k}(x)}I(y_i=c_j)\quad k1xiNk(x)I(yi=cj)=1k1xiNk(x)I(yi=cj)
  因此,要使误差率最小化即经验风险最小,就要使 1 k ∑ x i ∈ N k ( x ) I ( y i = c j ) \frac{1}{k}\sum_{x_{i}\in N_{k}(x)}I(y_{i}=c_{j}) k1xiNk(x)I(yi=cj)尽可能大,即K近邻的标记值尽可能的与输入标记一致,所以多数表决规则等价于经验风险最小化。

3.KNN度量距离介绍

3.1.闵可夫斯基距离

  闵可夫斯基距离表示如下所示:
D ( x , y ) = ∣ x 1 − y 1 ∣ p + ∣ x 2 − y 2 ∣ p + . . . + ∣ x n − y n ∣ p p = ∑ i = 1 n ∣ x i − y i ∣ p p \begin{aligned} D(x,y)& =\sqrt[p]{\mid x_1-y_1\mid^p+\mid x_2-y_2\mid^p+...+\mid x_n-y_n\mid^p} \\ &=\sqrt[p]{\sum_{i=1}^{n}\mid x_{i}-y_{i}\mid^{p}} \end{aligned} D(x,y)=px1y1p+x2y2p+...+xnynp =pi=1nxiyip

3.2.曼哈顿距离

  曼哈顿距离如下所示:
D ( x , y ) = ∣ x 1 − y 1 ∣ + ∣ x 2 − y 2 ∣ + . . . . + ∣ x n − y n ∣ = ∑ i = 1 n ∣ x i − y i ∣ \begin{aligned} D(x,y)& =\mid x_1-y_1\mid+\mid x_2-y_2\mid+....+\mid x_n-y_n\mid \\ &=\sum_{i=1}^{n}\mid x_{i}-y_{i}\mid \end{aligned} D(x,y)=∣x1y1+x2y2+....+xnyn=i=1nxiyi

3.3.欧式距离

  欧式距离如下所示:
D ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + . . . + ( x n − y n ) 2 = ∑ i = 1 n ( x i − y i ) 2 \begin{aligned} D(x,y)& =\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2} \\ &=\sqrt{\sum_{i=1}^{n}(x_{i}-y_{i})^{2}} \end{aligned} D(x,y)=(x1y1)2+(x2y2)2+...+(xnyn)2 =i=1n(xiyi)2

4.KNN分类算法实现

from matplotlib.colors import ListedColormap
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine

# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

#加载wine数据集
data = load_wine()
X = data.data[:, :2] #取前两列内容作为Alcohol和苹果酸作为样本
y = data.target

#划分数据集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#创建KNN分类器,设置k=6
knn_classifier = KNeighborsClassifier(n_neighbors=10, metric='euclidean')#以欧式距离作为度量距离
knn_classifier.fit(X_train, y_train)

 # 预测测试集
y_pred = knn_classifier.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
Accuracy: 0.8888888888888888

5.KNN分类算法效果

#可视化绘图
h = .02
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, h), np.arange(y_min, y_max, h))

# 获取预测结果
Z = knn_classifier.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 创建颜色地图
cmap_background = ListedColormap(['#FFAAAA', '#AAAAFF', '#AAFFAA'])
cmap_points = ListedColormap(['#FF0000', '#0000FF', '#00FF00'])

# 可视化结果
plt.pcolormesh(xx, yy, Z, cmap=cmap_background)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_points,edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("KNN Classification on Wine Dataset")
plt.xlabel("Alcohol")
plt.ylabel("1Malic acid")
plt.show()

在这里插入图片描述

6.参考文章与致谢

本章内容的完成离不开大佬文章的启发和帮助,在这里列出名单,如果对于内容还有不懂的,可以移步对应的文章进行进一步的理解分析。
1.KNN算法:https://blog.csdn.net/qq_42722197/article/details/123196332?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169665324816800182743993%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169665324816800182743993&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-123196332-null-null.142^v95^chatgptT3_1&utm_term=knn%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187
如果大家这这篇blog中有什么不明白的可以去他的专栏里面看看,内容非常全面,应该能够有比较好的解答。
在文章的最后再次表达由衷的感谢!!

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

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

相关文章

Stable Diffusion 图片换脸插件Roop保姆教程 附错误解决办法和API使用

换脸技术已经不是新鲜事物,但如何实现简单、快速、高效的换脸操作呢?Roop插件正是为解决这一问题而生的。 sd-webui-roop 插件适用于已经本地部署了SD的用户。相较于传统的换脸技术,Roop插件几乎不需要训练,只需一张照片,即可在10秒内完成换脸。 但是要注意到是必须注意…

Docker搭建MySQL8.0主从复制(一主一从)

0. 配置说明 宿主机使用的版本为19045的win10专业版,MySQL使用的是8.0,Docker容器使用Linux。 1. 安装Docker Desktop 略 修改Docker默认安装路径 安装包自己就提供了修改安装路径的功能,CMD中运行: “Docker Desktop Installe…

软件测试面试之问——角色扮演

作为软件测试工程师,在求职面试中经常会被问到这样一个问题:你认为测试工程师在企业中扮演着什么样的角色呢? 某度百科是这样概括的:“软件测试工程师在一家软件企业中担当的是‘质量管理’角色,及时发现软件问题并及…

MySql8.0 + Qt 对数据库操作 - 初窥篇1

一、开发背景 32 位程序连接 64 位的数据库实例 二、开发环境 QtCreator4.8.2 Qt5.12.2 MySql8.0.33 三、实现步骤 1、测试驱动代码 测试结果 int main(int argc, char *argv[]) {QSqlDatabase db QSqlDatabase::addDatabase("QMYSQL");db.setHostName("…

CTF之信息收集

什么是信息收集 信息收集是指通过各种方式获取所需要的信息,以便我们在后续的渗透过程更好的进行。最简单的比如说目标站点的IP、中间件、脚本语言、端口、邮箱等等。我觉得信息收集在我们参透测试的过程当中,是最重要的一环,这一环节没做好…

笔记01:随机过程——随机游动

一、伯努利随机过程 1. n次伯努利实验中(x1)发生的总次数Yn: (二项分布) 2. 伯努利实验中事件第一次发生的时间L1: (几何分布) 3. n次伯努利实验中事件第k次发生的时间Lk: (帕斯卡分…

科技云报道:押注向量数据库,为时过早?

科技云报道原创。 在大模型的高调火热之下,向量数据库也获得了前所未有的关注。 近两个月内,向量数据库迎来融资潮,Qdrant、Chroma、Weaviate先后获得融资,Pinecone宣布1亿美元B轮融资,估值达到7.5亿美元。 东北证券…

小谈设计模式(22)—单例模式

小谈设计模式(22)—单例模式 专栏介绍专栏地址专栏介绍 单例模式点睛所在优缺点分析优点确保只有一个实例全局访问点节省资源线程安全 缺点难以扩展对象的生命周期单一职责原则隐藏依赖关系 Java程序实例实例a分析实例b,更安全分析优化 ——“…

Git 学习笔记 | Git 基本理论

Git 学习笔记 | Git 基本理论 Git 学习笔记 | Git 基本理论Git 工作区域Git 工作流程 Git 学习笔记 | Git 基本理论 Git 工作区域 Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Direc…

【Kubernetes】当K8s出现问题时,我们可以从哪些方面排查出

前言 kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kub…

高级 I/O【Linux】

阅读前导: “高级 I/O”处于知识树中网络和操作系统的最后,因此本文默认读者有计算机网络和操作系统的基础。 1. 什么是 I/O 下面以“流”(stream)和冯诺依曼体系架构的视角来简单回顾一下什么是 I/O: I/O可以理解…

bin-editor-next实现josn序列化

线上链接 BIN-EDITOR-NEXThttps://wangbin3162.gitee.io/bin-editor-next/#/editor gitee地址bin-editor-next: ace-editor 的vue3升级版本https://gitee.com/wangbin3162/bin-editor-next#https://gitee.com/link?targethttps%3A%2F%2Funpkg.com%2Fbin-editor-next%2F 实现…

规则引擎(JVS-rules):从应用到场景的全面解析

JVS-RULES规则引擎是一款可视化的业务规则设计器,它的核心功能在于可集成多种数据源,包括多种类型数据库和API,将数据进行界面可视化的加工处理后,形成策略节点所需要的各种变量,然后通过规则的可视化编排,…

2.3 物理层下面的传输媒体

思维导图: 前言: 2.3 物理层下的传输媒体 --- **传输媒体概述**: 传输媒体,又称传输介质或传输媒介,它是连接发送器与接收器之间的物理路径,扮演着在这两者之间传递数据的角色。 --- **分类**&#x…

李宏毅 2022机器学习 HW3 boss baseline 上分记录

作业数据是所有数据都有标签的版本。 李宏毅 2022机器学习 HW3 boss baseline 上分记录 1. 训练数据增强2. cross validation&ensemble3. test dataset augmentation4. resnet 1. 训练数据增强 结论:训练数据增强、更长时间的训练、dropout都证明很有效果&…

Gooxi全面拥抱AIGC时代,让智慧算力触手可及

8月31日凌晨,百度正式宣布文心一言全面对外开放,打响了国内大模型上线的第一枪,紧接着五家国内大模型相继对外开放。当前AIGC已经成为业内竞相追逐的热点与重构产业生产力的关键,在生物医药、材料分析、自动驾驶、元宇宙等领域已逐…

兼容性测试的定义和目标是什么

兼容性测试是通过在各种操作系统、浏览器、设备等多样化环境下测试软件,以验证其在这些环境中的稳定性和一致性。兼容性测试的目标是确保软件在不同平台上具有一致的功能、性能和用户体验,以满足广大用户的需求。 一、兼容性测试的定义和目标 兼容性测试…

进程间通信-信号概述

一、信号的概念 信号是一种进程间通信的机制,用于在软件层面上对异步事件进行通知。信号通常是由操作系统或其他进程发送给目标进程的一种通知,以指示发生了某种事件或条件。这样的事件可能包括硬件异常、用户输入、定时器到期、子进程状态变化等。 引发…

C# OpenCvSharp 实现迷宫解密

效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms;namespace OpenCvSharp_实现迷宫解密 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e…

Python实现AES算法和国密SM4算法

本文主要介绍使用AES加密算法的Python实现和shell脚本实现、SM4国密算法的Python实现。Python使用pycryptodome实现AES加解密、使用GmSSL实现SM4加解密算法;Shell脚本使用openssl实现AES加解密,详细见下文。 1、Python实现加密和解密 1.1 Python实现AES…