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

news2024/12/26 14:02:00

🎀个人主页: 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.coloradmin.cn/o/1543140.html

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

相关文章

无代码平台开发AI已经被实现了吗?

一、背景 无代码平台AI开发是一种新兴的开发方式,它允许非程序员或低代码开发者通过图形化界面、拖拽组件和预设模版等方式,无需编写传统的程序代码就能创建、训练和部署AI模型。这种方式极大地降低了AI技术的使用门槛,让更多不具备编程背景…

2024年第14届生物医学工程与技术国际会议(ICBET 2024)即将召开!

2024年第14届生物医学工程与技术国际会议(ICBET 2024)将于2024年6月14日至17日在韩国首尔举行。 会议旨在汇聚来自世界各地的研究人员、工程师、院士和行业专业人士,展示他们在生物医学工程与技术领域的最新研究成果和进展。 会议以“生物医学…

轻松应对城市内涝:慧天排水数字化分析平台,城市内涝模拟新利器

​在城市排水防涝规划过程中,水文水动力耦合模型已经成为一种不可或缺的分析工具。在模型建立、城市内涝风险评估、排水系统性能诊断以及海绵城市规划等方面,内涝耦合模型提供了相应的模拟及分析工具: 1.1 丰富的数据处理功能,兼…

C语言中如何动态分配内存并进行操作

C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程…

Redis分布式锁—SETNX+Lua脚本实现

使用redis实现分布式锁,就是利用redis中的setnx,如果key不存在则进行set操作返回1,key已经存在则直接返回0。 优点: 设置expiretime过期时间,可以避免程序宕机长期持有锁不释放。redis作为一个中间服务,所…

成都百洲文化传媒有限公司引领电商服务新潮流

在当今数字化时代,电商行业日新月异,竞争激烈。然而,在这个浪潮中,成都百洲文化传媒有限公司凭借其专业的电商服务,脱颖而出,成为了行业中的新领军者。今天,我们就来探讨一下这家公司如何在这个…

详解mysql安装与配置,及Mac中常见的安装问题

目录 1 数据库介绍 什么是数据库 数据库分类 2 MySQL服务器安装 2.1 Windows绿色安装 2.2 Windows中重装MySQL 3 Mac中常见的安装问题 4 客户端连接MySQL服务器 5 SQL分类 1 数据库介绍 什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 文件…

面试算法-103-对链表进行插入排序

题目 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。 每次迭代中,插入排序…

下载的音频转换成mp3怎么转?4个好用简单的方法

不同音乐平台下载的音频格式文件不同,比如网易云的ncm格式、酷狗的kgm格式、B站的m4s格式、微信语音的silk格式、手机录音的amr、m4a格式,这些音频一旦脱离了原本的平台便无法播放,那么如何把下载的音频转换成兼容性高的MP3格式以便于我们在更…

BoostSeacher

前言: 基于Boost库的搜索引擎 为何基于Boost库? 从技术上说:这个项目用了很多Boost库的接口从搜索引擎存储内说:存储的内容是Boost库的内容预期效果 预期效果:用户在浏览器输入关键词,浏览器显示相关结果 STEP1&#x…

问题记录:idea中的目标字节码版本总是自动更改为1.5

问题描述&#xff1a; 图中画圈的地方应该是1.8 但是总是自动被还原到1.5 解决方法&#xff1a;在pom文件中加入,注意加入到内中&#xff0c;作为子节点 <build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version…

Python编程异步爬虫实战案例

aiohttp异步爬取实战 案例介绍 链接为https://spa5.scrape.center&#xff0c;页面如下图所示&#xff1a; 这是一个图书网站&#xff0c;整个网站包含数千本图书信息&#xff0c;网站数据是JavaScript渲染而得的&#xff0c;数据可以通过Ajax接口获取&#xff0c;并且接口没…

关于YOLOv9项目中使用已有模块自由改进的教程

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. 文件说明 在YOLOv5-v9&#xff0c;模型的结构是以yaml文件的存储。我们可以在原有的yaml基础上增、减、改模块&#xff0c;创作我们自己的模型。 …

蓝桥杯刷题-串的处理

串的处理 代码 s input().split() l_new [] for i in s:i list(i)new""for j in range(len(i)-1): # 遍历newi[j]if i[j].isdigit() and i[j1].isalpha(): # 在字母和数字之间添加“_”new_if i[j].isalpha() and i[j1].isdigit(): # 同上new_newi[-1]l_new.appe…

高德地图加遮罩灯光效果

最近做大屏展示&#xff0c;UI突然有一个大胆的想法&#xff0c;他想把地图做成那种有点灯光照在上面的感觉&#xff0c;经过几番尝试后终于实现了相关效果&#xff0c;特此分享&#xff1b; 效果图 实现方式-css /* 高德地图加载成功有一个amap-layers类名的标签&#xff0c;…

论文不再难写:ChatGPT带你飞

目录 一、ChatGPT&#xff1a;您的个人写作顾问 1.打造个性化的论文框架 2.提升写作质量与效率 3.丰富表达方式&#xff0c;增强文章吸引力 二、结语&#xff1a;开启写作新篇章 在这个信息迅速发展、日新月异的时代里&#xff0c;写作已成为我们表达自我、在学术界或职场…

406. 根据身高重建队列(力扣LeetCode)

文章目录 406. 根据身高重建队列题目描述贪心算法代码 406. 根据身高重建队列 题目描述 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &…

瑞萨杯(一)

基础信息 RA6M5&#xff1a;ARM V8架构&#xff0c;24MHz外置晶振&#xff0c;200MHz主频 SCI&#xff08;Serial Communications Interface&#xff09;&#xff0c;意为串行通信接口 参考链接&#xff1a; 【瑞萨RA系列FSP库开发】RASCKeil的环境搭建_瑞萨ra mdk-CSDN博客…

24 OpenCV直方图反向投影

文章目录 参考反向投影作用calceackProject 反向投影mixchannels 通道图像分割示例 参考 直方图反向投影 反向投影 反向投影是反映直方图模型在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型 作用…

Excel表格中函数CEILING的用法

这里写目录标题 CEILING函数将参数Number向上舍入 CEILING函数将参数Number向上舍入 CEILING函数是将参数Number向上舍入&#xff0c;沿绝对值增大的方向&#xff0c;为最接近的 significance 的倍数。其语言表达为&#xff1a;CEILING(number, significance)