基于多层极限学习机自动编码器的高光谱图像分类MATLAB仿真

目录

1. 高光谱图像分类

2. 极限学习机(ELM)

3. 多层极限学习机(ML-ELM)

4. 自动编码器(AE)

5. 多层极限学习机自动编码器(ML-ELM-AE)

6. MATLAB程序

7. 仿真结果


       高光谱图像(Hyperspectral Image, HSI)是一种具有数百个连续波段的遥感图像,每个像素点都包含丰富的光谱信息。这些数据在地物分类、目标检测、环境监测等领域有着广泛的应用。然而,高光谱图像的高维特性带来了“维度灾难”问题,使得传统的分类方法难以直接应用。近年来,深度学习技术,特别是自动编码器(Autoencoder, AE)和极限学习机(Extreme Learning Machine, ELM),在高光谱图像分类中表现出色。

1. 高光谱图像分类

       高光谱图像(Hyperspectral Image, HSI)是一种具有数百个连续波段的遥感图像,每个像素点都包含丰富的光谱信息。这些数据在地物分类、目标检测、环境监测等领域有着广泛的应用。高光谱图像特点如下所示:

  • 高维性:每个像素点包含数百个波段的光谱信息。
  • 冗余性:相邻波段之间存在高度相关性。
  • 复杂性:不同地物的光谱特征可能非常相似,增加了分类难度。

2. 极限学习机(ELM)

       极限学习机是一种单隐层前馈神经网络,其特点是输入权重和偏置是随机生成的,不需要调整。输出权重通过最小二乘法求解。

3. 多层极限学习机(ML-ELM)

多层极限学习机通过堆叠多个ELM层来构建深层网络。每一层的输出作为下一层的输入。

4. 自动编码器(AE)

       自动编码器是一种无监督学习方法,通过重构输入数据来学习数据的低维表示。一个标准的自动编码器由编码器和解码器两部分组成。

  • 编码器:将输入数据x映射到低维潜在空间z。
  • 解码器:将潜在空间z映射回原始数据空间x^。

多层自动编码器通过堆叠多个AE层来构建深层网络。每一层的输出作为下一层的输入。

5. 多层极限学习机自动编码器(ML-ELM-AE)

      ML-ELM-AE结合了ML-ELM和ML-AE的优点,通过多层结构提取高光谱图像的高级特征,并通过ELM的高效训练能力提高计算效率。假设有一个K层的ML-ELM-AE,每层的输出可以表示为:

其训练过程如下所示:

6. MATLAB程序

% 内部函数定义开始
function [Acc, Time] = MY_ML_ELM_AL(varargin)
% 解析输入参数
img = varargin{1};% 输入高光谱图像数据

TrC = varargin{2};% 输入训练集标签

TeC = varargin{3};% 输入测试集标签

AL_Strtucture = varargin{4};% 输入主动学习参数结构体

tot_sim = AL_Strtucture.M/AL_Strtucture.h + 1; % 总迭代次数计算

Samples = varargin{5};% 输入采样技术方法

Fuzziness = varargin{6};% 输入模糊分类参数

Parameters = varargin{7};% 输入ELM参数结构体

folder = varargin{8};% 输入结果保存目录

gt = varargin{9};% 输入真实标签

% 保存测试样本位置信息
% 保存测试样本位置信息
TeC_Locations = cell(tot_sim, 1);% 存储每轮迭代后测试样本的位置
ELM_Per_Clas = cell(tot_sim, 1);% 存储每轮迭代后的分类结果
ELM_Tr_Per_Clas = cell(tot_sim, 1);% 存储每轮迭代后的训练集分类结果
% 主动学习多层极限学习机循环过程
for iter = 1 : tot_sim
    % 获取当前轮次训练集和测试集数据
    Tr = img(TrC(1,:), :);    Tr = img(TrC(1,:), :); 
    Te = img(TeC(1,:), :);
    TeC_Locations{iter} = TeC;
    % 构建并训练多层极限学习机AE模型
    [ELM__W_Tr, ELM_W, TrT, TeT, ~,~] = ELM_AE(Tr', TrC(2, :),...
        Te', TeC(2,:), Parameters.TLs, Parameters.HNs,...
            Parameters.Regu, Parameters.Rho, Parameters.Sigpara, ...
                Parameters.sigpara1, Parameters.AF);
    ELM_Class_Results.Time(iter,:) = [TrT TeT];% 存储训练和测试时间
    % 计算分类结果
    [~, ELM_Class_Results.map] = max(ELM_W);% 最大概率分类结果
    ELM_Per_Clas{iter} = ELM_Class_Results.map;% 存储当前轮次测试集分类结果
    % 计算准确率
    uc = unique(TrC(2, :));% 获取唯一类别标签
    [ELM_Class_Results.OA(iter), ELM_Class_Results.kappa(iter),...
        ELM_Class_Results.AA(iter), ELM_Class_Results.CA(iter,:)] = ...
            My_Accuracy(TeC(2,:)-1, ELM_Class_Results.map-1,(1:numel(uc)));
    % 计算训练集准确率
    [~, ELM_Tr_Class_Results.map] = max(ELM__W_Tr);% 训练集最大概率分类结果
    ELM_Tr_Per_Clas{iter} = ELM_Tr_Class_Results.map;% 存储当前轮次训练集分类结果
   % 主动学习样本选择过程
    [ELM_Tr_Class_Results.OA(iter), ELM_Tr_Class_Results.kappa(iter),...
        ELM_Tr_Class_Results.AA(iter), ELM_Tr_Class_Results.CA(iter,:)] = ...
            My_Accuracy(TrC(2,:)-1, ELM_Tr_Class_Results.map-1,(1:numel(uc)));        
  % 主动学习样本选择过程  
            ELM_W = My_Member(uc, ELM_W');% 计算样本隶属度
            ELM_Fuz = My_Fuzziness(ELM_W);% 计算模糊度
            Pred = ELM_Class_Results.map;% 组合模糊度和分类结果
            Pred  = [Pred; AL_Strtucture.Candidate_Set];
            Pred = [ELM_Fuz'; Pred]';
            [A, ind] = sortrows(Pred, -1);% 按照模糊度降序排列
            [idx, ~] = find(A(:,4) ~= A(:,2));  % 查找误分类样本索引
            index_ELM_minME = ind(idx);% 获取误分类样本在排序后的索引
            if length(index_ELM_minME)>(AL_Strtucture.h)
                xp = index_ELM_minME(1 : AL_Strtucture.h)';% 取前h个误分类样本
            else
                ind(idx) = [];% 移除已选样本
                index_ELM_minME = [index_ELM_minME' ind'];% 重组索引数组
                xp = index_ELM_minME(1 : AL_Strtucture.h)'; % 取前h个样本
            end
            TrCNew = AL_Strtucture.Candidate_Set(:,xp);% 新增至训练集
            TrC = [TrC, TrCNew];
            AL_Strtucture.Candidate_Set(:,xp) = [];% 从候选集中移除已选样本
            TeC = AL_Strtucture.Candidate_Set;% 更新测试集
 
end
% 计算训练集和测试集的综合性能指标
Tr_OA = ELM_Tr_Class_Results.OA';
Tr_AA = ELM_Tr_Class_Results.AA';
Tr_kappa = ELM_Tr_Class_Results.kappa';
 
Te_OA = ELM_Class_Results.OA';
Te_AA = ELM_Class_Results.AA';
Te_kappa = ELM_Class_Results.kappa';
% 合并性能指标结果
Acc = [Tr_OA Te_OA Tr_AA Te_AA Tr_kappa Te_kappa];
Time = ELM_Class_Results.Time;
end
up4080

7. 仿真结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值