基于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函数很大程度上的影响。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络原理(6)——IP协议

目录 一、网段划分 现在的网络划分: 1、一般情况下的家庭网络环境 2、IP地址 3、子网掩码 4、网关 以前的网络划分: 二、特殊IP 1、环回 IP 2、主机号为全 0 的IP 3、广播地址IP 三、路由选择(路线规划) 一、网段划分…

智慧城管综合执法办案系统,现场移动执法APP源码,占道经营AI智能识别分析系统

智慧城管执法平台源码 智慧城管综合执法办案系统,提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能,全面赋能执法队员,提高执法队员办案效率。 智慧城管综合执法办案系统在业务上能够支持所有行政处罚权力项目的网上运…

systrace抓取

1. 抓取systrace日志 adb root adb shell atrace -z -b 8192 video gfx input view wm rs hal sched freq idle irq -t 10 > /sdcard/trace_output atrace: Android Trace命令,用于在Android系统上进行性能跟踪和分析。 -z: 压缩跟踪数据,减小输出文…

Excel中最常用的快捷健,每天都会用到

Hello,大家好,今天跟大家分享我们工作中经常使用的快捷键,快捷键能够在一定程度上提高我们的工作效率,快速达到我们想要的结果,善用快捷键也能让别人觉得你非常的厉害。 1快速求和 :Alt 使用方法非常的简…

Python编程异步爬虫实战案例

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

深度学习 - PyTorch基本流程 (代码)

直接上代码 import torch import matplotlib.pyplot as plt from torch import nn# 创建data print("**** Create Data ****") weight 0.3 bias 0.9 X torch.arange(0,1,0.01).unsqueeze(dim 1) y weight * X bias print(f"Number of X samples: {len(…

ZYNQ学习之Ubuntu环境下的Shell与APT下载工具

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu Shell操作 简单的说Shell 就是敲命令。国内把 Linux 下通过命令行输入命令叫…

代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机II ,55. 跳跃游戏 , 45.跳跃游戏II

贪心&#xff1a;只要把每一个上升区间都吃到手&#xff0c;就能一直赚 class Solution { public:int maxProfit(vector<int>& prices) {int res 0;for(int i 1;i< prices.size();i){int diff prices[i] - prices[i-1];if(prices[i] > prices[i-1]){res d…

WSL使用

WSL使用 WSL安装和使用 Termianl和Ubuntu的安装 打开Hype-V虚拟化配置Microsoft Store中搜索Window Terminal并安装Microsoft Store中搜索Ubuntu, 选择安装Ubuntu 22.04.3 LTS版本打开Window Terminal选择Ubuntu标签栏, 进入命令行 中文输入法安装 查看是否安装了fcitx框架…

【官方】操作指南,附代码!银河麒麟服务器迁移运维管理平台V2.1中间件及高可用服务部署(4)

1.RocketMQ集群模式 主机配置示例&#xff1a; IP 角色 架构模式 对应配置文件 1.1.1.1 nameserver1 master broker-n0.conf 2.2.2.2 nameserver2 salve1 broker-n1.conf 3.3.3.3 nameserver3 salve2 broker-n2.conf 1.1.安装rocketmq 在服务器上安装rocket…

第14篇:2线-4线译码器

Q&#xff1a;有编码器那对应的就会有译码器&#xff0c;本期我们来设计实现2线-4线二进制译码器 。 A&#xff1a;基本原理&#xff1a;译码器是编码器的逆过程&#xff0c;其功能是将具有特定含义的二进制码转换为对应的输出信号。2线-4线二进制译码器有2个输入共4种不同的组…

java目标和(力扣Leetcode106)

目标和 力扣原题 问题描述 给定一个正整数数组 nums 和一个整数 target&#xff0c;向数组中的每个整数前添加 ‘’ 或 ‘-’&#xff0c;然后串联起所有整数&#xff0c;可以构造一个表达式。返回可以通过上述方法构造的、运算结果等于 target 的不同表达式的数目。 示例 …

【MySQL】11. 复合查询(重点)

4. 子查询 子查询是指嵌入在其他sql语句中的select语句&#xff0c;也叫嵌套查询 4.1 单行子查询 返回一行记录的子查询 显示SMITH同一部门的员工 mysql> select * from emp where deptno (select deptno from emp where ename SMITH); -----------------------------…

小目标检测篇 | YOLOv8改进之添加BiFormer注意力机制

前言:Hello大家好,我是小哥谈。BiFormer是一种具有双层路由的动态稀疏注意力机制,它通过查询自适应的方式关注一小部分相关标记,从而提供了更灵活的计算分配和内容感知。它在多个计算机视觉任务中表现出了良好的性能和高计算效率。BiFormer注意力机制比较适合处理小尺度目标…

聚类算法之高斯混合模型聚类 (Gaussian Mixture Model, GMM)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 高斯混合模型&#xff08;GMM&#xff09;是统计模型中的一颗璀璨之星&#xff0c;它为数据提供了一种复杂而又强大的表示方法。在机器学习的许多…

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解&#xff0c;让大家熟练虚拟机的安装使用&#xff0c;Linux系统的安装配置&#xff0c;学习掌握linux系统常用命令的使用&#xff0c;常用的软件安装方法&#xff0c;制作快照&#xff0c;克隆&#xff0c;完成免密登录&…

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构&#xff08;字段&#xff09; 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL&#xff1a;数据定义语言&am…

跨域与Spring Boot中CORS的应用

摘要&#xff1a;前后端独立开发期间&#xff0c;交互主要通过接口文档&#xff0c;前端Mock数据&#xff0c;后端使用Postman都不会发现跨域问题。当联调时前端尝试调用后端接口&#xff0c;这往往就需要需要处理的跨域问题…… 下面总结下跨域问题产生的前因后果以及如何通过…

day03_mysql_课后练习 - 参考答案

文章目录 day03_mysql_课后练习mysql练习题第1题第2题第3题第4题第5题 day03_mysql_课后练习 mysql练习题 第1题 案例&#xff1a; 1、创建一个数据库&#xff1a;day03_test01_school 2、创建如下表格 表1 Department表的定义 字段名字段描述数据类型主键外键非空唯一D…

Java学习笔记 | JavaSE基础语法 | 04 | 数组

文章目录 0.前言1.数组2.数组声明2.1 数组定义2.2 数组初始化1.静态初始化2.动态初始化3.区别4.数组的默认初始化值&#xff1a; 2.3 数组名 3.访问数组3.1 索引3.2 访问数组3.3 length属性 4.数组常见问题5.数组内存分析5.1 内存分配5.2 数组内存分配 6.数组的练习练习1&#…