一个监督学习(极大似然分类)与非监督学习(K-means)的例子(matlab实现)

上遥感原理与应用的时候,老师给我们大致讲了一下遥感图像的地物分类问题,大致了解了一下机器学习方法在遥感影像处理方面的应用问题。
下面将所做作业进行一个大致的总结:

数据

训练集一共四种: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 K a p p a r = p − p e 1 − p e
这里 p p 即为准确率, pe p e 是所有种类分类得到的和正确分类的乘积之和除以样本总量的平方。

参见

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 K − m e a n s 分类好坏的测度,也不是准确率而是Jaccard、DBI指数等。
留作笔记。

你可能感兴趣的:(算法)