基于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,一经查实,立即删除!

相关文章

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()…

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

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

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.下载安装包…

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系列&…

小目标检测篇 | YOLOv8改进之增加小目标检测层(针对Neck网络为AFPN)

前言:Hello大家好,我是小哥谈。小目标检测是计算机视觉领域中的一个研究方向,旨在从图像或视频中准确地检测和定位尺寸较小的目标物体。相比于常规目标检测任务,小目标检测更具挑战性,因为小目标通常具有低分辨率、低对比度和模糊等特点,容易被背景干扰或遮挡。本篇文章就…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代,视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式,这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式,帮助读者轻松应对不同设备和平台的需…

三端可调正稳压器集成电路D317——输出电压范围是1.2V至37V,负载电流最大为1.5A

D317大电流可调稳压电路 1、 概述: D317是一款三端可调正稳压器集成电路,其输出电压范围是1.2V至37V,负载电流最大为1.5A。它的使用非常简单,仅需两个外接电阻来设置输出电压。此外,它的电压线性度和负载调整率也比标准…

使用Python制作一个批量查询搜索排名的SEO免费工具

搭建背景 最近工作中需要用上 Google SEO(搜索引擎优化),有了解过的朋友们应该都知道SEO必不可少的工作之一就是查询关键词的搜索排名。关键词少的时候可以一个一个去查没什么问题,但是到了后期,一个网站都有几百上千…

浏览器工作原理与实践--渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的

在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可以解决一系列相关的问题,比如能…

获取第三方小程序指定页面的path

获取第三方小程序指定页面的path wx.navigateToMiniProgramappIdpathwx.navigateToMiniProgram 在开发小程序时需要跳转到第三方小程序指定页面时,需通过wx.navigateToMiniProgram方法完成。其中有两个主要参数appId和path,文本以问卷星为例,分享两者获取方法。 appId 在…

使用Python批量实现文件夹下所有Excel文件的第二张表合并

目录 一、前言 二、准备工作 三、实现步骤 遍历文件夹获取所有Excel文件 读取每个Excel文件的第二张表 合并所有表格 主函数 四、案例实践 五、注意事项 六、扩展与改进 七、总结 在数据处理和分析中,经常需要对多个Excel文件进行批量操作,特…

代码随想录阅读笔记-栈与队列【滑动窗口最大值】

题目 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 提示&am…