⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monqp.m

📁 支持向量机SVM和核函数的MATLAB程序集
💻 M
字号:
function [xnew, lambda, pos,mu] = monqp(H,c,A,b,C,l,verbose,X,ps,xinit)% function [xnew, lambda, pos] = monqp(H,c,A,b,C,l,verbose,X,ps,xinit)%% min 1/2  x' H x - c' x                 %  x % contrainte   A' x = b                    % % et         0 <= x_i  <= C_i%% Cr�dits : J.P. Yvon (INSA de Rennes) pour l'algorithme%           O. Bodard (Clermont Ferrand) pour le debugage on line%%  S CANU - scanu@insa-rouen.fr%  Mai 2001%-------------------------------------------------------------------------- %                                verifications %-------------------------------------------------------------------------- [n,d] = size(H); [nl,nc] = size(c); [nlc,ncc] = size(A); [nlb,ncb] = size(b); if d ~= n     error('H must be a squre matrix n by n'); end if nl ~= n     error('H and c must have the same number of row'); end if nlc ~= n     error('H and A must have the same number of row'); end if nc ~= 1     error('c must be a row vector'); end if ncb ~= 1     error('b must be a row vector'); end if ncc ~= nlb      error('A'' and b  must have the same number of row'); end if nargin < 5		% default value for the regularisation parameter     l = 0;				 end; if nargin < 6		% default value for the display parameter     verbose = 0;				 end; if  size(C,1)~=nl    %   keyboard    C=ones(nl,1)*C;  % vectorizing the UpperBound Constraintend;if exist('xinit','var')~=1    xinit=[];end;fid = 1; %default value, curent matlab window %-------------------------------------------------------------------------- %-------------------------------------------------------------------------- %                       I N I T I A L I S A T I O N  %-------------------------------------------------------------------------- OO = zeros(ncc);H = H+l*eye(length(H)); % preconditionningxnew = -1*ones(size(C));ness = 0;     ind=1;if isempty(xinit)        while (( sum (xnew < 0)) >0 | ( sum(xnew >C(ind)) > 0))  & ness < 100   %% 03/01/2002        ind = randperm(n);        ind = sort(ind(1:ncc)');        aux=[H(ind,ind) A(ind,:);A(ind,:)' OO];        aux= aux+l*eye(size(aux));        if rcond(aux)>1e-12            newsol = aux\[c(ind) ; b];            xnew = newsol(1:length(ind));            ness = ness+1;         else            ness=101;            break;        end;    end;    %keyboard    if ness < 100        x = xnew;        lambda = newsol(length(ind)+1:length(ind)+ncc);    else        % Brute Force Initialisation               ind = [1];        x = C(ind)/2.*ones(size(ind,1),1);                                    lambda=ones(ncc,1);                    %          %         ind = [1;nl];          %         x = C(ind)/2.*ones(size(ind,1),1);                      end    indsuptot = [];	 else  % start with a predefined x            indsuptot=find(xinit==C);    indsup=indsuptot;    ind=find(xinit>0 & xinit ~=C) ;    x = xinit(ind);    lambda=ones(ncc,1);    end;% Modification for QP without equality constraintsif sum(A==0)    ncc=0;end;[U,testchol] = chol(H); % Test definite positiveness of Hfirstchol=1;%-------------------------------------------------------------------------- %                            M A I N   L O O P %-------------------------------------------------------------------------- Jold = 10000000000000000000;  %C = Jold; % for the cost functionif verbose ~= 0     disp('      Cost     Delta Cost  #support  #up saturate');     nbverbose = 0; end nbiter=0;STOP = 0;nbitermax=20*n;while STOP ~= 1        nbiter=nbiter+1;    indd = zeros(n,1);indd(ind)=ind;nsup=length(ind);indd(indsuptot)=-1;    if verbose ~= 0                     [J,yx] = cout(H,x,b,C,indd,c,A,b,lambda);         nbverbose = nbverbose+1;         if nbverbose == 20             disp('      Cost     Delta Cost  #support  #up saturate');             nbverbose = 0;         end         if Jold == 0             fprintf(fid,'| %11.4e | %8.4f | %6.0f | %6.0f |\n',[J (Jold-J) nsup length(indsuptot)]);         elseif  (Jold-J)>0            fprintf(fid,'| %11.4e | %8.4f | %6.0f | %6.0f |\n',[J min((Jold-J)/abs(Jold),99.9999) nsup length(indsuptot)]);         else            fprintf(fid,'| %11.4e | %8.4f | %6.0f | %6.0f | bad mouve \n',[J max((Jold-J)/abs(Jold),-99.9999) nsup length(indsuptot)]);                     end             Jold = J;     end                         % nouvele resolution du syst�me        % newsol = [H(ind,ind)+l*eye(length(ind)) A(ind,:);A(ind,:)' OO]\[c(ind) ; b];    % xnew = newsol(1:length(ind));    % lambda = newsol(length(ind)+1:length(newsol));        ce = c(ind);    be = b;        %     if (isempty(indsuptot)==0) % if NOT empty    %         keyboard    %         %     ce= ce - C*(sum(H(ind,indsuptot),2)+sum(H(indsuptot,ind),1)');%    min     x'Hx + c'x    %         ce= ce - C*(sum(H(ind,indsuptot),2));%                              min     x'Hx + c'x    %         be= be - C*sum(A(indsuptot,:),1)';                            %    with    Ax=b    %     end             %03/01/2003    if (isempty(indsuptot)==0) % if NOT empty                %        %  on remplace tout les x qui sont indsuptot par C        %                Cmat= ones(length(ind),1)*(C(indsuptot)');         if size(ce)~= size(sum( Cmat.*H(ind,indsuptot),2))            keyboard;        end;        ce= ce - sum( Cmat.*H(ind,indsuptot),2);%                              min     x'Hx + c'x        Cmat= C(indsuptot)*ones(1,size(A,2));         be= be - sum(Cmat.*A(indsuptot,:),1)';                            %    with    Ax=b            end                 %  keyboard    % auxH=H(ind,ind);    % [U,testchol] = chol(auxH); %    At=A(ind,:)';    Ae=A(ind,:);            if testchol==0        auxH=H(ind,ind);        [U,testchol] = chol(auxH); % It would be better to use an updated choleski        %------------------------------------------------------------------%         if length(ind)>5%             keyboard%         if firstchol   %             Ub=chol(auxH)'; %             firstchol=0;%         else%             %             if directioncholupdate==1%                 Ubr = updatechol(Ub,indexcholupdate-1,H(varcholupdate,:),directioncholupdate);%             else%                 Ubr = updatechol(Ub,indexcholupdate,[],directioncholupdate);%             end;%            %             max(max(abs(Ub-U)))%         end;%     end        %------------------------------------------------------------------        M = At*(U\(U'\Ae));        d = U\(U'\ce);        d = (At*d - be);   % second membre  (homage au gars OlgaZZZZZZ qui nous a bien aid�)        % On appelle le gc fabuleux de mister OlgaZZZ Hoduc        % lambdastart = rand([m,1]);        % [lambda] = gradconj(lambdastart,M*M,M*d,MaxIterZZZ,tol,1000);        if rcond(M)<l            M=M+l*eye(size(M));        end;        lambda = M\d;        % On reconstitue le vecteur en r�solvant le syst�me lin�aire Hx = c-Alambda        % size(lambda)        % size(Ae)        %      keyboard        %        xnew = U\(Ut\(ce-Ae*lambda));        xnew=auxH\(ce-Ae*lambda);    else                % if non definite positive;        auxH=H(ind,ind);                auxM=At*(auxH\Ae);        M=auxM'*auxM;        d=auxH\ce;        d=At*d-be;        if rcond(M)<l            M=M+l*eye(size(M));        end;        lambda=M\d;        xnew=auxH\(ce-Ae*lambda);    end;        %-------------------------------------------------------------------------------------------------------        [minxnew minpos]=min(xnew);            if (sum(xnew< 0) > 0 | sum(xnew > C(ind)) > 0)   &  length(ind) > ncc  %  03/01/2002 AR        %  cette condition est utile  pour le        % semi param         % on projette dans le domaine admissible et on sature la contrainte associ�e        %-------------------------------------------------------------------------        d = (xnew - x)+l;                % projection direction        indad = find(xnew < 0);         indsup = find(xnew > C(ind) );                      %% 03/01/2002        [tI indmin] = min(-x(indad)./d(indad));        [tS indS] = min((C(ind(indsup))-x(indsup))./d(indsup)); % pas de descente         if isempty(tI) , tI = tS + 1; end;         if isempty(tS) , tS = tI + 1; end;         t = min(tI,tS);                 x = x + t*d;                 % projection into the admissible set                if t == tI                         varcholupdate=ind(indad(indmin));            indexcholupdate=indad(indmin);            directioncholupdate=-1; % remove                        ind(indad(indmin)) = [];            % the associate variable is set to 0            x(indad(indmin)) = [];              % the associate variable is set to 0                                            else            indexcholupdate=indsup(indS);            varcholupdate=ind(indsup(indS));            directioncholupdate=-1; % remove                        indsuptot = [indsuptot ; ind(indsup(indS))];             ind(indsup(indS))= [];             x(indsup(indS))= [];                                             end            else        xt = zeros(n,1);           % keyboard;        xt(ind) = xnew;              % keyboard;        xt(indsuptot) = C(indsuptot); indold=ind;             % keyboard;                                     %% 03/01/2002                mu = H*xt - c + A*lambda;    % calcul des multiplicateurs de lagrange associ�es aux contraintes                indsat = 1:n;                           % on ne regarde que les contraintes satur�es        indsat([ind ; indsuptot]) = [];                [mm mpos]=min(mu(indsat));        [mmS mposS]=min(-mu(indsuptot));  %keyboard                if ((~isempty(mm) & (mm < -sqrt(eps)))  | (~isempty(mmS) & (mmS <  -sqrt(eps)))) & nbiter< nbitermax            if isempty(indsuptot) | (mm < mmS)             % il faut rajouter une variable                ind = sort([ind ; indsat(mpos)]);        % on elimine une contrainte de type x=0                x = xt(ind);                indexcholupdate=find(ind==indsat(mpos));                varcholupdate=indsat(mpos);                directioncholupdate=1; % remove            else                ind = sort([ind ; indsuptot(mposS)]);  % on elimine la contrainte sup si necessaire                x = xt(ind);                           % on elimine une contrainte de type x=C                indexcholupdate=find(ind==indsuptot(mposS));                varcholupdate=indsuptot(mposS);                indsuptot(mposS)=[];                directioncholupdate=1; % remove            end        else                        STOP = 1;                            pos=sort([ind ; indsuptot]);            xt = zeros(n,1);                         xt(ind) = xnew;                          xt(indsuptot) = C(indsuptot);                      indout = 1:n;            indout(pos)=[];            xnew = xt;            xnew(indout)=[];                    end            endend%-------------------------------------------------------------------------- %                        E N D   M A I N   L O O P %-------------------------------------------------------------------------- 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -