function [output]=static_SVM_line_mean_var(stacon,nconn)
%% estimating classified accuracy with SVM
clc;
nSubjs=size(stacon,2);
Con_MDD=stacon;%6672*38
%a=zeros(1,nconn);
%co_Index=zeros(nconn,nSubjs);%30个特征集的肯德尔等级相关系数的排序序号
lab=Con_MDD(6671,:);
best=zeros(nSubjs,4);
addpath('D:\Software\libsvm-3.12\matlab');
d=1;
feature=10:10:1000;
output=cell(length(feature),2);
for num_feature=feature
for r=1:nSubjs
Con_MDD_test=Con_MDD(:,r);
Con_MDD_train=Con_MDD(:,setdiff(1:nSubjs,r));
MDD=Con_MDD_train(:,find(Con_MDD_train(6671,:)==1));
Con=Con_MDD_train(:,find(Con_MDD_train(6671,:)==-1));
train_label=Con_MDD_train(6671,:)';
test_label=Con_MDD_test(6671,:);
%% 根据均值和方差进行特征选择
[train_data,test_data]=feature_mean_var(Con_MDD_train,Con_MDD_test,Con,MDD,nconn,num_feature);
%% 参数寻优
option = struct('s',0,'t',0,'cmin',-14,'cmax',0,'w1min',-2,'w1max',4, ...%w1表示病人,w2表示正常人
'w2min',-2,'w2max',4,'gmin',-14,'gmax',0,'v',37,'cstep',0.5,'gstep',0.5,'w1step',0.5,'w2step',0.5);
%[bestacc,bestc,bestg,bestw1,bestw2]=wangge_SVMcgForClass(train_label,train_data,option);
[bestacc,bestc,bestw1,bestw2,cg]=SVMcw_line(train_label,train_data,option);
best(r,:)=[bestacc,bestc,bestw1,bestw2];
%% 进行预测
cmd_temp = ['-s ',num2str(option.s),' -t ',num2str(option.t),' -c ',num2str( bestc ),' -w1 ',num2str(bestw1),' -w-1 ',num2str(bestw2)];
model=svmtrain(train_label,train_data, cmd_temp);
[pred_lab(r),accuracy,dec_valued]=svmpredict(test_label,test_data,model);
disp(['num_feature=',num2str(num_feature),' 第',num2str(r),'次循环']);
end
label=[lab;pred_lab];
matr=zeros(2,2);
for i=1:length(lab)
matr(lab(i)/2+3/2,pred_lab(i)/2+3/2)=matr(lab(i)/2+3/2,pred_lab(i)/2+3/2)+1;
end
right=[matr(1,1),matr(2,2)];
accuracy=sum(diag(matr))/sum(sum(matr));
output{d,1}=[num_feature,accuracy,right];
output{d,2}=best;
d=d+1;
end
rmpath('D:\Software\libsvm-3.12\matlab');
end
function [train_data,test_data]=feature_mean_var(Con_MDD_train,Con_MDD_test,Con,MDD,nconn,num_feature)
%% 通过基于均值和方差的比较来进行特征选择
Con_data=Con';%person*feature
MDD_data=MDD';
n1=size(Con_data,1);%正常人的样本数
n2=size(MDD_data,1);%病人的样本数
%计算各个特征的方差和
S=(var(Con_data)/n1+var(MDD_data)/n2).^0.5;
%计算各个特征的重要性
Con_mean=mean(Con_data,1);
MDD_mean=mean(MDD_data,1);
for i=1:nconn
F(i)=abs(Con_mean(i)-MDD_mean(i))/S(i);
end
[f,Index]=sort(F,'descend');
train_data=Con_MDD_train(Index(1:num_feature),:)';
test_data=Con_MDD_test(Index(1:num_feature),:)';
end
function [bestacc,bestc,bestw1,bestw2,cg]=SVMcw_line(train_label,train_data,option)
%网格参数寻优函数(分类问题):SVMcgForClass
%输入:
%train_label:训练集的标签,格式要求与svmtrain相同。
%train:训练集,格式要求与svmtrain相同。
%cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
%gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
%v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
%cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
%accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
%输出:
%bestCVaccuracy:最终CV意义下的最佳分类准确率。
%bestc:最佳的参数c。
%bestg:最佳的参数g。
%% X:c A:w1 B;w2 cg:CVaccuracy
train=train_data;
X=option.cmin:option.cstep:option.cmax;
[A,B] =meshgrid(option.w1min:option.w1step:option.w1max,...
option.w2min:option.w2step:option.w2max);%产生网格矩阵
[m,n] =size(A);
%[X,Y] =meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);%产生网格矩阵
%[m,n] =size(X);
cg=cell(length(X),1);
c_g =zeros(m,n);
eps = 10^(-4);
d=1;
%% record acc with different c & w,and find the bestacc with the smallest c
bestc = 1;
%bestg = 0.1;
bestacc = 0;
basenum = 2;
bestw1=1;
bestw2=0.5;
for t=X
for i = 1:m
for j = 1:n
cmd = ['-s ',num2str(option.s),' -t ',num2str(option.t),' -v ',num2str(option.v),' -c ',num2str( basenum^t ),...
' -w1 ',num2str( basenum^A(i,j) ),' -w-1 ',num2str( basenum^B(i,j) )];
c_g(i,j) = svmtrain(train_label, train, cmd);
if c_g(i,j) <= 65
continue;
end
if c_g(i,j) > bestacc
bestacc = c_g(i,j);
bestc = basenum^t;
%bestg = basenum^Y(i,j);
bestw1=basenum^A(i,j);
bestw2=basenum^B(i,j);
end
if abs( c_g(i,j)-bestacc )<=eps && bestc > basenum^t
bestacc = c_g(i,j);
bestc = basenum^t;
%bestg = basenum^Y(i,j);
bestw1=basenum^A(i,j);
bestw2=basenum^B(i,j);
end
end
end
cg{d}=c_g;
d=d+1;
end
end
评论1