目录
高光谱图像(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