资源简介
利用稀疏字典表示、OMP算法进行高光谱图像分类,内含高光谱数据。
代码片段和文件信息
clear;
clc;
load datalab.mat data %读取数据,包含标记的数据data.fet和对应的分类data.lab
%初始化
K = 3; %OMP算法中信号的稀疏度
loopCnt = 10; %为减少随机性而计算10次,结果取平均值
trnPer = 0.2; %训练数据所占的百分比20%
clsCnt = 16; %分类的数量
clsNum = zeros(1 clsCnt); %每个类别的数据的总数量
trnNum = zeros(1 clsCnt); %每个类别的数据选作训练数据的数量
tstNum = zeros(1 clsCnt); %每个类别的数据选作测试数据的数量
conMat = zeros(clsCntclsCnt); %混淆矩阵,保存测试数据的预测类别与实际类别的关系
for i = 1 : clsCnt
index = find(data.lab == i); %找到标记为i的数据的下标
clsNum(i) = size(index1); %标记为i的数据的总数量
trnNum(i) = ceil(clsNum(i) * trnPer); %选取作为训练样本的数量
tstNum(i) = clsNum(i) - trnNum(i); %剩余的为测试样本的数量
end
%开始计算
for loop = 1 : loopCnt %重复10次
trnFet = []; %保存训练数据
trnLab = []; %保存训练数据对应的类型
tstFet = []; %保存测试数据
tstLab = []; %保存测试数据对应的类型
%每种类别随机选取20%作为样本数据
for i = 1 : clsCnt
index = find(data.lab == i); %找到标记为i的数据的下标
random_index = index(randperm(length(index)));%结果为打乱顺序后的下标序列
index = random_index(1:trnNum(i)); %在乱序中取前20%作为训练样本,index保存它们的下标
trnFet = [trnFet data.fet(index:)‘]; %将训练样本的数据依次填充进trnFet数组
trnLab = [trnLab ones(1length(index))*i]; %将训练样本的标记依次填充进trnLab数组
index = random_index(trnNum(i)+1:end); %乱序中剩余的为测试样本,index保存它们的下标
tstFet = [tstFet data.fet(index:)‘]; %将测试样本的数据依次填充进tstFet数组
tstLab = [tstLab ones(1length(index))*i]; %将测试样本的标记依次填充进tstFet数组
end
%用OMP算法预测训练数据的分类
trnFet = trnFet./repmat(sqrt(sum(trnFet.*trnFet))[size(trnFet1) 1]); %对训练样本做归一化处理
tstFet = tstFet./repmat(sqrt(sum(tstFet.*tstFet))[size(tstFet1) 1]); %对测试样本做归一化处理
for i = 1 : size(tstFet2) %对每一个测试样本i做预测
x = tstFet(:i); %提取出某个测试样本的200维数据x
sparse = OMP(trnFetxK); %用OMP算法求出其稀疏系数矩阵
residual = zeros(1clsCnt); %该组样本对每个类别的重构冗余
for j = 1:1:clsCnt %将该测试样本重构成每一种类别
index = find(trnLab == j); %选取字典中类别为j的数据
D_c = trnFet(:index); %字典中类别为j的列
s_c = sparse(index); %稀疏矩阵中本应为j类的位置的系数
temp = x - D_c*s_c; %
residual(j) = norm(temp2); %计算重构冗余
end
preLab = find(residual == min(residual)); %找出重构冗余最小的类别,即为预测的类别
conMat(preLab(1)tstLab(i)) = conMat(preLab(1)tstLab(i)) + 1; %根据实际类别与预测结果,更新混淆矩阵
end
end
for i = 1 : clsCnt
conMat(:i) = conMat(:i) ./ (loopCnt * tstNum(i));
end
ave_acc = sum(diag(conMat))/clsCnt
printConMat(conMat);
save result.mat
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3415 2017-10-11 15:26 omp\classifier.m
文件 21909979 2017-05-11 22:40 omp\datalab.mat
文件 836 2017-05-12 16:39 omp\OMP.m
文件 1555 2017-05-12 16:55 omp\printConMat.m
文件 17725409 2017-10-25 09:26 omp\result.mat
目录 0 2017-10-25 09:09 omp
----------- --------- ---------- ----- ----
39641194 6
评论
共有 条评论