基于遥感图像光谱通道的地物分类(Matlab)

参考博客基于遥感图像光谱通道的地物分类(Matlab)_AMissingWolf的博客-CSDN博客_高光谱遥感影像分类matlab

由于博主将主程序分成了好几部分,我将这一部分拼起来,并进行了代码补全。

大家在跑代码时,先将参考博客里面的代码复制完全,如下实例

 

在使用原博主的代码时运行法2会遇到一个问题,就是得到的结果精度不够,是因为使用我使用的贡献值为0.8,此时PCA计算的有效数据维度是3,103维度的数据只选了3个维度,得到的数据结果会不是很准确,一种方法,将特征值排序改成升序,
[special,line]=Reorder(spe,1);变成[special,line]=Reorder(spe,2);

只是修改了一下排序方法,评论区有人问我数据的维度,cal才是数据选取的维度。

 

我这样修改后就相当与PCA没有进行数据降维,即贡献值最终为1,没有降维的法2精度结果最好。更好的做法还是按照原博主那样使用降序排序方法更好,或者你也可以直接将贡献值改成1,经过测试,paviaU数据集特征值按照降序排序,贡献值取0.8时,PCA只取了3维数据,当贡献值为0.999时,PCA取了15维数据

load PaviaU加载数据集后会得到一个610x340x103的double变量paviaU,可以用u*v*w来表示,其中u,v是变量paviaU的横纵坐标,w是变量paviaU的光谱数据,有103个变量;

load PaviaU_gt加载数据集后会得到一个610x340x1的double变量paviaU_gt,可以用u*v*w来表示,其中u,v是变量paviaU_gt的横纵坐标,w是变量paviaU_gt的地图类型,值为0-9;

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcmpzd3NxMTk5OA==,size_14,color_FFFFFF,t_70,g_se,x_16

 1-9分别表示沥青路-阴影,0表示没有进行分类的数据

变量paviaU和paviaU_gt中的坐标一一对应,paviaU中w是光谱数据,paviaU_gt中w是其地图类型,光谱数据与地图类型一一对应

-----------------------------------------------------------------------------------------------------------------------------

法1--利用原始高维的光谱特征作为影像特征,进行影像分类;

数据预处理+中间数据处理(即SVM分类)+结果显示;

其中[train,test,kind]=Assort(data,mark,0.1)的0.1表示每类选择10%的样本用于分类器训练

5%就改成0.05,15%就改成0.15

数据下载地址Hyperspectral Remote Sensing Scenes - Grupo de Inteligencia Computacional (GIC)

本程序运行时间会比较长,慢慢等结果

主函数程序

clear;clc;
%%----------------
%数据加载
load PaviaU;
load PaviaU_gt;
aim = paviaU;
biaoqian = paviaU_gt;
%%-----------------
%数据预处理
[u,v,w]=size(aim);
num=0;%定义已知的样本数量
num1=0;%定义待确定的样本数量
for i=1:u   %循环求出总的样本数量
    for j=1:v
        if biaoqian(i,j)~=0
            num=num+1;
        elseif biaoqian(i,j)==0
            num1=num1+1;
        end
    end
end
data=zeros(num,w);%定义已知数据矩阵
mark=zeros(num,1);%定义已知数据标签矩阵
data1=zeros(num1,w);%定义未知数据矩阵
mark1=zeros(num1,1);%定义未知数据标签矩阵
station=zeros(num,2);%定义已知数据坐标矩阵
station1=zeros(num1,2);%定义未知数据坐标矩阵
%定义颜色矩阵
color=[0,0,255;0,255,0;255,0,0;255,255,0;255,10,155;80,116,189;148,140,82;144,238,144;231,100,55]/255;
t=0;%定义中间序号
t1=0;
for i=1:u
    for j=1:v
        if biaoqian(i,j)~=0
            t=t+1;
            data(t,:)=aim(i,j,:);
            mark(t,1)=biaoqian(i,j);
            station(t,1)=i;
            station(t,2)=j;
        elseif biaoqian(i,j)==0
            t1=t1+1;
            data1(t1,:)=aim(i,j,:);
            mark1(t1,1)=0;
            station1(t1,1)=i;
            station1(t1,2)=j;
        end
    end
end;
%%---------------
%数据中间处理,即分类
[train,test,kind]=Assort(data,mark,0.1);
[percent1,percent2,kappa1,kappa2,model]=Svmdealwith(train,test,kind);
%%----------------
%结果显示
accuacy1=percent1;%将精度矩阵按照样本标签重新排列
accuacy2=percent2;
zhong=size(kind,1);%获得总的标签种类
for i=1:zhong
    j=Nummatching(i,kind);
    accuacy1(i,2)=percent1(j,2);
    accuacy2(i,2)=percent2(j,2);
end
fprintf('\n下面是训练模型训练集精度矩阵\n');
disp(accuacy1);
fprintf('\n训练集Kappa系数为:');
disp(kappa1);
fprintf('\n下面是训练模型测试集精度矩阵\n');
disp(accuacy2);
fprintf('\n测试集Kappa系数为:');
disp(kappa2);
testanswer=svmpredict(mark1,data1,model);%调用模型进行标签预测
mark1=testanswer;%获得未知样本的标签序号
for i=1:num1  %将未知样本的标签序号转换为标签
    mark1(i,1)=kind(mark1(i,1),1);
end
R=zeros(u,v);%定义合成的图像图层
G=zeros(u,v);
B=zeros(u,v);
for i=1:num %先给已知样本像素点赋色
    R(station(i,1),station(i,2))=color(mark(i,1),1);
    G(station(i,1),station(i,2))=color(mark(i,1),2);
    B(station(i,1),station(i,2))=color(mark(i,1),3);
end
for i=1:num1 %再给未知样本像素点赋为背景白色
    R(station1(i,1),station1(i,2))=1;
    G(station1(i,1),station1(i,2))=1;
    B(station1(i,1),station1(i,2))=1;
end
figure(1);
picimg1=cat(3,R,G,B);
imshow(picimg1);
%imwrite(picimg1,'testpic2.jpg');%将绘制结果输出
title('测试集像素分类结果');
for i=1:num1 %再给未知样本像素点赋色
    R(station1(i,1),station1(i,2))=color(mark1(i,1),1);
    G(station1(i,1),station1(i,2))=color(mark1(i,1),2);
    B(station1(i,1),station1(i,2))=color(mark1(i,1),3);
end
figure(2);
picimg=cat(3,R,G,B);
imshow(picimg);
%imwrite(picimg,'answerpic2.jpg');%将绘制结果输出
title('总体像素分类结果');
figure(3);%单独画出地物标注图像
diwu={'沥青路','草地','沙砾','树木','金属板','裸土地','柏油房','砖块','阴影'};
%diwu={'河水','树木','草地','砖块','裸土地','沥青路','柏油房','瓦片','阴影'};
yanse=zeros(1,zhong);
xloca=[0,1,1,0];
for i=1:zhong
    yloca=[i-1,i-1,i,i];
    yanse(1,i)=fill(xloca,yloca,color(i,:));
    hold on;
end
hold off;
legend(yanse,diwu,'Location','northeastoutside');
set(gcf,'position',[100,360,200,400]);
title('颜色分类标注');
 

法2--利用PCA降维方法对原始高维光谱特征进行降维,然后利用降维后的光谱特征进行影像分类;

主程序代码:

clear;clc;
%%----------------
%数据加载
load PaviaU;
load PaviaU_gt;
aim = paviaU;
biaoqian = paviaU_gt;
%%-----------------
%数据预处理
[u,v,w]=size(aim);
num=0;%定义已知的样本数量
num1=0;%定义待确定的样本数量
for i=1:u   %循环求出总的样本数量
    for j=1:v
        if biaoqian(i,j)~=0
            num=num+1;
        elseif biaoqian(i,j)==0
            num1=num1+1;
        end
    end
end
data=zeros(num,w);%定义已知数据矩阵
mark=zeros(num,1);%定义已知数据标签矩阵
data1=zeros(num1,w);%定义未知数据矩阵
mark1=zeros(num1,1);%定义未知数据标签矩阵
station=zeros(num,2);%定义已知数据坐标矩阵
station1=zeros(num1,2);%定义未知数据坐标矩阵
%定义颜色矩阵
color=[0,0,255;0,255,0;255,0,0;255,255,0;255,10,155;80,116,189;148,140,82;144,238,144;231,100,55]/255;
t=0;%定义中间序号
t1=0;
for i=1:u
    for j=1:v
        if biaoqian(i,j)~=0
            t=t+1;
            data(t,:)=aim(i,j,:);
            mark(t,1)=biaoqian(i,j);
            station(t,1)=i;
            station(t,2)=j;
        elseif biaoqian(i,j)==0
            t1=t1+1;
            data1(t1,:)=aim(i,j,:);
            mark1(t1,1)=0;
            station1(t1,1)=i;
            station1(t1,2)=j;
        end
    end
end


%%---------------
%数据中间处理,即分类
sumdata=[data;data1];%将所有的样本综合起来
gongxian=1;
[answer,~]=Maincomonent(sumdata,gongxian);%获取贡献率得到的主成分分析变化矩阵
datas=(answer*data')';%获得主成分分析法变化得到的已知样本数据
datas1=(answer*data1')';%获得主成分分析法变化得到的未知样本数据
[train,test,kind] = Assort(datas,mark,0.1);%分离出训练集train与测试集test
[percent1,percent2,kappa1,kappa2,model]=Svmdealwith2(train,test,kind);

%%----------------
%结果显示
accuacy1=percent1;%将精度矩阵按照样本标签重新排列
accuacy2=percent2;
zhong=size(kind,1);%获得总的标签种类
for i=1:zhong
    j=Nummatching(i,kind);
    accuacy1(i,2)=percent1(j,2);
    accuacy2(i,2)=percent2(j,2);
end
fprintf('\n下面是训练模型训练集精度矩阵\n');
disp(accuacy1);
fprintf('\n训练集Kappa系数为:');
disp(kappa1);
fprintf('\n下面是训练模型测试集精度矩阵\n');
disp(accuacy2);
fprintf('\n测试集Kappa系数为:');
disp(kappa2);
testanswer=svmpredict(mark1,datas1,model);%调用模型进行标签预测
mark1=testanswer;%获得未知样本的标签序号
for i=1:num1  %将未知样本的标签序号转换为标签
    mark1(i,1)=kind(mark1(i,1),1);
end
R=zeros(u,v);%定义合成的图像图层
G=zeros(u,v);
B=zeros(u,v);
for i=1:num %先给已知样本像素点赋色
    R(station(i,1),station(i,2))=color(mark(i,1),1);
    G(station(i,1),station(i,2))=color(mark(i,1),2);
    B(station(i,1),station(i,2))=color(mark(i,1),3);
end
for i=1:num1 %再给未知样本像素点赋为背景白色
    R(station1(i,1),station1(i,2))=1;
    G(station1(i,1),station1(i,2))=1;
    B(station1(i,1),station1(i,2))=1;
end
figure(1);
picimg1=cat(3,R,G,B);
imshow(picimg1);
%imwrite(picimg1,'testpic2.jpg');%将绘制结果输出
title('测试集像素分类结果');
for i=1:num1 %再给未知样本像素点赋色
    R(station1(i,1),station1(i,2))=color(mark1(i,1),1);
    G(station1(i,1),station1(i,2))=color(mark1(i,1),2);
    B(station1(i,1),station1(i,2))=color(mark1(i,1),3);
end
figure(2);
picimg=cat(3,R,G,B);
imshow(picimg);
%imwrite(picimg,'answerpic2.jpg');%将绘制结果输出
title('总体像素分类结果');
figure(3);%单独画出地物标注图像
diwu={'沥青路','草地','沙砾','树木','金属板','裸土地','柏油房','砖块','阴影'};
%diwu={'河水','树木','草地','砖块','裸土地','沥青路','柏油房','瓦片','阴影'};
yanse=zeros(1,zhong);
xloca=[0,1,1,0];
for i=1:zhong
    yloca=[i-1,i-1,i,i];
    yanse(1,i)=fill(xloca,yloca,color(i,:));
    hold on;
end
hold off;
legend(yanse,diwu,'Location','northeastoutside');
set(gcf,'position',[100,360,200,400]);
title('颜色分类标注');
 


 

法3--在方法2)的基础上,加入局部窗口的均值和方差特征,进行影像分类;

主程序代码:

clear;clc;
%%----------------
%数据加载
load PaviaCenter;
load PaviaCenter_gt;
aim=ImgData;
biaoqian=gt;
%%-----------------
%数据预处理
[u,v,w]=size(aim);
yuanshidata=zeros(u*v,w);%用于储存总的数据
t=0;
for i=1:u
    for j=1:v
        t=t+1;
        yuanshidata(t,:)=aim(i,j,:);
    end
end
gongxian=0.999;
[answer,~]=Maincomonent(yuanshidata,gongxian);%获取贡献率得到的主成分分析变化矩阵
maindata=(answer*yuanshidata')';%获得主成分分析法变化得到的原始样本数据
datanum=size(maindata,2);%获得主成分分析法变化得到的数据维数
newgetdata=zeros(u,v,datanum);%建立新矩阵还原主成分分析法变化得到的数据
t=0;
for i=1:u
    for j=1:v
        t=t+1;
        newgetdata(i,j,:)=maindata(t,:);
    end
end
num=0;%定义已知的样本数量
num1=0;%定义待确定的样本数量
for i=1:u   %循环求出总的样本数量
    for j=1:v
        if biaoqian(i,j)~=0
            num=num+1;
        elseif biaoqian(i,j)==0
            num1=num1+1;
        end
    end
end
data=zeros(num,datanum*3);%定义已知数据矩阵
mark=zeros(num,1);%定义已知数据标签矩阵
data1=zeros(num1,datanum*3);%定义未知数据矩阵
mark1=zeros(num1,1);%定义未知数据标签矩阵
station=zeros(num,2);%定义已知数据坐标矩阵
station1=zeros(num1,2);%定义未知数据坐标矩阵
%定义颜色矩阵
color=[0,0,255;0,255,0;255,0,0;255,255,0;255,10,155;80,116,189;148,140,82;144,238,144;231,100,55]/255;
t=0;%定义中间序号
t1=0;
for i=1:u   %进行数据分类赋值
    for j=1:v
        if biaoqian(i,j)~=0
            t=t+1;
            data(t,1:datanum)=newgetdata(i,j,:);
            mark(t,1)=biaoqian(i,j);
            station(t,1)=i;
            station(t,2)=j;
        elseif biaoqian(i,j)==0
            t1=t1+1;
            data1(t1,1:datanum)=newgetdata(i,j,:);
            mark1(t1,1)=0;
            station1(t1,1)=i;
            station1(t1,2)=j;
        end
    end
end
bianjie=w/2;
for i=1:num   %对已知样本进行均值和方差计算
    for j=1:datanum
        s1=station(i,1)-bianjie;s2=station(i,1)+bianjie;%定义横轴方向坐标范围
        t1=station(i,2)-bianjie;t2=station(i,2)+bianjie;%定义纵轴方向坐标范围
        if s2>u  %判断是否超出边界
            s2=u;
        end
        if s1<1
            s1=1;
        end
        if t2>v  %判断是否超出边界
            t2=v;
        end
        if t1<1
            t1=1;
        end
        aimdata=zeros((s2-s1+1)*(t2-t1+1),1);%计算原始数据的均值与标准差
        deltanum=0;
        for p=s1:s2
            for q=t1:t2
                deltanum=deltanum+1;
                aimdata(deltanum,1)=newgetdata(p,q,j);
            end
        end
        data(i,datanum+j)=mean(aimdata);%均值赋值
        data(i,datanum*2+j)=std(aimdata);%标准差赋值
    end
end
for i=1:num1   %对未知样本进行均值和方差计算
    for j=1:datanum
        s1=station1(i,1)-bianjie;s2=station1(i,1)+bianjie;%定义横轴方向坐标范围
        t1=station1(i,2)-bianjie;t2=station1(i,2)+bianjie;%定义纵轴方向坐标范围
        if s2>u  %判断是否超出边界
            s2=u;
        end
        if s1<1
            s1=1;
        end
        if t2>v  %判断是否超出边界
            t2=v;
        end
        if t1<1
            t1=1;
        end
        aimdata=zeros((s2-s1+1)*(t2-t1+1),1);%计算原始数据的均值与标准差
        deltanum=0;
        for p=s1:s2
            for q=t1:t2
                deltanum=deltanum+1;
                aimdata(deltanum,1)=newgetdata(p,q,j);
            end
        end
        data1(i,datanum+j)=mean(aimdata);%均值赋值
        data1(i,datanum*2+j)=std(aimdata);%标准差赋值
    end
end
[train,test,kind] = Assort(data,mark,0.1);%分离出训练集train与测试集test
[percent1,percent2,kappa1,kappa2,model]=Svmdealwith(train,test,kind);%利用训练集train与测试集test对模型进行检测
accuacy1=percent1;%将精度矩阵按照样本标签重新排列
accuacy2=percent2;
zhong=size(kind,1);%获得总的标签种类
for i=1:zhong
    j=Nummatching(i,kind);
    accuacy1(i,2)=percent1(j,2);
    accuacy2(i,2)=percent2(j,2);
end
fprintf('\n下面是训练模型训练集精度矩阵\n');
disp(accuacy1);
fprintf('\n训练集Kappa系数为:');
disp(kappa1);
fprintf('\n下面是训练模型测试集精度矩阵\n');
disp(accuacy2);
fprintf('\n测试集Kappa系数为:');
disp(kappa2);
testanswer=svmpredict(mark1,data1,model);%调用模型进行标签预测
mark1=testanswer;%获得未知样本的标签序号
for i=1:num1  %将未知样本的标签序号转换为标签
    mark1(i,1)=kind(mark1(i,1),1);
end
R=zeros(u,v);%定义合成的图像图层
G=zeros(u,v);
B=zeros(u,v);
for i=1:num %先给已知样本像素点赋色
    R(station(i,1),station(i,2))=color(mark(i,1),1);
    G(station(i,1),station(i,2))=color(mark(i,1),2);
    B(station(i,1),station(i,2))=color(mark(i,1),3);
end
for i=1:num1 %再给未知样本像素点赋为背景白色
    R(station1(i,1),station1(i,2))=1;
    G(station1(i,1),station1(i,2))=1;
    B(station1(i,1),station1(i,2))=1;
end
figure(1);
picimg1=cat(3,R,G,B);
imshow(picimg1);
%imwrite(picimg1,'testpic2.jpg');%将绘制结果输出
title('测试集像素分类结果');
for i=1:num1 %再给未知样本像素点赋色
    R(station1(i,1),station1(i,2))=color(mark1(i,1),1);
    G(station1(i,1),station1(i,2))=color(mark1(i,1),2);
    B(station1(i,1),station1(i,2))=color(mark1(i,1),3);
end
figure(2);
picimg=cat(3,R,G,B);
imshow(picimg);
%imwrite(picimg,'answerpic2.jpg');%将绘制结果输出
title('总体像素分类结果');
figure(3);%单独画出地物标注图像
diwu={'沥青路','草地','沙砾','树木','金属板','裸土地','柏油房','砖块','阴影'};
%diwu={'河水','树木','草地','砖块','裸土地','沥青路','柏油房','瓦片','阴影'};
yanse=zeros(1,zhong);
xloca=[0,1,1,0];
for i=1:zhong
    yloca=[i-1,i-1,i,i];
    yanse(1,i)=fill(xloca,yloca,color(i,:));
    hold on;
end
hold off;
legend(yanse,diwu,'Location','northeastoutside');
set(gcf,'position',[100,360,200,400]);
title('颜色分类标注');

调参对实验结果的影响

代码Svmdealwith改用Svmdealwith2,这个代码会报错,报错了就表示运行结束了,只要Excel表格结果出来了就行,报错就结束代码从吴某某那里学到的

function [percent1,percent2,kappa1,kappa2,model] = Svmdealwith2(input1,input2,name)
[~,n]=size(input2);%获得样本的特征数量(n-1)
data=input1(:,1:n-1);%获得每个训练样本的特征值数据
feature1=input1(:,n);%获得每个训练样本的标签序号
test=input2(:,1:n-1);%获得每个测试样本的特征值数据
feature2=input2(:,n);%获得每个测试样本的标签序号
kind=size(name,1);%获得总的标签总数
cmd=('-t 1 -c 100');%函数类型可选参数,此处选择为线性核函数
model=svmtrain(feature1,data,cmd);%获得训练的模型
%下面利用训练的模型进行精度检测
%训练集
[lei1,xu1]=Classify(feature1);%获得各类训练样本的标签序号数量特征
number=Chazhao(xu1);%获得各标签序号的数量
testmark=svmpredict(feature1,data,model);%检验模型正确率
accarcy=zeros(kind,2);%建立一个训练样本正确率统计矩阵
hunxiao1=zeros(kind,kind);%建立一个混淆矩阵用于计算Kappa系数
for i=1:kind  %依次将第一列赋值为标签序号
    accarcy(i,1)=i;
end   %依次将第二列赋值为分类正确的标签的数量
for i=1:size(data,1)
    if feature1(i,1)==testmark(i,1)
        accarcy(feature1(i,1),2)=accarcy(feature1(i,1),2)+1;
    end
    hunxiao1(feature1(i,1),testmark(i,1))=hunxiao1(feature1(i,1),testmark(i,1))+1;
end
for i=1:kind
    j=Nummatching(i,lei1);
    accarcy(i,2)=accarcy(i,2)/number(j,1);
end
p11=0;p21=0;
for i=1:kind
    p11=p11+hunxiao1(i,i);%计算对角线元素之和
    p21=p21+sum(hunxiao1(i,:))*sum(hunxiao1(:,i));
end
p31=p11/sum(number);
p41=p21/(sum(number)*sum(number));
kappa1=(p31-p41)/(1-p41);
percent1=accarcy;
%测试集
[lei2,xu2]=Classify(feature2);%获得各类测试样本的标签序号数量特征
number1=Chazhao(xu2);%获得各标签序号的数量
answer0=svmpredict(feature2,test,model);
answer=zeros(kind,2);%建立一个测试样本正确率统计矩阵
hunxiao2=zeros(kind,kind);%建立一个混淆矩阵用于计算Kappa系数
for i=1:kind
    answer(i,1)=i;
end
for i=1:size(test,1)
    if feature2(i,1)==answer0(i,1)
        answer(feature2(i,1),2)=answer(feature2(i,1),2)+1;
    end
    hunxiao2(feature2(i,1),answer0(i,1))=hunxiao2(feature2(i,1),answer0(i,1))+1;
end
for i=1:kind
    j=Nummatching(i,lei2);
    answer(i,2)=answer(i,2)/number1(j,1);
end
p12=0;p22=0;
for i=1:kind
    p12=p12+hunxiao2(i,i);%计算对角线元素之和
    p22=p22+sum(hunxiao2(i,:))*sum(hunxiao2(:,i));
end
p32=p12/sum(number1);
p42=p22/(sum(number1)*sum(number1));
kappa2=(p32-p42)/(1-p42);
percent2=answer;
%以下开始进行调参比较输出结果,并将输出结果输出为一个excel表格进行储存
str1='-t ';str2=' -c ';str3=' -g ';%定义三个参数前缀
shumu1=2;shumu2=180;shumu3=180;%定义三个参数的取值界限
excelshuchu=cell(shumu1*shumu2/30*shumu3/30+1,3+kind);%定义表格的表头
for i=1:kind
    excelshuchu(1,i+1)={['地物',num2str(i),'精度']};
end
excelshuchu(1,1)={'向量机参数值'};
excelshuchu(1,2+kind)={'总体精度'};
excelshuchu(1,3+kind)={'Kappa系数'};
hangshu=1;
for p=1:shumu1
    for q=30:50:shumu2
        for r=30:50:shumu3
            hangshu=hangshu+1;
            midaccarcy=zeros(kind,2);%建立一个训练样本正确率统计矩阵
            midhunxiao1=zeros(kind,kind);%建立一个混淆矩阵用于计算Kappa系数
            designexcel=cell(1,3+kind);%用于储存计算结果
            midcmd=[str1,num2str(p),str2,num2str(q),str3,num2str(r)];
            designexcel(1,1)={midcmd};
            midmodel=svmtrain(feature1,data,midcmd);%获得训练的模型
            [midtestmark,midpercent1,~]=svmpredict(feature1,data,midmodel);%检验模型正确率
            for i=1:kind  %依次将第一列赋值为标签序号
                 midaccarcy(i,1)=i;
            end   %依次将第二列赋值为分类正确的标签的数量
            for i=1:size(data,1)
                if feature1(i,1)==midtestmark(i,1)
                   midaccarcy(feature1(i,1),2)=midaccarcy(feature1(i,1),2)+1;
                end
                midhunxiao1(feature1(i,1),midtestmark(i,1))=midhunxiao1(feature1(i,1),midtestmark(i,1))+1;
            end
            for i=1:kind
                j=Nummatching(i,lei1);
                midaccarcy(i,2)=midaccarcy(i,2)/number(j,1);
            end
            p11=0;p21=0;
            for i=1:kind
                p11=p11+midhunxiao1(i,i);%计算对角线元素之和
                p21=p21+sum(midhunxiao1(i,:))*sum(midhunxiao1(:,i));
            end
            p31=p11/sum(number);
            p41=p21/(sum(number)*sum(number));
            midkappa1=(p31-p41)/(1-p41);%训练集Kappa系数
            %下面进行测试集数据统计
            [midanswer0,midpercent2,~]=svmpredict(feature2,test,midmodel);
            midanswer=zeros(kind,2);%建立一个测试样本正确率统计矩阵
            midhunxiao2=zeros(kind,kind);%建立一个混淆矩阵用于计算Kappa系数
            for i=1:kind
                midanswer(i,1)=i;
            end
            for i=1:size(test,1)
                if feature2(i,1)==midanswer0(i,1)
                   midanswer(feature2(i,1),2)=midanswer(feature2(i,1),2)+1;
                end
                midhunxiao2(feature2(i,1),midanswer0(i,1))=midhunxiao2(feature2(i,1),midanswer0(i,1))+1;
            end
            for i=1:kind
                j=Nummatching(i,lei2);
                midanswer(i,2)=midanswer(i,2)/number1(j,1);
            end
            p12=0;p22=0;
            for i=1:kind
                p12=p12+midhunxiao2(i,i);%计算对角线元素之和
                p22=p22+sum(midhunxiao2(i,:))*sum(midhunxiao2(:,i));
            end
            p32=p12/sum(number1);
            p42=p22/(sum(number1)*sum(number1));
            midkappa2=(p32-p42)/(1-p42);
            accuacy1=midaccarcy;%将精度矩阵按照样本标签重新排列
            accuacy2=midanswer;
            for i=1:kind
                j=Nummatching(i,name);
                accuacy1(i,2)=midaccarcy(j,2);
                accuacy2(i,2)=midanswer(j,2);
            end
            designexcel(1,kind+3)={[num2str(midkappa1),'//',num2str(midkappa2)]};
            designexcel(1,kind+2)={[num2str(midpercent1(1,1)),'//',num2str(midpercent2(1,1))]};
            for i=1:kind
                designexcel(1,i+1)={[num2str(accuacy1(i,2)),'//',num2str(accuacy2(i,2))]};
            end
            excelshuchu(hangshu,:)=designexcel;
        end
    end
end
xlswrite('参数改变比对表',excelshuchu);

  • 2
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值