SVM非线性MATLAB实现

应用了高斯核

clear,没有画ROC曲线
tic
load('C:\Users\Administrator\Desktop\Cancer.mat')
mu=Cancer(1:444,:);zi=Cancer(445:end,:); %整理数据,第一列(1,2)作为标签
cycle_N=1; %进行cycle_N次交叉验证
N=10; %N=10十折
c=100;
[N1,col]=size(mu);
[N2,col]=size(zi);
q1=floor(N1/N);q2=floor(N2/N);
%ACC=zeros(1,10);MCC=zeros(1,10);F1=zeros(1,10);

%TP_ROC=zeros(1,10);FP_ROC=zeros(1,10);

for kk=1:cycle_N %进行NN次交叉训练
for k=1:N %每次交叉训练为N折
if k==1
pos_train=mu(q1+1:end,:);pos_test=mu(1:q1,:);
non_train=zi(q2+1:end,:);non_test=zi(1:q2,:);
elseif k==N
pos_train=mu(1:q1*(k-1),:);pos_test=mu(q1*(k-1)+1:end,:);
non_train=zi(1:q2*(k-1),:);non_test=zi(q2*(k-1)+1:end,:);
else
pos_train=[mu(1:q1*(k-1),:);mu(q1*k:end,:)];
non_train=[zi(1:q2*(k-1),:);zi(q2*k:end,:)];
pos_test=mu(q1*(k-1)+1:q1*k-1,:);
non_test=zi(q2*(k-1)+1:q2*k-1,:);
end
pos_train_r=size(pos_train,1);non_train_r=size(non_train,1); %计算正类负类训练集的行数
train=[pos_train;non_train]; %合并得到训练集
train_num=pos_train_r+non_train_r; %训练集的数据点数
y1=[ones(pos_train_r,1);-ones(non_train_r,1)];%训练点的标签

pos_test_r=size(pos_test,1);non_test_r=size(non_test,1);
test=[pos_test;non_test]; %合并得到测试集
test_num=pos_test_r+non_test_r; %测试集的数据点数
y2=[ones(pos_test_r,1);-ones(non_test_r,1)];%测试点的标签

%定义计算得核函数
K=zeros(train_num,train_num);
for i=1:train_num
for j=1:train_num
K(i,j)=exp(-(norm(train(i,:)-train(j,:),2)).^2/2); %逗号2是二范数
end
end
Q=diag(y1)*K*diag(y1);
f=-ones(train_num,1);
Aeq=y1'; %给一系列输入值赋值
beq=0;
vlb=zeros(train_num,1);vub=c*ones(train_num,1);
alpha=quadprog(Q,f,[],[],Aeq,beq,vlb,vub); %二次规划求解结束

%w=alpha'*diag(y1)*train; %在核中一并计算
for i=1:train_num
if (alpha(i)>0 && alpha(i)<vub(i))
b=y1(i)-alpha'*diag(y1)*K(:,i); %计算b的一种方法
break;
end
end

%测试
for i=1:train_num
for j=1:test_num
K(i,j)=exp(-(norm(train(i,:)-test(j,:),2)).^2/2);
end
end
count=0;%TP=0;TN=0;FP=0;FN=0;
pre_Y=sign(alpha'*diag(y1)*K+b);%预测标签
for i=1:test_num
if pre_Y(i)==y2(i)
count=count+1;
% if y2(i)==1
% TP=TP+1;
% else
% TN=TN+1;
% end
% else
% if y2(i)==1
% FP=FP+1;
% else
% FN=FN+1;
% end
end
end
%TP_ROC(k)=TP;FP_ROC(k)=FP;
% ACC(k)=(TP+TN)/(TP+TN+FN+FP);
% MCC(k)=(TP*TN-FP*FN)/sqrt((TP+FP)*(TP+FN)*(TN+FP)*(TN+FN));
% F1(k)=2*TP/(2*TP+FP+FN);
pre_right(k)=count/test_num;
disp(pre_right(k));
end
P=mean(pre_right);
end
disp('十折交叉的平均正确率为:');
disp(P);
%plot(FP_ROC,TP_ROC,'r->');

猜你喜欢

转载自www.cnblogs.com/xiaoxuexue/p/12162402.html