gusucode.com > 《模式识别与智能计算》matlab源代码 > 《模式识别与智能计算》matlab源代码/《模式识别与智能计算》部分函数的源程序/书程序/第2章/H_k.m

    function results=H_k(varargin)   
r1=length(varargin)-2;
test=[varargin{end-1} ones(size(varargin{end-1},1),1)];   
type=varargin{end};   
num=nchoosek(1:r1,2);
for i=1:size(num,1)
    y1(i)=ifclassify(varargin{num(i,1)},varargin{num(i,2)});   
  if y1(i)==0
     str=['第' num2str(num(i,1)) '和' num2str(num(i,2)) '线性不可分'];
     disp(str);
   end 
end
for i=1:r1
    [r2(i),c]=size(varargin{i});
    varargin{i}=[varargin{i} ones(r2(i),1)];
end
w=zeros(c+1,r1);
num1=0;flag=1;num2=0;
while flag
   flag=0;num2=num2+1;
   for i=1:r1
    for j=1:r2(i)
        num1=num1+1;
        r=zeros(1,r1);r(i)=1;
        for k=1:r1
          d(k)=w(:,k)'*varargin{i}(j,:)';
        end
        for k=1:r1
            if k~=i
                if d(k)<=d(k)
                    flag=1;
                end
            end
        end
        switch type
            case 'lm'
               for k=1:r1
                 w(:,k)=w(:,k)+varargin{i}(j,:)'*(r(k)-d(k))/num1;
               end
            case 'cr'           
                for k=1:r1
                  if r(k)>d(k)
                    w(:,k)=w(:,k)+varargin{i}(j,:)'/num1;
                  else
                    w(:,k)=w(:,k)-varargin{i}(j,:)'/num1;  
                  end
                end 
        end
    end
   end
   if num2>800
       flag=0;
   end
end
for k=1:size(test,1)
   y=w'*test(k,:)';
   [a,results(k)]=max(y);
end