基于K-近邻的PLOSAR图像分类

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

K-近邻(KNN)是一种简单但有效的机器学习算法,可用于图像分类。POLSAR(极化合成孔径雷达)是一种雷达成像技术,提供了极化信息,适用于地物分类和识别。将KNN应用于POLSAR图像分类具有简单易实现、多类别适用、无需假设数据分布、基于邻近性进行分类、对噪声鲁棒以及可用于增量学习等优点,本文为基于K-近邻实现PLOSAR图像分类的一个小实例。


文章目录

  • 前言
  • 一、数据预处理
  • 二、基于K-近邻的PLOSAR图像分类
    • 1. KNN简介
    • 2. 分类实验


一、数据预处理

对于提供的原始数据ALLData.mat和标签数据label.mat来说,标签数据是包含背景0的,所以,在分类之前,我们首先需要将对应label为0的对于提供的原始数据删除。将原始数据ALLData.mat和标签数据label.mat读取并查看维度信息如下所示:

#读取mat数据
data_orginal = io.loadmat(r"D:/VSCode/Task_python/lab/homework/Image classification/PolSAR/ALLData.mat")["ALLData"]
label_original = io.loadmat(r"D:/VSCode/Task_python/lab/homework/Image classification/PolSAR/label.mat")["label"]
label = np.reshape(label_original, data_orginal.shape[0], order='F')print("ALLData shape=",data_orginal.shape)
print("label shape=",label.shape)

输出为:

ALLData shape= (768000, 9)
label shape= (768000,)

可以看到ALLData和label共有768000条数据,其中ALLData的每一条数据是一个1*9的向量,label为一个数,为了后续清零操作的便利,我们将这两个数据拼接在一起,即使用:

data_o=torch.cat([torch.tensor(data_orginal),

torch.tensor(label).reshape(768000,1)],-1).numpy(),

这样我们便得到了一个768000*10的序列。

下面进行清零操作,首先,我们定义一个data数据,将第一个label不为0的数据赋值给data,之后遍历读取的原始拼接在一起的数据data_o,如果data_o[i][9]不等于0,我们就将data_o[i]拼接到data中,最后保存data,操作过程如下所示。

#数据清零
data=data_o[111135]
for i in range(111136,768000-1):if data_o[i][9]!=0:data=np.vstack((data,data_o[i]))
np.save('data.npy',data)

清零完成后,我们便得到了一个167712*10的数据,其中前9列是数据,后面一列为标签。

二、基于K-近邻的PLOSAR图像分类

1. KNN简介

K最近邻(KNN)算法是一种基本的机器学习算法,常用于分类和回归任务。它的工作原理非常简单直观:对于一个新的未知样本,根据其在特征空间中与已知样本的距离,找出距离最近的K个邻居,然后根据这K个邻居的标签来预测未知样本的标签。

在这里插入图片描述

KNN算法的基本步骤如下:

  • 选择K值:首先选择一个合适的K值,它表示在预测时要考虑多少个最近邻居的标签。K值的选择可能会影响算法的性能。

  • 计算距离:对于待预测的样本,计算它与所有已知样本之间的距离。通常使用的距离度量包括欧式距离曼哈顿距离闵可夫斯基距离等。

  • 找出K个最近邻:根据计算得到的距离,找出与待预测样本最近的K个已知样本。

  • 投票决策:对于分类任务,根据这K个最近邻的标签,采用投票的方式来确定待预测样本的标签。一般来说,可以选择多数票决定样本的分类标签。

  • 回归预测:对于回归任务,根据这K个最近邻的标签,可以采用平均值或加权平均值来预测待预测样本的输出。

2. 分类实验

首先,我们将之前处理得到的data数据读入,然后按列分成1677129的数据和1677121的标签。其过程如下代码所示:

#加载清零后的数据
data=np.load("D:\VSCode\Task_pytorch\z_home_work\Image classification\data.npy")
print(data.shape)
#将数据和label分开
[data,label]=np.split(data,[9],axis=1)
print(data.shape)
print(label.shape)

然后定义一个KNN分类器,这里我们直接使用sklearn来实现,然后我们的实验分别测试了当训练数据集比例为[0.1,0.3,0.5]时的准确率,同时测试了k值为[10,20,30,40,50]的准确率,共九组实验,其中实验过程代码如下图4所示,实验数据如下表所示。从实验结果中我们可以看到,使用KNN分类器的分类效果比较好,基本达到了85%-87%的准确率,同时,我们可以看到,对于不同的训练数据集比例来说,较大的数据集更加能学习到更好的分类特征。对于不同的K值来说,我们可以看到无论过大或是过小都会对模型的准确度产生影响,所以K的取值往往需要一个合适的区间或值,另一方面,K的取值可以看到对最后的结果影响不大,即KNN分类器受K值的影响波动较小较稳定。

acc=[]
k=[10,20,30,40,50]
train_size=[0.1,0.3,0.5]
for i in range(5):print("K=",k[i],"时:")for j in range(3):#划分训练集和测试集X_train,X_test,y_train,y_test = train_test_split(data, label, train_size=train_size[j], stratify=label)knn = KNeighborsClassifier(n_neighbors=k[i]) knn.fit(X_train, y_train.reshape((-1, 1)).ravel())y_predict = knn.predict(X_test) acc.append(accuracy_score(y_test, y_predict))print("train_size=",train_size[j], "的分类准确率为: ", acc[i*3+j])

训练结果:

  • K= 10 时:
    train_size= 0.1 的分类准确率为: 0.8641323431009468
    train_size= 0.3 的分类准确率为: 0.8803056244090666
    train_size= 0.5 的分类准确率为: 0.8870444571646632
  • K= 20 时:
    train_size= 0.1 的分类准确率为: 0.8637812125267489
    train_size= 0.3 的分类准确率为: 0.8780398470174363
    train_size= 0.5 的分类准确率为: 0.8832999427590155
  • K= 30 时:
    train_size= 0.1 的分类准确率为: 0.8615154265573965
    train_size= 0.3 的分类准确率为: 0.8762681113127029
    train_size= 0.5 的分类准确率为: 0.8826440564777714
  • K= 40 时:
    train_size= 0.1 的分类准确率为: 0.8586202555965576
    train_size= 0.3 的分类准确率为: 0.874624145009753
    train_size= 0.5 的分类准确率为: 0.8810341537874451
  • K= 50 时:
    train_size= 0.1 的分类准确率为: 0.8551553255907938
    train_size= 0.3 的分类准确率为: 0.8714980536461129
    train_size= 0.5 的分类准确率为: 0.8786848883800802
train_size=0.1train_size=0.3train_size=0.5
K=100.86413234310094680.8803056244090666
K=200.86378121252674890.8780398470174363
K=300.86151542655739650.8762681113127029
K=400.85862025559655760.874624145009753
K=500.85515532559079380.8714980536461129

最后,我们使用训练好的模型将原始数据读入,并将分类的结果绘制成图片的形式,其结果如下图所示。
在这里插入图片描述
结合SVM的实验结果从整体上两个分类器所表现的行性能来看,KNN相对来说更加稳定一些,在KNN实验中,无论K的取值如何,它的最终结果总是保持在85-87%之间,但是反观SVM来说,它受kernel函数取值的影响太多,例如,在kernel函数为rbf时,其最高准确率可以达到87%。但是在kernel函数为linear时,最高准确率仅仅只有达到22%。总的来说,SVM分类器受到kernel函数很大程度上的影响。


文中有不对的地方欢迎指正、补充。

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

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

相关文章

nginx编译安装详细说明(CentOS)

前言 在 CentOS 7 上编译安装 Nginx 1.24.0 ,您可以按照以下步骤进行操作。 一、编译前准备 1.1、在开始编译之前,确保您的系统已安装必要的编译工具和依赖项。在 CentOS 7 上,您可以使用以下命令安装这些工具: [roottd66 loc…

mybatis实践篇(二)

自定义类型处理器(TypeHandler) 实体 package com.wyl.mybatis.entity;import java.util.Date;/*** Description 省市区-字典* Author wuyilong* Date 2024-02-26*/public class FullCity {private static final long serialVersionUID 1L;/*** 主键I…

第十三届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 裁纸刀试题 B: 寻找整数试题 C : \mathrm{C}: C: 求和试题 D: GCD试题 E: 蜂巢试题 F : \mathrm{F}: F: 全排列的价值试题 G: 青蛙过河试题 H \mathrm{H} H : 因数平方和试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh 🍳食用🥙子物体独立生成CubeMesh🥪合并成一个CubeMesh🌭Demo 🍳食用 下载并导入插件👈即可在代码中调用。 🥙子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

我的Linux命令学习之旅

探索Linux操作系统的世界,就像开启了一段全新的旅程。这个系统以其无与伦比的功能和灵活性著称,在服务器和开发领域发挥着不可或缺的作用。通过亲身实践,我逐渐掌握了一些基础而强大的Linux命令,这些命令成为了我日常工作中不可或…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11,发现了一个小麻烦事,如下图: 当我想使用svn或git的时候必须要多点一下,这忍不了,无形之中加大了工作量! 于是,菜单全显示教程如下: 第一步:管…

vue2在调用子组件方法时,出现undefined如何解决

当父组件调用子组件queryAsnPreDeliverSku()方法时 代码报错 “Uncaught (in promise) TypeError: Cannot read properties of undefined (reading queryAsnPreDeliverSku)” 1、原因 在调用子组件queryAsnPreDeliverSku()方法时,this.$refs.preSkuInfoRef 是 unde…

微信小程序前后端如何交互

微信小程序的前后端交互主要依赖于微信提供的API来实现,其中最核心的就是使用wx.request进行网络请求。前端(小程序端)通过发送HTTP请求与后端(服务器端)进行数据交换,实现动态数据的获取、提交和更新等操作…

C#宿舍信息管理系统

简介 功能 1.发布公告 2.地理信息与天气信息的弹窗 3.学生信息的增删改查 4.宿舍信息的增删改查 5.管理员信息的增删改查 6.学生对宿舍物品的报修与核实 7.学生提交请假与销假 8.管理员对保修的审批 9.管理员对请假的审批 技术 1.采用C#\Winform开发的C\S系统 2.采用MD5对数据…

Centos7安装Python3.8

1.安装编译相关工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install libffi-devel -y2.下载安装包…

Microsoft Visio 快捷键 (keyboard shortcut - hotkey)

Microsoft Visio 快捷键 [keyboard shortcut - hotkey] References 移动所选形状 ← / ↑ / → / ↓ 微移所选形状 Shift ← / ↑ / → / ↓ 移动画布 Ctrl ← / ↑ / → / ↓ ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

数仓,大数据平台,数据中台,数据湖

数据湖的概念分为侠义和广义的两种,侠义的数据湖指的是数据湖存储指可以存放各种格式的海量数据的地方,而广义的数据湖除了数据存储之外还包含数据的管理和分析提供数据目录、数据服务、以及统一的数据访问方式;这个一般完善的数据处理系统都…

Rancher(v2.6.3)——安装Rancher

[详细安装说明请查看Rancher安装说明文档]:https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#1%E5%AE%89%E8%A3%85rancher Rancher部署Mysql(单机版):http…

从零开始一步一步掌握大语言模型---(1-写在最开始)

一、为什么要开始这个系列? 从23年开始接触Chatpgt以来,被其强大的功能深深的震撼到。它不仅是能写论文,编故事,真的是能深刻影响到我们各行各业的一项新技术。在我们社会即将迎来智能化革命的前期,深刻的理解和掌握这…

GPT模型部署后续:聊天机器人系统的扩展与优化

一、多轮对话支持 为了实现多轮对话支持,我们需要维护用户的会话上下文。这可以通过在服务器端使用一个字典来存储会话状态实现。 目录 一、多轮对话支持 下面是一个简单的扩展例子: 二、性能优化 三、用户界面与交互优化 下面是一个简单的HTML示例&…

一文搞懂 YOLOv9 训练推理全流程 | YOLOv9你绝对不知道的细节!

文章地址:https://arxiv.org/pdf/2402.13616.pdf 代码地址:https://github.com/WongKinYiu/yolov9 前言 在这篇博客中,我们来聊聊 YOLOv9。首先,值得注意的一点是,YOLOv9的变化相对较小,它仍然基于YOLOv5的…

微信小程序button动态跳转到页面

微信小程序中如何动态的跳转到某个页面。 目录 1、首先在js文件中定义事件函数 2、在页面中进行传参调用 3、其它跳转方法简单说明 1、首先在js文件中定义事件函数 goto(e){const urle.currentTarget.dataset.url;wx.navigateTo({url: url})}, 2、在页面中进行传参调用 &l…

【随笔】Git -- 常用命令(四)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

带你学会深度学习之循环神经网络[RNN] - 2

前言 笔者写下此系列文章是希望在复习人工智能相关知识同时为想学此技术的人提供一定帮助。 图源网络,所有者可随时联系笔者删除。 代码不代表全部实现,只是为展示模型的关键结构。 与CNN不同,RNN被设计用来处理序列数据。它通过在网络的…

3GPP 协议资料学习和文档下载

一、登录3GPP官网 3GPP – The Mobile Broadband Standard 二、选择Specifications Per TSG Round 三、选择ftp下载路径 四、选择不同阶段的3GPP协议 包含了从1999年到R18,甚至更新到当前最新的协议。 五、查看对应版本的LTE或者5G NR协议 其中LTE射频相关章节为36.521系列&…