基于SVM的PLOSAR图像分类

news2024/9/21 11:03:53

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

前言

支持向量机(SVM)是一种强大的监督学习算法,常用于分类和回归分析。在POLSAR图像分类中,SVM可以被有效地应用。支持向量机具有对高维数据的处理能力、对于非线性分类问题的适应性、泛化能力强等优点,本文为基于SVM实现PLOSAR图像分类的一个小实例。


文章目录

  • 前言
  • 一、数据预处理
  • 二、基于SVM的PLOSAR图像分类
    • 1. SVM简介
    • 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列是数据,后面一列为标签。

二、基于SVM的PLOSAR图像分类

1. SVM简介

支持向量机(Support Vector Machine,SVM)是一种强大的监督学习算法,用于分类和回归分析。它的主要思想是找到一个最优的超平面,将不同类别的样本在特征空间中分隔开来,并且使得两侧距离最近的样本点到超平面的距离最大化。这些最接近超平面的样本点被称为支持向量,因此SVM也被称为最大间隔分类器。
在这里插入图片描述

SVM算法的基本原理和步骤如下:

  • 数据准备:获取带有标签的训练数据集,每个样本包含特征和对应的类别标签。

  • 选择核函数:SVM利用核函数来将数据从原始特征空间映射到更高维的特征空间,以便在高维空间中找到一个最优的超平面。常用的核函数包括线性核多项式核高斯核等。

  • 构建优化问题:SVM的目标是找到一个最优的超平面,使得间隔最大化,并且能够正确地分类训练数据。这可以转化为一个凸优化问题,通常通过求解拉格朗日对偶问题来实现。

  • 求解优化问题:通过优化算法(如序列最小最优化算法,SMO)来求解构建的优化问题,找到最优的超平面参数。

  • 分类预测:对于新的未知样本,根据构建好的超平面参数和核函数来预测其类别。样本被分类到距离超平面一侧的类别中。

2. 分类实验

定义一个SVM分类器,这里我们直接使用sklearn来实现,然后我们的实验分别测试了当训练数据集比例为[0.1,0.3,0.5]时的准确率,同时测试了kernel的取值分别为[‘poly’,‘linear’,‘rbf’,‘sigmoid’]的准确率,共九组实验,其中实验过程代码如下所示,

acc=[]
kernel=['poly','linear','rbf','sigmoid']
train_size=[0.1,0.3,0.5]
for i in range(4):
    print("kernel=",kernel[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)
        svm_model = SVC(kernel = kernel[i])
        svm_model.fit(X_train, y_train.reshape((-1, 1)).ravel())
        y_predict = svm_model.predict(X_test)
        acc.append(accuracy_score(y_test, y_predict))
        print("train_size=",train_size[j], "的分类准确率为: ", acc[i*3+j])

结果为:

  • kernel= poly 时:
    train_size= 0.1 的分类准确率为: 0.6073366414691833
    train_size= 0.3 的分类准确率为: 0.6382166798695048
    train_size= 0.5 的分类准确率为: 0.7034797748521274
  • kernel= linear 时:
    train_size= 0.1 的分类准确率为: 0.13331036630206505
    train_size= 0.3 的分类准确率为: 0.1748396494007615
    train_size= 0.5 的分类准确率为: 0.22277475672581568
  • kernel= rbf 时:
    train_size= 0.1 的分类准确率为: 0.8272570077049973
    train_size= 0.3 的分类准确率为: 0.8719409875722962
    train_size= 0.5 的分类准确率为: 0.8772180881511162
  • kernel= sigmoid 时:
    train_size= 0.1 的分类准确率为: 0.3574575496386005
    train_size= 0.3 的分类准确率为: 0.3508632952580516
    train_size= 0.5 的分类准确率为: 0.3413947719900782

实验数据如表所示。从实验结果中我们可以看到,使用SVM分类器的分类效果没有KNN的效果好,不同的kernel函数准确率差距较大,使用linear时,最高只有22%的准确率,但是在kernel函数为rbf时,其最高准确率可以达到87%。同时,我们可以看到,对于不同的训练数据集比例来说,较大的数据集更加能学习到更好的分类特征,这和KNN是一样的。对于不同的kernel函数来说,我们可以看到不同的kernel函数会对模型的准确度产生严重的影响,所以kernel函数的取值往往需要一个合适值,例如,在这一分类问题中rbf kernel函数相对其它kernel函数准确度更好。

train_size=0.1train_size=0.3train_size=0.5
poly0.60719088915536530.6418964386408743
linear0.133263990565850230.1747459518394535
rbf0.83186145580061090.8727587117437117
sigmoid0.3942003829310790.40387056107803304

最后,我们使用训练好的模型将原始数据读入,并将分类的结果绘制成图片的形式,其结果如下图所示。
在这里插入图片描述

结合KNN的实验结果从整体上两个分类器所表现的行性能来看,KNN相对来说更加稳定一些,在KNN实验中,无论K的取值如何,它的最终结果总是保持在85-87%之间,但是反观SVM来说,它受kernel函数取值的影响太多,例如,在kernel函数为rbf时,其最高准确率可以达到87%。但是在kernel函数为linear时,最高准确率仅仅只有达到22%。总的来说,SVM分类器受到kernel函数很大程度上的影响。


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

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

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

相关文章

|行业洞察·汽车|《2024新能源汽车行业及营销趋势报告-20页》

报告的主要内容解读: 新能源汽车行业概述及品牌分布: 近年来,中国新能源汽车销量增速高,市场占有率快速提升,成为汽车行业的重要增量。新能源汽车消费者趋向年轻化、女性化和高端化,对高科技、新体验有较高…

zedboard+AD9361 运行 open WiFi

先到github上下载img,网页链接如下: https://github.com/open-sdr/openwifi?tabreadme-ov-file 打开网页后下载 openwifi img 用win32 Disk lmager 把文件写入到SD卡中,这一步操作会把SD卡重新清空,注意保存数据。这个软件我会…

铸铁平台精度是怎么保持的——北重企业

铸铁平台的精度主要通过以下几个方面来保持: 材料选择:铸铁平台通常采用高强度、高硬度的铸铁材料,如HT250。这种材料具有优异的机械性能和耐磨性,能够提供稳固的支撑和保持平台的形状稳定。 加工工艺:铸铁平台在制造…

Freemarker环境搭建快速入门

Freemarker环境搭建&快速入门 测试工程搭建快速入门Freemarker指令语法基础语法种类集合指令(List和Map)if指令运算符空置处理内建函数 输出静态化文件 测试工程搭建 创建一个freemarker-demo 的测试工程专门用于freemarker的功能测试与模板的测试。…

【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II

作者推荐 视频算法专题 涉及知识点 图论 割点 LeetCode928. 尽量减少恶意软件的传播 II 给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示。在节点网络中,只有当 graph[i][j] 1 时,节点 i 能够直接连接到另一个节点 j。 …

八大技术趋势案例(云计算大数据)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

<el-table>设置一列为固定字段,其他列为循环生成

<el-table :data"tableData" style"width: 100%"><el-table-columnprop"name"label"固定字段名":formatter"formatter"></el-table-column><el-table-columnv-for"(item, index) in wordsColumns…

【Golang入门教程】Go语言变量的初始化

文章目录 强烈推荐引言举例多个变量同时赋值总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 推荐一个个人工作&#xff0c;日常中比较常…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

[flink 实时流基础系列]揭开flink的什么面纱基础一

Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 文章目录 0. 处理无界和有界数据无界流有界流 1. Flink程序和数据流图2. 为什么一定要…

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结&#xff1a; 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度&#xff1a;O(N^2) 3. 空间复杂度&#xff1a;O(1) 4. 稳定性&#xff1a;稳定 动图分析&#xff1a; 代码实现&#xff1a; Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

基于SSM学生信息管理系统

采用技术 基于SSM学生信息管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 总体功能设计 登录页面 后台首页 学生信息页面 添加学生用户 编辑…

Java八股文(数据结构)

Java八股文の数据结构 数据结构 数据结构 请解释以下数据结构的概念&#xff1a;链表、栈、队列和树。 链表是一种线性数据结构&#xff0c;由节点组成&#xff0c;每个节点包含了指向下一个节点的指针&#xff1b; 栈是一种后进先出&#xff08;LIFO&#xff09;的数据结构&a…

【教学类-35-20】20240328 中4班描字帖(学号+姓名 A4竖版2份 横面)+裁剪纸条+插入式纸盒

作品展示 背景需求&#xff1a; 整理仓库&#xff0c;找到之前打印的另外一套灰色版的学号字体&#xff08;和2月20日那份一模一样&#xff09; 【教学类-35-19】20240117 中4班描字帖&#xff08;学号姓名 A4竖版2份 横面&#xff09;-CSDN博客文章浏览阅读571次&#xff0c;…

Mysql数据库-DQL查询

Mysql数据库-DQL基本查询 1 DQL基本查询1.1 基础查询1.2 WHERE子句1&#xff09;算术运算符2&#xff09;逻辑运算符3&#xff09;比较运算符A&#xff09;BETWEEN... AND ...B&#xff09;IN(列表)C&#xff09;NULL值判断 4&#xff09;综合练习 2 DQL高级查询2.1 LIKE 模糊查…

SAP-CO主数据之统计指标创建-<KK01>

公告&#xff1a;周一至周五每日一更&#xff0c;周六日存稿&#xff0c;请您点“关注”和“在看”&#xff0c;后续推送的时候不至于看不到每日更新内容&#xff0c;感谢。 目录 一、背景&#xff1a; 成本中心主数据创建&#xff1a;传送门 成本要素主数据创建&#xff1…

人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践,CapsNet模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型26-基于pytorch搭建胶囊模型(CapsNet)的实践&#xff0c;CapsNet模型结构介绍。CapsNet&#xff08;Capsule Network&#xff09;是一种创新的深度学习模型&#xff0c;由计算机科学家Geo…

Linux——信号的保存与处理

目录 前言 一、信号的常见概念 1.信号递达 2.信号未决 3.信号阻塞 二、Linux中的递达未决阻塞 三、信号集 四、信号集的处理 1.sig相关函数 2.sigprocmask()函数 3.sigpending()函数 五、信号的处理时机 六、信号处理函数 前言 在之前&#xff0c;我们学习了信号…

未发TOKEN的Scroll除了撸毛还能如何获取机会?来Penpad Season 2,享受一鱼多吃!

Penpad 是 Scroll 上的 LauncPad 平台&#xff0c;该平台继承了 Scroll 底层的技术优势&#xff0c;并基于零知识证明技术&#xff0c;推出了系列功能包括账户抽象化、灵活的挖矿功能&#xff0c;并将在未来实现合规为 RWA 等资产登录 Scroll 生态构建基础。该平台被认为是绝大…

STM32时钟简介

1、复位&#xff1a;使时钟恢复原始状态 就是将寄存器状态恢复到复位值 STM32E10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。 复位分类&#xff1a; 1.1系统复位 除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统 复位将复位…