📄 regpathsvmoneclass.m
字号:
function [alphamat,alpha0vec,lambdavec,event]=regpathsvmoneclass(xapp,kernel,kerneloption,verbose,options);
nuinit=0.999;
lambdaseuil=1.1;
lambdaseuil=size(xapp,1)*0.01;
epsilon=1e-8;
DOQP=1;
lambd=1e-8;
chouia=1e-3;
event=[];
lambdavec=[];
alphamat=[];
alpha0vec=[];
%--------------------------------------
% initialisation
%--------------------------------------
[nbtrain,dim]=size(xapp);
lambda=nuinit*nbtrain;
Kapp=normalizekernel(xapp,kernel,kerneloption) + epsilon*eye(nbtrain);
%
% INITIALIZATION
if DOQP
c=zeros(nbtrain,1);
A=ones(nbtrain,1);
b=lambda;
C= 1;
indrand=randperm(nbtrain);
Elambda=floor(lambda);
alphainit(indrand(1:Elambda),1)=1;alphainit(indrand(Elambda+1),1)=lambda-Elambda;
[alphaaux, multiplier, pos]=monqp(Kapp/lambda,c,A,b,C,lambd,verbose,[],[],alphainit);
if sum(alphaaux>1 | alphaaux < 0 )>0
fprintf('Error Init')
end;
alpha=zeros(nbtrain,1);
alpha(pos)=alphaaux;
alpha0=-lambda*multiplier;
fx=(Kapp*alpha-alpha0)/lambda;
lambdavec=[lambdavec lambda];
alphamat=[alphamat alpha];
alpha0vec=[alpha0vec alpha0];
elbow=find(abs(fx)<lambd);
left=find(fx<-lambd);
right=find(fx>lambd);
else
%--------------------------------------
%% process fx for the parzen windows
alpha=ones(nbtrain,1);
alpha0=sqrt(alpha'*Kapp*alpha);
fx=(Kapp*alpha-alpha0)/nbtrain;
indaux=find(fx<0);
[aux,indaux1]=max(fx(indaux));
indaux1=find(fx==aux); % see if there is any doublons
if length(indaux1)>1
warning('Doublons');
indaux1=indaux1(1);
end;
alpha(indaux(indaux1))=lambda-floor(lambda);
alpha0=Kapp(indaux(indaux1(1)),:)*alpha;
fx=(Kapp*alpha-alpha0)/lambda;
lambdavec=[lambdavec lambda];
alphamat=[alphamat alpha];
alpha0vec=[alpha0vec alpha0];
elbow=[indaux(indaux1)];
right=[];
left=setdiff(1:nbtrain,elbow)';
end;
%
% Main algorithm
%
while lambda > lambdaseuil & lambda > 1
if verbose ==1
fprintf('\rlambda=%3.3f',lambda);
end;
nbelbow=length(elbow);
if nbelbow ~=0
Una=[zeros(nbelbow,1);1];
A=[Kapp(elbow,elbow) -ones(nbelbow,1); ones(1,nbelbow) 0];
ba=A\Una;
balpha=ba(1:end-1);
bo=ba(end);
% case elbow to 0 or 1
lambda1=lambda + (ones(nbelbow,1)-alpha(elbow))./balpha;
lambda2=lambda + (zeros(nbelbow,1)-alpha(elbow))./balpha;
%case L and R
%hellxi=sum(Kapp(:,elbow).*(ones(nbtrain,1)*(balpha)'),2) - bo;
hellxi=Kapp(:,elbow)*balpha - bo;
lambda3=lambda*(fx(left)-hellxi(left))./(-hellxi(left));
lambda4=lambda*(fx(right)-hellxi(right))./(-hellxi(right));
ind1=find( (lambda1+epsilon)<lambda);
ind2=find((lambda2+epsilon)<lambda);
ind3=find((lambda3+epsilon)<lambda);
ind4=find((lambda4+epsilon)<lambda);
[lambdanew]=max([lambda1(ind1);lambda2(ind2);lambda3(ind3);lambda4(ind4)]);
if isempty(lambdanew)
fprintf('Exit due to no new lambda ... \n');
break
end;
fx=lambda/lambdanew*(fx-hellxi)+hellxi;
alpha(elbow)=alpha(elbow)-(lambda-lambdanew)*balpha;
alpha0=alpha0-(lambda-lambdanew)*bo;
lambda=lambdanew;
% mise
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -