| [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;
|
|