function model = OvO_TSVM(label,data,c,ker,n_class)
% ‘一对一’Twin support vector machine 十交叉验证
% 输入:label:数据标签
% data:训练数据
% c:参数,可以是一个数,也可以以一个矩阵形式为每一个二分类器指定一组参数
% ker:核函数struct{'type',kernelType,['width',kernelparameter]}
% 'linear'线性核,‘gauss’高斯RBF核
% 输出:model:结构体,用作function [prel,accuracy] = OvOTSVMpredict(label_test,data_test,model)
% 的输入
% Written in JLIIP, School of Compuer Science and
% Technology,CUMT,Xuzhou
if nargin<5
n_class=length(unique(label));
end
if nargin<4
ker.type = 'linear';
end
if nargin<3
c=1;
end
[cn1,cn2]=size(c);
if cn1==1&&cn2==1
c=c*ones(n_class,n_class);
end
if strcmp(ker.type,'linear')
data1 = data;
else if strcmp(ker.type,'gauss')
data1=ker_Gaussian(data,data,ker);
end
end
v1=[]; v2=[];
for i = 1:1:n_class-1
for j= i+1:1:n_class
data_op = data1(label==i,:);
data_ng = data1(label==j,:);
%label_temp=[ones(size(data_op,1),1);ones(size(data_ng,1),1)];
[w1,w2] = TWSVMtrain(data_op,data_ng,c(i,j));
v1=[v1,w1];
v2=[v2,w2];
end
end
if strcmp(ker.type,'linear')
model.v1=v1; model.v2=v2; model.ker= ker; model.n_class=n_class; model.label=label;
else if strcmp(ker.type,'gauss')
model.v1=v1; model.v2=v2; model.ker= ker; model.n_class=n_class; model.data = data; model.label=label;
end
end
end
function [w1,w2] = TWSVMtrain(data_op,data_ng,c)
A=data_op;
B=data_ng;
q=size(A,1);S=size(B,1);
e1=ones(q,1);e2=ones(S,1);
% 计算H,G
H=[A,e1];
G=[B,e2];
Q=G/(H'*H+0.05*eye(size(H'*H,1)))*G'; % S*S
Q1=(H'*H+0.05*eye(size(H'*H,1)))\G'; % l1*S
% 产生矩阵f
f=-e2;
% 变量限制
lb=zeros(S,1);
ub=c*ones(S,1);
% 产生初始点x0
x0=zeros(S,1);
% 求最优解x
[x,~,~]=quadprog(Q,f,[],[],[],[],lb,ub,x0);
w1=-Q1*x;
% 计算H,G
G=[A,e1];
H=[B,e2];
Q=G/(H'*H+0.05*eye(size(H'*H,1)))*G';
Q1=(H'*H+0.05*eye(size(H'*H,1)))\G';
% 产生矩阵f
f=-e1;
% 变量限制
lb=zeros(q,1);
ub=c*ones(q,1);
% 产生初始点x0
x0=zeros(q,1);
% 求最优解x
[x,~,~]=quadprog(Q,f,[],[],[],[],lb,ub,x0);
w2=-Q1*x;
end

周楷雯
- 粉丝: 57
- 资源: 1万+