function W =fsFisher(data)%Fisher Score% Input:% data: dataset % Output:% W: W(i) represents the Fisher Score of the i-th feature. % numC = max(Y);
Y =data(:,end);% 提取标签
X =data(:,1:end-1);% 提取样本数据,去掉标签列
unique_labels =unique(Y);% 获取所有唯一的类别标签
numC =length(unique_labels);% 类别数量[~, numF]=size(X);
W =zeros(1,numF);% statistic for classes
cIDX =cell(numC,1);
n_i =zeros(numC,1);forj=1:numC
%cIDX{j} = find(Y(:)==j);
cIDX{j}=find(Y(:)==unique_labels(j));n_i(j)=length(cIDX{j});end% calculate score for each featuresfori=1:numF
temp1 =0;
temp2 =0;
f_i =X(:,i);
u_i =mean(f_i);forj=1:numC
u_cj =mean(f_i(cIDX{j}));
var_cj =var(f_i(cIDX{j}),1);
temp1 = temp1 +n_i(j)*(u_cj-u_i)^2;
temp2 = temp2 +n_i(j)* var_cj;end% checkif temp1 ==0W(i)=0;elseif temp2 ==0W(i)=100;elseW(i)= temp1/temp2;endendendend
matlab代码如下
function[out]=fsFisher(X,Y)%Fisher Score, use the N var formulation% X, the data, each raw is an instance% Y, the label in 1 2 3 ... format
numC =max(Y);[~, numF]=size(X);
out.W =zeros(1,numF);% statistic for classes
cIDX =cell(numC,1);
n_i =zeros(numC,1);forj=1:numC
cIDX{j}=find(Y(:)==j);n_i(j)=length(cIDX{j});end% calculate score for each featuresfori=1:numF
temp1 =0;
temp2 =0;
f_i =X(:,i);
u_i =mean(f_i);forj=1:numC
u_cj =mean(f_i(cIDX{j}));
var_cj =var(f_i(cIDX{j}),1);
temp1 = temp1 +n_i(j)*(u_cj-u_i)^2;
temp2 = temp2 +n_i(j)* var_cj;endif temp1 ==0
out.W(i)=0;elseif temp2 ==0
out.W(i)=100;else
out.W(i)= temp1/temp2;endendend[~, out.fList]=sort(out.W,'descend');
out.prf =1;
Bibtex 引用
@BOOK{Duda-etal01,
title = {Pattern Classification},
publisher = {John Wiley \& Sons, New York},
year = {2001},
author = {Duda, R.O. and Hart, P.E. and Stork, D.G.},
edition = {2},
}
}