matlab 浅浅实现随机森林(Random forest)算法对高光谱图像数据进行分类,输出分类结果图和精度评价

2023-11-17

利用随机森林(Random forest)算法对数据进行分类,输出分类结果图; 利用验证样本集计算出分类结果的混淆矩阵, 输出分类结果的整体分类精度 和每一类地 物的分类精度。
emmm不要对下面的内容报有太大的期待,要求使用随机森林算法,我尝试了,但失败了,就只是用matlab自己的函数勉强完成了要求。我的工作量大概在于找到这个函数[大哭]

%利用随机森林(Random forest)算法对数据进行分类
%第一种 利用ClassificationTree.fit构造决策树,总体正确率为85%
 %% 数据导入
load imgreal.mat %待分类数据img
load AVIRIS_Indiana_16class.mat %带标签的验证样本集trainall
[m,n,p]=size(img);
img1=reshape(img,m*n,p);
[m1,n1]=size(trainall);
img1_trainall=zeros(m1,p+2);%第1列为位置,2——p+1列为波段数据,第p+2列为标签
for i=1:m1
    img1_trainall(i,1)=trainall(i,1);
    img1_trainall(i,2:p+1)=img1(trainall(i,1),:);
    img1_trainall(i,p+2)=trainall(i,2);
end
%% 数据预处理
ti=1;si=1;
for i=1:16
    [ri,ci]=find(img1_trainall(:,p+2)==i);
    le=length(ri);
    alli=zeros(le,p+2);
    for j=1:le
        alli(j,:)=img1_trainall(ri(j),:);
    end
    mi=floor(le*0.9);%每类样本的前90%作为训练集,剩下的为验证集
    ni=le-mi;
    %训练集
    train_data(si:si+mi-1,:)=alli(1:mi,2:p+1);
    train_label(si:si+mi-1,:)=alli(1:mi,p+2);
    %测试集
    test_data(ti:ti+ni-1,:)=alli(mi+1:end,2:p+1);
    test_label(ti:ti+ni-1,:)=alli(mi+1:end,p+2);
    si=si+mi;ti=ti+ni;
end
mi=length(train_label);ni=length(test_label);
%% 随机森林
%第一种 利用ClassificationTree.fit构造决策树,总体正确率为0.727476755370311
%200棵决策树
shu=200;
correct_rate_tree=zeros(shu,1);%每棵决策树的准确率
test_label_tree=zeros(ni,shu);%记录测试集根据每棵树的分类结果
img1_tree=zeros(m*n,200);%记录待分类数据根据每棵树的分类结果
for i=1:shu
    tic
    a=randperm(floor(mi*0.85));%随机样本,为训练集数据的99%
    Train_Data = train_data(a(1:end),:);
    Train_Label =train_label(a(1:end),:);
%     leaf=randi([800 1500]);%随机minleaf 
    Tree= ClassificationTree.fit(Train_Data,Train_Label);
%     view(Tree);% 查看决策树视图
%     view(Tree,'mode','graph');
    %测试每棵决策树的结果
    testi= predict(Tree,test_data);
    test_label_tree(:,i)=testi;
    aa=testi-test_label;tt=0;
    for j=1:ni
        if aa(j)==0
            tt=tt+1;
        end
    end
    correct_rate_tree(i)=tt/ni;%每棵决策树的正确率
    %待分类数据进入决策树的结果
    img1_treei=predict(Tree,img1);
    img1_tree(:,i)=img1_treei;
    toc
    %程序运行可视化
    disp(['进度--',num2str(i/shu*100),'%']);
end
%% 测试集总体分类正确率
 test_label_label=zeros(ni,1);
for i=1:ni
    lea=zeros(16,1);
    for j=1:shu
        lea(test_label_tree(i,j))=lea(test_label_tree(i,j))+1;
    end
    ma=max(lea);
    test_label_label(i)=find(lea==ma,1);
end
ss= test_label_label-test_label;ttr=0;
for i=1:ni
    if ss(i)==0
        ttr=ttr+1;
    end
end
ttrt=ttr/ni;%分类正确率
%% 混淆矩阵
%第m行第n列a表示有a个实际归属第m类的实例被预测为第n类
hun_xiao=zeros(16,16);
for i=1:ni
   
        hun_xiao(test_label(i),test_label_label(i))=hun_xiao(test_label(i),test_label_label(i))+1;
    
end
%每一类的分类精度
%每一行的数据总数表示该类别的数据实例的数目
jingdu=zeros(16,1);
for i=1:16
    jingdu(i)=hun_xiao(i,i)/sum(hun_xiao(i,:));
end   
%% 投票法得出待分类数据真正类别
img1_label=zeros(m*n,1);
for i=1:m*n
    lea=zeros(16,1);
    for j=1:shu
        lea(img1_tree(i,j))=lea(img1_tree(i,j))+1;
    end
    ma=max(lea);
    img1_label(i)=find(lea==ma,1);
end
%存储数据
img1_label=reshape(img1_label,m,n);
xlswrite('img1_label_1.xls', img1_label);   
%可视化分类结果图
figure(1); imshow(img1_label,[]);
%% 随机森林
%第二种 利用TreeBagger构造随机森林 200棵决策总体正确率0.868868226995832
disp('TreeBagger');
tic
model=TreeBagger(200,train_data,train_label);
toc
[predict_labelS,scores]=predict(model,test_data);
% predict_label=zeros(ni,1);
% for i=1:ni
%     predict_label(i)=eval(predict_labelS(i));
% end
predict_label=str2num(char(predict_labelS));
sss=predict_label-test_label;
st=length(find(sss==0));
str=st/ni;%总体分类正确率;0.774774774774775
%% 混淆矩阵
hun_xiaoi=zeros(16,16);
for i=1:ni
    
        hun_xiaoi(test_label(i),predict_label(i))=hun_xiaoi(test_label(i),predict_label(i))+1;
 
end
%每一类的分类精度
%每一行的数据总数表示该类别的数据实例的数目
jingdui=zeros(16,1);
for i=1:16
    jingdui(i)=hun_xiaoi(i,i)/sum(hun_xiaoi(i,:));
end   
%% 分类结果
[img1_labeli,scores]=predict(model,img1);
img1_labeli=str2num(char(img1_labeli));%cell转double
img1_labeli=reshape(img1_labeli,m,n);
xlswrite('img1_label_2.xls', img1_labeli);   
%可视化分类结果图
figure(2); imshow(img1_label,[]);


这里就不上传数据了,大概说下数据是啥样子的吧,待分类数据img是一个145乘145乘220的数据,145是位置,220是光谱信息;带标签的验证样本集trainall是一个10366乘2的数据,第一列是img数据reshape后的位置,第二列是标签。至于写的两种方法ClassificationTree.fit和TreeBagger其实只要用第二种就可以了。(我留下是为了显示偶滴工作量[手动狗头],表示我干活了,就是没做出来[大哭])
还有一件事,感觉这种的数据输入,就是样本输入那块一定要注意是不是取的每一类样本的90%,这里trainall的数据是按照标签顺序排的且每类样本的数目相差有些多,一开始没注意还找了好久的问题(也可能只有我会犯这样的错误吧。[大哭double])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab 浅浅实现随机森林(Random forest)算法对高光谱图像数据进行分类,输出分类结果图和精度评价 的相关文章

  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it
  • 将此 MATLAB 代码转换为 Python 时我做错了什么?

    我正在努力将生成波形的 MATLAB 代码转换为 Python 就上下文而言 这是原子力显微镜带激发响应的模拟 与代码错误无关 在 MATLAB 中从 r vec 生成的图形与我在 Python 中生成的图形不同 我是否正确地将 MATLA
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • 图像堆栈的最大强度投影

    我正在尝试重新创建该功能 max array 3 来自 MatLab 它可以获取 N 个图像的 300x300px 图像堆栈 我在这里说 图像 因为我正在处理图像 实际上这只是一个大的双数组 300x300xN 并创建一个 300x300
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • MATLAB中如何画水平线和垂直线?

    我目前正在尝试在 MATLAB 中绘制简单的垂直线和水平线 例如 我想绘制线 y 245 我该怎么做呢 MATLAB 根据您提供的向量逐点进行绘图 因此 要创建一条水平线 您需要改变x同时保持y对于垂直线恒定 反之亦然 xh 0 10 yh
  • MATLAB:具有复数的 printmat

    我想使用 MATLAB 的printmat显示带有标签的矩阵 但这不适用于复数 N 5 x rand N 1 y rand N 1 z x 1i y printmat x y z fftdemo N 1 2 3 4 5 x y x iy O
  • 我需要转义该 MATLAB 字符串中的字符吗?

    我想在 MATLAB 中调用以下 bash 命令 grep Up to test linux vision1 1 log awk print 7 I use system 在MATLAB中 但结果有错误 gt gt status strin
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos
  • 从开始/结束索引列表创建向量化数组

    我有一个两列矩阵M包含一堆间隔的开始 结束索引 startInd EndInd 1 3 6 10 12 12 15 16 如何生成所有区间索引的向量 v 1 2 3 6 7 8 9 10 12 15 16 我正在使用循环执行上述操作 但我想
  • Matlab 的 imresize 函数中用于插值的算法是什么?

    我正在使用 Matlab Octaveimresize 对给定的二维数组重新采样的函数 我想了解如何使用特定的插值算法imresize works 我在Windows上使用八度 e g A 1 2 3 4 是一个二维数组 然后我使用命令 b
  • 检测数据集中线性行为的算法

    我已经发布了一个关于对数据集的一部分进行多项式拟合的算法 https stackoverflow com q 17595932 2320757前一段时间收到一些建议去做我想做的事 但我现在面临另一个问题 我尝试应用答案中建议的想法 我的目标

随机推荐

  • 集成FCM推送一系列问题

    FCM Firebase Cloud Messaging 首先集成FCM需要一定的条件 必要条件 Android2 3版本以上的手机和拥有Google service的框架应用和不在国内的网络 使用外网 第一国内的手机一般阉割了Google
  • 教你用Python爬网站数据,并用BI可视化分析!

    两年时间里曾经换过一份工作 一直都是从事大数据相关的行业 目前是一家企业的BI工程师 主要工作就是给业务部门出报表和业务分析报告 回想自己过去的工作成绩也还算是不错的 多次通过自己分析告 解决了业务的疑难杂症 领导们各种离不开 但安逸久了总
  • C++17新特性之try_emplace与insert_or_assign

    由于std map中 元素的key是唯一的 我们经常遇到这样的场景 向map中插入元素时 先检测map指定的key是否存在 不存在时才做插入操作 如果存在 直接取出来使用 或者key不存在时 做插入操作 存在时做更新操作 通用的做法 可以直
  • Sqoop脚本调用

    在生产环境中 肯定不能直接去跑命令 需要使用脚本文件 然后定时执行脚本文件即可 cd usr hdk mkdir job cd job vi RDBMS2HDFS opt import connect jdbc mysql hadoop01
  • blender基础入门 / 操作快捷键

    鼠标停留在工具按钮上 按F1 打开官网在线帮助 基本显示 操作框放大缩小 T 显示 隐藏左侧工具栏 基本信息侧边栏Sidebar 展开 弹出 快捷键N 模型比例1 1 保持自身比例数据 模型游标轴点中心点设置位置 游标模式 shift C游
  • Apache下 FastCGI 配置小结

    http hi baidu com clusterlee item aa9a122c84cf94d40e37f985 一 下载 FastCGI模块 http www fastcgi com dist mod fastcgi 2 4 6 ta
  • 知识蒸馏综述:代码整理

    GiantPandaCV导语 收集自RepDistiller中的蒸馏方法 尽可能简单解释蒸馏用到的策略 并提供了实现源码 1 KD Knowledge Distillation 全称 Distilling the Knowledge in
  • 简单使用easyExcel实现对excel读和写操作

    1 引入依赖 easyexcel底层封装了poi所以必须引入poi而且版本需要进行对应如下
  • Python报错:requests.exceptions.SSLError: HTTPSConnectionPool(host=‘huggingface.co‘, port=443): Max ret

    1 Python报错 2 解决方法 出现问题的原因是运行程序的时候没有联网 但是使用了未下载的bert base chinese模型 我们可以将模型手动下载 然后放入到对应文件夹即可 3 下载bert base chinese模型 首先进入
  • java 字符串包含_java判断字符串包含某个字符的实例方法

    java判断字符串是否包含某个字符的方法 一 contains方法 1 描述 java lang String contains 方法返回true 当且仅当此字符串包含指定的char值序列 2 声明 public boolean conta
  • uc浏览器显示服务器错误,使用UC浏览器打开网页报错,无法播放优酷官网视频...

    适用产品 HUAWEI MateBook 13 2021款intel i7 8g 512g 集显 触屏 2020 锐龙版 amd r5 16g 512g 集显 锐龙版2020款 amd r5 8g 512g 集显 触屏 2021款 inte
  • 机器学习学习笔记——数据集划分(留出法)

    编译工具 pycharm 学习工具 Anaconda notebook 在机器学习算法中 我们通常将原始数据集划分为三个部分 划分要尽可能保持数据分布的一致性 1 Training set 训练集 训练模型 2 Validation set
  • 使用shell(sh)文件批量修改文件的权限

    最近在www coolketang com上实现了苹果移动端互动教程的Web化 但是课程资料在上传到云服务器时 总是出现权限问题 而无法打开 所以写了个脚本 在上传服务器之前 批量修改资源的权限 代码较少 可以直接阅读 编辑完保存为 sh文
  • 最强自动化测试框架Playwright (27)-跟踪查看器

    Playwright Trace Viewer 是一个 GUI 工具 可帮助您在脚本运行后探索记录的 Playwright 跟踪 可以本地打开 也可以在trace playwright dev 打开 录制跟踪文件 使用context tra
  • 在物联网中应用机器学习

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由未来守护者发表于云 社区专栏 本项目探讨如何将机器学习 Machine learning 应用到物联网 IoT Internet of Things 中 我们将使用 Andro
  • 关于数据分析流程详解

    在数据分析过程中 主要是以下几个过程 一 明确分析目的 首先要明确自己的分析目的 只有明确目的的分析才能更有效的解决自己的问题 打到自己的目的 大量数据 试探性的分析除外 但是即使是试探性的分析过程 前期也是需要一个假设的分析目的的 二 数
  • split()正则表达式按照长度切割

    String split s s length 2 gt 0 split lt G 2 正则表达式匹配 按2位长度分割
  • 期货止损篇1:固定点数止损真的好用,只是90%的人都用错了

    最近问到止损的朋友比较多 这个系列跟大家分享下个人对于止损的一些看法 每个人刚入市的时候 最常听到的就是固定点数止损 比如固定3个点止损 固定10个点止损 固定20个点止损 固定50个点止损 用久了 很多人就抱怨这个方法不靠谱 大师是不是留
  • Keil报错 requires ANSI-style prototype

    在进行模块化程序设计时遇到这种error 这是头文件没有定义的问题 首先在同一个目录下建立一个 h文件 第二步打开文件 进行编辑 要用到 ifndef define endif 这是为了避免重复定义 ifndef后面跟的是头文件名称的大写
  • matlab 浅浅实现随机森林(Random forest)算法对高光谱图像数据进行分类,输出分类结果图和精度评价

    利用随机森林 Random forest 算法对数据进行分类 输出分类结果图 利用验证样本集计算出分类结果的混淆矩阵 输出分类结果的整体分类精度 和每一类地 物的分类精度 emmm不要对下面的内容报有太大的期待 要求使用随机森林算法 我尝试