⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rl_libsvm_iris.m

📁 matlab编写的SVM分类器源代码
💻 M
字号:
close all  
clear all 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%准备样本%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
load iris.dat  %全部样本保存在pima_indians_diabetes_data矩阵当中
[m,n]=size(iris);
label=iris(:,n);%对应的标签存在label中
data=iris(:,1:n-1);%data存放数据
data=Scale(data);%预处理
setosa=data(1:50,:);
label_setosa=label(1:50,1);
versicolor=data(51:100,:);
label_versicolor=label(51:100,1);
order=randperm(50);
rnum=order(:,1:3);
normalL=setosa(rnum,:);
label_normalL=label_setosa(rnum,:);
unnormalL=versicolor(rnum,:);
label_unnormalL=label_versicolor(rnum,:);
setosa(rnum,:)=[];
label_setosa(rnum,:)=[];
versicolor(rnum,:)=[];
label_versicolor(rnum,:)=[];
data=[];
label=[];
data=[setosa;versicolor];
label=[label_setosa;label_versicolor];
[m,n]=size(data);
order=randperm(m)';
data=data(order,:);
label=label(order,:);

%未标注样本集UL及其标签label_UL,占剩余样本的80%
row_UL=round(m*0.8);
max_row_UL=row_UL;
UL=zeros(row_UL,n);
UL=data(1:row_UL,:);
label_UL=zeros(row_UL,1);
label_UL=label(1:row_UL,:);

%测试集testdata及其标签label_testdata,占剩余样本的20%
testdata=zeros(m-row_UL,n);
testdata=data(((row_UL+1):m),:);
label_testdata=zeros(m-row_UL,1);
label_testdata=label(((row_UL+1):m),:);
[row_testdata,n]=size(testdata);
%%%%%%%以上准备好了所有需要的数据集及其标签,L、UL、testdata和它们的标签%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%开始训练、采样、分类%%%%%%%%%%%%%%%%
s=0;tt=2;d=3;bestg=1/4;r=0;bestc=1;nn=0.5;p=0.1;mm=100;e=0.001;h=1;b=0;wi=1;v=10;
Accuracy=0.05;%初始化Accuracy,赋个很小的非零值即可
number=1;%number用来保存主动学习次数
while Accuracy<0.95 

[row_normalL,n]=size(normalL);    
[row_unnormalL,n]=size(unnormalL);  
L=[normalL;unnormalL];%准备好svm所需的数据格式
label_L=[label_normalL;label_unnormalL];

bestcv = 0;
for log2c = -1:3,
  for log2g = -4:1,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(label_L,L,cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
    fprintf('%g %g %g (best c=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
  end
end

para=[s tt d bestg r bestc nn p mm e h b wi v];
model=svmtrain(label_L,L,para);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
[row_UL,n]=size(UL);
if row_UL~=0
ran_num=ceil(row_UL*rand(1));
newL=UL(ran_num,:);%随机选取一个样本
newlabel=label_UL(ran_num,:);
if label_UL(ran_num,:)==1
    normalL=[normalL;newL];
    label_normalL=[label_normalL;newlabel];
    biaoji=1;%为最后的一小段程序做个标记
else unnormalL=[unnormalL;newL];
    label_unnormalL=[label_unnormalL;newlabel];
    biaoji=0;
end
temp_UL=UL;%若最后采样的样本未被利用,则最后将这个样本还回UL
temp_label_UL=label_UL;
UL(ran_num,:)=[];
label_UL(ran_num,:)=[];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%对测试样本集testdata进行分类%%%%%%%%%%%%%%%%%%%%%%%%%%
[predict_label,accuracy]=svmpredict(label_testdata,testdata,model);
%%%%%%%%%%比较预测分类与实际分类的差异%%%%%%%%%%%
num=0;
for i=1:row_testdata
    if predict_label(i,1)==label_testdata(i,1)
        num=num+1;
    end
end
%%%%%%分类正确率%%%%%%%
Accuracy(number,1)=num/row_testdata;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
number=number+1;%始终让number比主动学习次数大2
if number==max_row_UL+2
    break;%若将所有训练样本训练完都达不到期望的正确率,则主动退出循环
end

end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%分类结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%结果显示%%%%%%%%%%%%%%%%%
Accuracy
number=number-2   %number用来保存主动学习次数
x=0:1:number;
plot(x,Accuracy,'-r.')
xlabel('Number of samples selected for random sampling');
ylabel('Accuracy');
title('Learning curve on iris');

if row_UL~=0
    UL=temp_UL;%最后一次选出没利用的样本再放回UL
    label_UL=temp_label_UL;
    if biaoji==1
       normalL(row_normalL+1,:)=[];%若未利用完UL中的所有样本即满足要求,将最后加到L中的而未被利用的新样本去掉
       label_normalL(row_normalL+1,:)=[];%同理
    else unnormalL(row_unnormalL+1,:)=[];
         label_unnormalL(row_unnormalL+1,:)=[];
    end
end
%%%%%%%%%%%%%%%%%%%%%%程序结束%%%%%%%%%%%%%%%%%%%%%%%%%   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -