• 大小: 37.8MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-07-17
  • 语言: 其他
  • 标签:

资源简介

利用稀疏字典表示、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


评论

共有 条评论