image thumbnail
from Orthogonal Quadratic Discriminant Fuctions by Suicheng Gu
A new quadratic discriminant fuction

[total,Evector]=OQDF_M(tr,trl,te,tel,gamma)
function [total,Evector]=OQDF_M(tr,trl,te,tel,gamma)

class=max(trl);[ntr,nd]=size(tr);[nte,nd]=size(te);
means=zeros(class,nd);nums=zeros(class,1);hte=zeros(class,1);ml=zeros(class,1);
for i=1:ntr;
    nums(trl(i))=nums(trl(i))+1;
    means(trl(i),:)=means(trl(i),:)+tr(i,:);
end;
    means=means./(nums*ones(1,nd));
fm=zeros(ntr,nd);
nnums=zeros(class,1);
mnums=min(min(nums)-1,nd);
Evalues=zeros(class,mnums);Evector=zeros(nd,mnums,class);
for i=1:ntr;
    nnums(trl(i)) = nnums(trl(i)) +1;
    fm( sum(nums(1:trl(i)))-nums(trl(i))+nnums(trl(i)) , :)=tr(i,:)-means(trl(i),:);
end;   
if mnums<nd;
    for i=1:class;
        Sigma=fm( sum( nums( 1:i ) ) -nums(i)+1 : sum(nums(1:i)),:) * fm( sum( nums( 1:i ) ) -nums(i)+1 : sum(nums(1:i)),:)';
        [Eve,Eva]=eig(Sigma);
        [Eva,ol]=sort(ones(1,nums(i))*Eva,'descend');
        Eve=fm(sum(nums(1:i))-nums(i)+1:sum(nums(1:i)),:)'*Eve(:,ol(1:mnums));
        Evector(:,:,i)=Eve./(ones(nd,1)*sqrt(sum(Eve.*Eve)));
    end;
else 
    for i=1:class;
        Sigma=fm( sum( nums( 1:i ) ) -nums(i)+1 : sum(nums(1:i)),:)' * fm( sum( nums( 1:i ) ) -nums(i)+1 : sum(nums(1:i)),:);
        [Eve,Eva]=eig(Sigma);
        [Eva,ol]=sort(ones(1,nd)*Eva,'descend');
        Evector(:,:,i)=Eve(:,ol(1:nd));
    end;
end;
total=0;
if nargin<5;
    gamma=0.3;
end;
Evalue=1./mean(Evalues).^gamma;

sigm=max(Evalue)*2;
for j=1:nte;
    for i=1:class;
        tempv=(te(j,:)-means(i,:))*Evector(:,:,i);
        hte(i)=(te(j,:)-means(i,:))*(te(j,:)-means(i,:))'*sigm-(sigm-Evalue).*tempv*tempv';
    end;
    [mv,ml(j)]=min(hte);
    if(ml(j)~=tel(j))
       total=total+1; 
    end;
end;

Contact us at files@mathworks.com