📄 新建 文本文档 (3).txt
字号:
function [tezhi,vector,J,feaflag]=kltransform(data,classnums,feanums,numsofone,selfeanums,panju)
if(size(data,2)~=feanums)
data=data';
end
if(numsofone*classnums~=size(data,1))
disp('shu ru shu ju wei shu chu cuo')
return;
end
if(panju<0|panju>7)
sprintf('suo shu ru de panju ge shu bi xu zai %d he %d zhi jian,not %d',1,7,panju)
return;
end
sw=zeros(feanums,feanums);
rx=zeros(feanums,feanums);
sb=zeros(feanums,feanums);
classmean=zeros(classnums,feanums);
totalmean=zeros(1,feanums);
totalmean=mean(data);
a=zeros(feanums,feanums);
plei=1.0/classnums;
zongnums=classnums*numsofone;
J=zeros(1,feanums);
feaflag=zeros(1,feanums);
vector=zeros(feanums,feanums);
tezhi=zeros(1,feanums);
for nums=1:classnums
classmean(nums,:)=mean(data((nums-1)*numsofone+1:nums*numsofone,:));
end
for nums=1:classnums
for geshu=(nums-1)*numsofone+1:nums*numsofone
a=(data(geshu,:)-classmean(nums,:))'*(data(geshu,:)-classmean(nums,:));
sw=sw+a;
rx=rx+(data(geshu,:)-totalmean(1,:))'*(data(geshu,:)-totalmean(1,:));
end
sb=sb+(classmean(nums,:)-totalmean(1,:))'*(classmean(nums,:)-totalmean(1,:));
end
sw=sw*plei/numsofone;
rx=rx/zongnums;
sb=sb*plei;
if(panju==1)
[vector,a]=eig(rx);% panju==1, zi xiang guan ju zhen kl bian huan
elseif(panju==2)
[vector,a]=eig(sw); %panju==2,lei nei li san du ju zhen kl bian huan
elseif(panju==3)
if(det(sw)==0)
disp('this critia does not work,sw is singular')
return;
end
[vector,a]=eig(sb/sw); %panju==3,sb/sw kl bian huan
elseif(panju==4) %panju=4, lei ping jun xiang liang de zui you ya suo
[vector,a]=eig(sw);
baihua=zeros(feanums,feanums);
for feas=1:feanums
baihua(:,feas)=vector(:,feas)/(a(feas,feas)^(1/2));
end
sbb=baihua'*sb*baihua;
[w,a]=eig(sbb);
vector=baihua*w;
elseif(panju==5) %panju=5,lei jun zhi xin xi ti qu?
[vector,a]=eig(sw);
for feas=1:feanums
J(1,feas)=vector(:,feas)'*sb*vector(:,feas);
J(1,feas)=J(1,feas)/a(feas,feas);
end
elseif(panju==6) %panju==6,fang cha xin xi ti qu
[vector,a]=eig(sw);
leicov=zeros(feanums,feanums);
leitezhi=zeros(classnums,feanums);
for nums=1:classnums
for geshu=(nums-1)*numsofone+1:nums*numsofone
leicov=leicov+(data(geshu,:)-classmean(nums,:))'*(data(geshu,:)-classmean(nums,:));
end
leicov=leicov/numsofone;
c=vector'*leicov*vector;
for feas=1:feanums
leitezhi(nums,feas)=plei*c(feas,feas)/a(feas,feas);
end
end
leitezhi;
for feas=1:feanums
J(feas)=0;
for nums=1:classnums
J(feas)=J(feas)-leitezhi(nums,feas)*log(leitezhi(nums,feas));
end
end
%J=prod(leitezhi);
elseif(panju==7)
[vector,a]=eig(sb);
end
tezhi=zeros(1,feanums);
for feas=1:feanums
tezhi(1,feas)=a(feas,feas);
end
if(panju<=4|panju==7)
sumtezhi=sum(tezhi);
J=tezhi/sumtezhi;
xinxiRatio=0;
[b,sortorder]=sort(J);
d=feanums-selfeanums;
for feas=feanums:-1:1
if(feas>d)
feaflag(sortorder(feas))=1;
xinxiRatio=xinxiRatio+J(sortorder(feas));
else
feaflag(sortorder(feas))=0;
end
end
sprintf('ti qu te zheng de xinxilv wei:%f',xinxiRatio)
elseif(panju==5)
[b,sortorder]=sort(J);
d=feanums-selfeanums;
for feas=feanums:-1:1
if(feas>d)
feaflag(sortorder(feas))=1;
else
feaflag(sortorder(feas))=0;
end
end
else
[b,sortorder]=sort(J);
for feas=1:feanums
if(feas<=selfeanums)
feaflag(sortorder(feas))=1;
else
feaflag(sortorder(feas))=0;
end
end
end
sortorder;
%sprintf('yong de pan ju wei:%d',panju)
%tezhi
%disp('suo yong de bian huan ju zhen wei:')
%vector
%disp('suo ti qu de te te zheng de pan ju wei:')
%J
%disp('suo ti qu de bian huan ju zhen lie biao zhi wei:')
%feaflag
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -