MATLAB中利用支持向量机SVM做图像分类的代码(包括GS_LIBSVM,GA_LIBSVM)

%这几个做图像分类的代码都是自己调试好可以用的,只需要改改参数就行。



%这里的SVM用的是MATLAB中自带的多分类工具fitcecoc函数,
function [classifer,predictIndex,accuracy] = SVM_Classify(trainFeatures,trainLabels,testFeatures,testLabels)
%SVM分类器

classifer = fitcecoc(trainFeatures,trainLabels);

[predictIndex,~] = predict(classifer,testFeatures);
% accuracy = length(find(predictIndex==testLabels))/(length(predictIndex)) * 100;
% predictedLabels_test = predict(classifer, testFeatures);
% predictedLabels_train = predict(classifer, trainFeatures);
accuracy = length(find(predictIndex==testLabels))/length(testLabels);
end







%GS_LIBSVM记得先下载LIBSVM的工具包,随便一搜就有,将他放在你要运行的程序文件夹里就可以直接用了

function [ predict_label,accuracy ] = GS_LIBSVM_Classify(trainFeatures,trainLabels,testFeatures,testLabels)

%%libsvm分类
train=trainFeatures; %选取训练数据
train_group=trainLabels;%选取训练数据类别标识
test=testFeatures;%选取测试数据
test_group=testLabels; %选取测试数据类别标识
 
%寻找最优c和g
%粗略选择:c&g 的变化范围是 2^(-10),2^(-9),...,2^(10)
% [bestacc,bestc,bestg] = SVMcgForClass(train_group,train,-10,10);
%精细选择:c 的变化范围是 2^(-2),2^(-1.5),...,2^(4), g 的变化范围是 2^(-4),2^(-3.5),...,2^(4)
[bestacc,bestc,bestg] = SVMcgForClass(train_group,train,-2,4,-4,4,3,0.5,0.5,0.9);
 
% 训练模型
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model=libsvmtrain(train_group,train,cmd);
disp(cmd);
 
% 测试分类
[predict_label, accuracy, dec_values]=libsvmpredict(test_group,test,model);
 
% 打印测试分类结果
figure;
hold on;
plot(test_group,'o');
plot(predict_label,'r*');
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',10);
end






%GA_LIBSVM


%% type == 3 for regression
%% type == 1 for classfication
function [BestMSE,Bestc,Bestg,ga_option] = GA_LIBSVM_Classify(train_label,train_data,type,ga_option)

%% Parameter Initialization
if nargin == 3
    ga_option = struct('maxgen',100,'sizepop',50,'ggap',0.9,...
        'cbound',[0,100],'gbound',[0,100],'v',5);
end

%% maxgen:Maximum Envolved Generation, Default 200, Usual Value Range [100,500]
%% sizepop: Maximum populattion of Sworm, Default 20, Usual Value range [20,100]
%% cbound = [cmin,cmax], Parameter c Value Range, Default (0,100)
%% gbound = [gmin,gmax], Parameter g Value Range, Default (0,100)
%% v:SVM Cross Validation parameter, defacult 5
%% NIND: number of individuals(chrom)
%% 
MAXGEN = ga_option.maxgen;
NIND = ga_option.sizepop;
NVAR = 2;
PRECI = 20;
GGAP = ga_option.ggap;
trace = zeros(MAXGEN,2);

%%fieldD=[len;lb;ub;code;scale;lbin;ubin]
%%len:binary code length of each value(gene)
%%lb: the upper boundary of value 
%%ub: the lower boundary of value 
%%code: coding method of each value  1:standard binary coding   0: binary Gray coding 
%%scale: 1:log scale    0:arithmatic scale 
%%lbin&ubin: 1:include the value at the boundary of range    0:not include

%%stategy:standard binary code; arithmatic scale; first gene only cover lower boundary,second include both
FieldID = ...
[rep([PRECI],[1,NVAR]);[ga_option.cbound(1),ga_option.gbound(1);ga_option.cbound(2),ga_option.gbound(2)];...
  [1,1;0,0;0,1;1,1]];

%% crtbp(nind,lind,basevec)   creates a binary population of given size and structure
%% nind:number of individuals(chromosomes); lind: number of value(gene) in each chromosome
%% crtbp(nind,lind)  default: each value(gene) is 0 or 1;
Chrom = crtbp(NIND,NVAR*PRECI);

gen = 1;
v = ga_option.v;
BestMSE = inf;
Bestc = 0;
Bestg = 0;

%% 
cg = bs2rv(Chrom,FieldID);

for nind = 1:NIND
    cmd = ['-v ',num2str(v),' -c ',num2str(cg(nind,1)),' -g ',num2str(cg(nind,2)),' -s ',num2str(type),' -p 0.01'];
    ObjV(nind,1) = libsvmtrain(train_label,train_data,cmd);
end
[BestMSE,I] = min(ObjV);  %% return the BestMSE and corresponding Column
Bestc = cg(I,1);
Bestg = cg(I,2);

%%
while 1  
    FitnV = ranking(ObjV);
    
    SelCh = select('sus',Chrom,FitnV,GGAP);
    SelCh = recombin('xovsp',SelCh,0.7);
    SelCh = mut(SelCh);
    
    cg = bs2rv(SelCh,FieldID);
    for nind = 1:size(SelCh,1)
        cmd = ['-v ',num2str(v),' -c ',num2str(cg(nind,1)),' -g ',num2str(cg(nind,2)),' -s ', num2str(type),' -p 0.01'];
        ObjVSel(nind,1) = libsvmtrain(train_label,train_data,cmd);
    end
    
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);   
    
    [NewBestCVaccuracy,I] = min(ObjV);
    cg_temp = bs2rv(Chrom,FieldID);
    temp_NewBestCVaccuracy = NewBestCVaccuracy;
    
    if NewBestCVaccuracy < BestMSE
       BestMSE = NewBestCVaccuracy;
       Bestc = cg_temp(I,1);
       Bestg = cg_temp(I,2);
    end
    
    if abs( NewBestCVaccuracy-BestMSE ) <= 10^(-2) && ...
        cg_temp(I,1) < Bestc
       BestMSE = NewBestCVaccuracy;
       Bestc = cg_temp(I,1);
       Bestg = cg_temp(I,2);
    end    
    
    trace(gen,1) = min(ObjV);
    trace(gen,2) = sum(ObjV)/length(ObjV);

    
    if gen >= MAXGEN/2 && ...
       ( temp_NewBestCVaccuracy-BestMSE ) <= 10^(-2)
        break;
    end
    
    if gen == MAXGEN
        break;
    end
    gen = gen + 1;
end

%%
figure;
hold on;
trace = round(trace*10000)/10000;
plot(trace(1:gen,1),'r*-','LineWidth',1);
plot(trace(1:gen,2),'o-','LineWidth',1);
legend('Best','Average');
xlabel('Generation','FontSize',10);
ylabel('Fitness Value','FontSize',10);
grid on;
axis auto;

line1 = 'Genetic Algorithm';
%line2 = ['terminal generation = ',num2str(gen)];
line2 = ['Minimum MSE=',num2str(BestMSE)];
line3 = ['Optimized c=',num2str(Bestc),' Optimized g=',num2str(Bestg)];
title({line1;line2;line3},'FontSize',11);
hold off;


%{
figure;
hold on;
plot(ranking(trace(1:gen,1)),'y+','LineWidth',1.2);
xlabel('Evolutionary Process','FontSize',10);
ylabel('Fitness','FontSize',10);
grid on;
%}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用MATLAB进行支持向量机SVM)的遥感图像分类,可以按照以下步骤进行: 1. 数据预处理:在进行分类之前,首先需要对遥感图像数据进行预处理。这包括读取图像文件、裁剪图像区域(如果需要)和提取图像特征等。 2. 特征提取:根据遥感图像的特点,选择适当的特征提取方法。常用的特征包括灰度直方图、梯度直方图、纹理特征等。通过MATLAB提供的图像处理工具箱的函数,可以方便地提取这些特征。 3. 数据准备:将特征向量和对应的类别标签整理成训练数据集和测试数据集。训练数据集用于训练SVM模型,而测试数据集用于评估模型的性能。 4. 训练SVM模型:使用MATLABSVM函数,例如fitcsvm或fitcecoc,对训练数据集进行训练。可以根据具体的分类任务和问题进行参数的调整,包括核函数的选择、惩罚参数C的设置等。 5. 模型评估:使用测试数据集对训练好的SVM模型进行评估。可以通过计算分类准确率、精确率、召回率等指标来评估模型的性能。 6. 可视化结果:根据需要,使用MATLAB绘图函数,如scatter和imshow等,将分类结果可视化显示。 整个过程MATLAB提供了丰富的函数和工具箱,可大大简化支持向量机的实现过程。根据具体的遥感图像分类问题,需要灵活运用MATLAB的相关函数和算法,进行代码的编写和调试。 以上是一个简要的回答,如果需要更加详细和具体的代码示例,可以提供更多相关信息,以便更好地指导编写。 ### 回答2: 遥感图像分类是遥感科学的重要任务之一,支持向量机(Support Vector Machine, SVM)是常用的分类算法之一。下面是用MATLAB编写的遥感图像分类SVM代码,步骤如下: 1. 加载遥感图像数据。使用MATLAB的imread函数读取遥感图像数据,将其转换成数据矩阵。 2. 准备训练样本数据和标签。根据具体的遥感图像分类任务,选择一部分图像作为训练样本,并为每个样本标注对应的类别。 3. 对样本数据进行预处理。根据具体的需求,对样本数据进行预处理操作,如特征提取、降维等。可以使用MATLAB图像处理工具箱和机器学习工具箱功能实现。 4. 训练SVM分类器。使用MATLAB的fitcsvm函数建立SVM分类器模型,将训练样本数据和标签作为输入。根据需要,可以设置SVM模型的参数,如核函数类型、惩罚系数等。 5. 对遥感图像进行分类预测。使用训练好的SVM分类器对未知的遥感图像数据进行分类预测。可以使用MATLAB的predict函数进行预测,并将预测结果保存下来。 6. 对分类结果进行评估。根据实际情况使用合适的评估指标(如准确率、召回率等)对分类结果进行评估,并记录评估结果。 这是一个简单的遥感图像分类SVM代码框架,具体实现还需要根据实际的数据和任务进行调整和优化。同时,还可以考虑其他的图像分类算法,如卷积神经网络(Convolutional Neural Network, CNN)等,以提高分类的准确性和鲁棒性。 ### 回答3: 使用MATLAB进行支持向量机SVM)的遥感图像分类,需要遵循以下步骤: 1. 数据准备:将遥感图像转换为可供分类的特征向量格式。可以选择提取常见的遥感特征,如纹理特征,颜色特征,形态特征等。将这些特征提取为特征向量,并将其与标签数据(即每个样本对应的类别)一起准备好。 2. 数据预处理:对特征向量进行预处理,例如归一化。这可以提高SVM分类器的性能。 3. 数据划分:将数据集划分为训练集和测试集,用于模型的训练和评估。 4. SVM模型的训练:使用MATLAB内置的svmtrain函数来训练SVM模型。需要指定SVM的参数,例如核函数类型(线性、多项式、径向基函数等)以及相应的参数(如多项式的阶数、径向基函数的宽度等)。 5. 模型的评估:使用测试集来评估SVM模型的分类性能。可以使用MATLAB内置的svmclassify函数来对测试集样本进行分类,并与真实标签进行比较。 6. 结果可视化:根据分类结果,可以使用MATLAB内置的图像处理和图像分割函数,将分类结果可视化在原始遥感图像上,以便进行结果的验证和可视化分析。 需要注意的是,SVM是一个强大的分类算法,但正确选择并优化参数对于模型性能至关重要。此外,对于大规模的遥感图像分类问题,可能需要考虑使用基于SVM的快速算法或分布式计算方法,以便更高效地进行分类任务。 总之,以上是使用MATLAB进行遥感图像分类的一般步骤。具体的代码实现可以根据具体任务和数据集的特点进行定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值