function [SN,CN,VN]=leaveout(pattern1)
nums0=0;
numgan=0;
result=0;
pattern_num=pattern1(1).num;
patternNum=pattern_num-1;
for ii=1:pattern_num*2
% a=34;
num=zeros(1,2);
%整理训练库和取待测样本
if ii<=pattern_num
if ii<pattern_num
pattern1(1).feature(:,[ii,pattern_num])=pattern1(1).feature(:,[pattern_num,ii]);%把ii pattern_num两个值对调
else
pattern1(1).feature(:,[1,pattern_num])=pattern1(1).feature(:,[pattern_num,1]); %把最开始的pattern_num换回来做sample,为何这个样本不训练了?
end
sample=pattern1(1).feature(:,pattern_num)';%取待测样本
x=[pattern1(2).feature(:,1:pattern_num) pattern1(1).feature(:,1:patternNum)];
%x=[pattern1(2).feature(:,1:patternNum) pattern1(1).feature(:,1:patternNum)]; %为何少一个样本:可能是保证正负样本数量一致,求平均值时不影响
y=ones(1,patternNum*2+1);
y(pattern_num+1:patternNum*2+1)=-1;
%进行两类支持向量机训练,结果保存在svmStruct结构中。
svmStruct(2,1)=svmtrain(x,y,'Kernel_Function','rbf','rbf_sigma',0.11);%阈值为何不用0.1
%支持向量机两类分类
G=svmclassify(svmStruct(2,1),sample);
if(G==1)
num(2)=num(2)+1;
elseif(G==-1)
num(1)=num(1)+1;
end
[max_val,max_pos]=max(num);%求最大值及其所在的列数,只有两列,第一列为-1样本,第二列为1样本
result=max_pos-1;%所以max_pos只有两个值,分别是1和2
if result== 0
nums0=nums0+1; %-1样本检测正确,无病的个数
end
elseif ii>=pattern_num
if ii<pattern_num*2
pattern1(2).feature(:,[ii-pattern_num,pattern_num])=pattern1(2).feature(:,[pattern_num,ii-pattern_num]);
else pattern1(2).feature(:,[1,pattern_num])=pattern1(2).feature(:,[pattern_num,1]);
end
sample=pattern1(2).feature(:,pattern_num)';%取待测样本
x=[pattern1(2).feature(:,1:patternNum) pattern1(1).feature(:,1:pattern_num)];
y=ones(1,patternNum*2+1);
y(pattern_num:patternNum*2+1)=-1;
%进行两类支持向量机训练,结果保存在svmStruct结构中。
svmStruct(2,1)=svmtrain(x,y,'Kernel_Function','rbf','rbf_sigma',0.11);
%支持向量机两类分类
G=svmclassify(svmStruct(2,1),sample);
if(G==1)
num(2)=num(2)+1;
elseif(G==-1)
num(1)=num(1)+1;
end
[max_val,max_pos]=max(num);
result=max_pos-1;
if result == 1
numgan=numgan+1;
end
end
end
SN=nums0/pattern_num;%-1样本诊断为-1样本的正确率
CN=numgan/pattern_num;%1样本诊断为1样本的正确率
VN=(SN+CN)/2;%平均正确率
accuracy=(nums0+numgan)/(pattern1(1).num+pattern1(2).num);
评论0