上遙感原理與應用的時候,老師給我們大致講了一下遙感影象的地物分類問題,大致瞭解了一下機器學習方法在遙感影像處理方面的應用問題。
下面將所做作業進行一個大致的總結:

資料

訓練集一共四種:building、road、vegetation、water,分別對應標籤1,2,3,4,測試集為unknown;
資料為高光譜遙感影像資料,包含八個波段,需要對unknown進行逐畫素的分類。
資料鏈接如下:
https://pan.baidu.com/s/1gwa3GdXGxb9sfnbVsbFusw

監督分類-極大似然

一是假設每種地物每個波段都是正態分佈的,然後根據貝葉斯判別準則計算測試集每個畫素在四種類型中的概率,取概率最大為其地物型別。
程式碼如下:

 cd 'D:\桌面\大三下\遙感原理與應用\exp-1';
clear
clc
load('matlab.mat');
format long g
p=zeros(4,1);
p(1)=size(building,1)/size(sum_Mat,1);
p(2)=size(road,1)/size(sum_Mat,1);
p(3)=size(vegetation,1)/size(sum_Mat,1);
p(4)=size(water,1)/size(sum_Mat,1);
mul=[mean(building);mean(road);mean(vegetation);mean(water)];
SG=cell(4);
SG{1}=cov(building);
SG{2}=cov(road);
SG{3}=cov(vegetation);
SG{4}=cov(water);

predit=zeros(size(unknown,1),1);
t=zeros(1,4);
for i = 1:size(unknown,1)
    p=0;
    for j =1 :4
        t(j)=( 1/( (2*pi)^(1/2)*det(SG{j})^0.5 ) ) * exp( -0.5*(unknown(i,1:8)-mul(j,:))*inv(SG{j}) *(unknown(i,1:8)-mul(j,:))');
    end
     [~, x] = max(t);
    predit(i)=x;
end
tabulate(predit-unknown(:,9))
end
confuseMat=confusionmat(unknown(:,9),predit);
accuracy=length(find(predit==unknown(:,9)))/size(unknown,1);
K=size(unknown,1);
Pe=sum(sum(confuseMat,2).*diag(confuseMat))/K^2;
Kappar=(accuracy-Pe)/(1-Pe);

這裡先驗的地物概率並沒有用到,因為這裡假設了四種地物出現的概率是相等的,實際情況中其實要根據實際的地物情況進行處理。

有監督精度的評價
Kappar=ppe1pe
這裡p即為準確率,pe是所有種類分類得到的和正確分類的乘積之和除以樣本總量的平方。

參見

K=size(unknown,1);
Pe=sum(sum(confuseMat,2).*diag(confuseMat))/K^2;
Kappar=(accuracy-Pe)/(1-Pe);

非監督分類-K-means分類

cd 'D:\桌面\大三下\遙感原理與應用\exp-1';
clear
clc
load('matlab.mat');
format long g
p=zeros(4,1);

%%
% sum_Mat=[sum_Mat;unknown(:,1:8)];%串聯各矩陣
max_Mat=max(sum_Mat);
min_Mat=min(sum_Mat);
st_pa=[building(1,:);road(1,:);vegetation(1,:);water(1,:)];%將四種地物的質心初始化為每種地物的第一個畫素,一方面加快收斂速度,另一方面也方便後面的精度評定
% st_pa=rand(4,8).*repmat(max_Mat-min_Mat,[4,1])+repmat(min_Mat,[4,1]);
size(unknown,1)
pattarn=zeros(1,size(max_Mat,1));
distance=zeros(size(max_Mat,1),1);
while 1
    pre_pa=st_pa;

    for i =1:size(sum_Mat,1)
        tmp_distance=zeros(4,1);
        mu_d=repmat(sum_Mat(i,1:8),[4,1])-st_pa();
        for j=1:4
            tmp_distance(j)=norm(mu_d(j,:));
        end        
        [~,index]=min(tmp_distance);
        pattarn(i)=index;
        distance(i)=tmp_distance(index);        
%         norm(mu_d,2)
    end
    for k=1:4
        st_pa(k,:)=mean(sum_Mat(pattarn==k,1:8));%更新質心
    end
    if  norm(pre_pa-st_pa,2)<2
        break;
    end
end

predict=zeros(819,1);
for i=1:819
    d_t=zeros(1,4);
    for k=1:4
        d_t(k)=norm(unknown(i,1:8)-st_pa(k,:));
    end
    [~,id]=min(d_t);
    predict(i)=id;
end
predict-unknown(:,9)
% disp(pattarn)
% max(histc(pattarn(1:2924),1:4))
[~,md1]= max(histc(pattarn(1:2924),1:4));
[~,md2]= max(histc(pattarn(2925:5294),1:4));
[~,md3]= max(histc(pattarn(5295:7767),1:4));
[~,md4]= max(histc(pattarn(7768:10583),1:4));
inde=[md1 md2 md3 md4];

% mapper=[1:4;[pattarn(1) pattarn(2925) pattarn(5275) pattarn(7748)]].';
% pattarn=pattarn(mapper);
% size(pattarn)
% pattarn(end-818:end,9)
% confuseMat=confusionmat(unknown(:,9),pattarn(end-818:end));
% accuracy=length(find([pattarn(end-818:end)]'==unknown(:,9)))/size(unknown,1);
accuracy=length(find(predict==unknown(:,9)))/size(unknown,1);
confuseMat=confusionmat(unknown(:,9),predict)

K=size(unknown,1);
Pe=sum(sum(confuseMat,2).*diag(confuseMat))/K^2;
Kappar=(accuracy-Pe)/(1-Pe);
% ConMat=confusionmat(unknown(:,9),sort_result);
% disp(ConMat)

這裡分了兩種情況,因為這裡的資料都是標籤已知的,因此評定標準是準確率,一種未將測試集加入訓練樣本中,另一種將訓練集也作為樣本的一部分進行聚類,實際中,聚類分析更可能是後一種情況,而評價Kmeans分類好壞的測度,也不是準確率而是Jaccard、DBI指數等。
留作筆記。