> 文章列表 > 几种特征选择过滤式方法准则原理和代码

几种特征选择过滤式方法准则原理和代码

几种特征选择过滤式方法准则原理和代码

背景

硕士快毕业了,把用到的一些特征评分准则做一个小归纳,或许以后有机会深造,方便把知识找回来。包括五个准则:relieff、MIC、Fisher、Laplacian 、mRMR

relieff

原理思想

对于一个给定的包含 N d {N}_{d} Nd样本 M M M 维特征的数据集,采用ReliefF法对其中的特征求取权重,首先需要从全部的 N d {N}_{d} Nd 个样本中随机选出 l l l个样本,而对任一特征 求取权重 f i f_i fi 的公式如下:

R F ( f i ) = 1 c ∑ j = 1 l ( − 1 m j ) ∑ s r ∈ N H ( j ) M ( D s ( i , j ) − D s ( r , i ) ) + ∑ y ≠ y j 1 h j y p ( y ) 1 − p ( y ) ∑ s r ∈ N M ( j , y ) M ( D s ( i , j ) − D s ( r , i ) ) ) {R_F}({f_i}) = \\frac{1}{c}\\sum\\limits_{j = 1}^l {( - \\frac{1}{{{m_j}}})} \\sum\\limits_{{s_r} \\in NH(j)} {M({D_s}(i,j) - {D_s}(r,i))} + \\sum\\limits_{y \\ne {y_j}} {\\frac{1}{{{h_{jy}}}}} \\frac{{p(y)}}{{1 - p(y)}}\\sum\\limits_{{s_r} \\in NM(j,y)} {M({D_s}(i,j) - {D_s}(r,i)))} RF(fi)=c1j=1l(mj1)srNH(j)M(Ds(i,j)Ds(r,i))+y=yjhjy11p(y)p(y)srNM(j,y)M(Ds(i,j)Ds(r,i)))

其中, N H ( j ) NH(j) NH(j) N M ( j , y ) NM(j,y) NM(j,y) 分别表示在与样本 s j s_j sj 相同类别和与不同类别,与样本 s j s_j sj 距离最近的样本,其大小分别由 m j m_j mj h j y h_{jy} hjy 表示。而在类别 y y y 中的实例概率记为 p ( y ) p(y) p(y) c c c 表示数据的类别个数。

code

这个可以直接调库函数

[fish_ind,scores] = caculate_fish(X,Y);  % fisher 得分

MIC

MIC衡量特征和类别(或被解释特征)的相关性,值越大,相关性越高,特征 f 1 f_1 f1 f 2 f_2 f2 的MIC定义如下:

MIC ⁡ ( D ) = max ⁡ X Y < B ( n ) M ( D ) X , Y = max ⁡ X Y < B ( n ) I ∗ ( D , X , Y ) ln ⁡ ( min ⁡ ( X , Y ) ) \\operatorname{MIC}(D)=\\max _{X Y<B(n)} M(D)_{X, Y}=\\max _{X Y<B(n)} \\frac{I^*(D, X, Y)}{\\ln (\\min (X, Y))} MIC(D)=XY<B(n)maxM(D)X,Y=XY<B(n)maxln(min(X,Y))I(D,X,Y)

D = { ( f 1 i , f 2 i ) , i = 1 , 2 , ⋯ , n } D=\\left\\{\\left(f_{1 i}, f_{2 i}\\right), i=1,2, \\cdots, n\\right\\} D={(f1i,f2i),i=1,2,,n} 是一个有序对集合, X X X 表示将 f 1 f_1 f1 的值域划分为 X X X 段, Y Y Y 表示将 f 2 f_2 f2 的值域划分为 Y Y Y 段, X Y < B ( n ) XY<B(n) XY<B(n) 表示网格数目不能大于, B ( n ) B(n) B(n) (数据总量的0.6或0.55次方)。分子 I ∗ ( D , X , Y ) I^*(D,X,Y ) I(D,X,Y) 表示不同 X X X × Y Y Y 网格划分下的互信息最大值(有多个).分母 l n ( m i n ( X , Y ) ) ln(min(X,Y )) ln(min(X,Y)) 表示将不同划分下的最大互信息值归一化(还可以选择 l g ( ⋅ ) lg(⋅) lg() l b ( ⋅ ) lb(⋅) lb() 等对数函数)

code

[MIC_ind,scores] = caculate_MIC(X,Y);     % MIC得分
function [ind,MIC_value] = caculate_MIC(X,Y)
n = size(X,2);               % 特征数
MIC_value = zeros(1,n);
for i = 1:nminestats = mine(X(:,i)',Y');MIC_value (1,i) = minestats.mic;
end[~,ind] = sort(MIC_value,'descend');
end

注意,该方法需要手动用c++编译器编译文件才能用。详细步骤见 https://blog.csdn.net/u011792913/article/details/106758736

如果不想这么麻烦,可考虑用python把MIC score 计算出来存成 .mat文件,再去matlab使用 。链接

fisher

原理思想

“好”特征满足类内变化小,类间变化大,Fisher得分的评分函数为:

F i s h e r ( f ) = ∑ i = 1 c n i ( μ i − μ ) 2 ∑ i = 1 c n i ( σ i ) 2 Fisher(f) = \\frac{{\\sum\\limits_{i = 1}^c {{n_i}{{({\\mu _i} - \\mu )}^2}} }}{{\\sum\\limits_{i = 1}^c {{n_i}{{({\\sigma ^i})}^2}} }} Fisher(f)=i=1cni(σi)2i=1cni(μiμ)2

式中 c c c 表示类别个数, n i {n}_{i} ni表示第 i i i 类样本的个数, μ i {\\mu _i} μi σ i {\\sigma ^{_i}} σi表示第 i i i 类样本中特征 f f f 的均值和方差, μ {\\mu } μ 表示特征 f f f 的总体均值。由上式可知,Fisher得分越高表示特征越好。

code

[fish_ind,scores] = caculate_fish(X,Y);  % fisher 得分

X X X 是特征矩阵(每一行是一个样本), Y Y Y 是标签(一个列向量和 X X X 对应),下面也是一样,我就不一一赘述了。

function [ind,fish_score] = caculate_fish(X,Y)label = unique(Y);mk = mean(X);n = size(X,1);col = size(X,2);fish_score = zeros(1,col);temp_sb = zeros(1,col);temp_sw = zeros(1,col);for i = 1:length(label)temp_x = X(Y==label(i),:);  % 第i类样本temp_m = mean(temp_x);      % 第i类样本的均值for j = 1:coltemp_sb(1,j) = temp_sb(1,j)+ size(temp_x,1)/n *(temp_m(1,j) - mk(1,j))^2; endfor j = 1:cols= 0;            % 第i类样本在第j特征上的方差for k = 1:size(temp_x,1)s = s + (temp_m(1,j) - temp_x(k,j))^2;ends = s /size(temp_x,1);  temp_sw(1,j) = temp_sw(1,j) + size(temp_x,1)/n *s;endendfor j = 1:colfish_score(1,j) = temp_sb(1,j)/temp_sw(1,j);end[~,ind] = sort(fish_score,'descend');
end

这儿有一个别人的实现,但只能两分类,原始代码有错,请根据review讨论区对代码进行更正 feature_rank(Input,​labels,numIndices,m​ethod)

Laplacian

原理思想

Laplacian 得分所选特征方差大且同类(近邻)样本间变化小,即找到有区分度的特征。特征 f f f 的Laplacian得分定义为

Laplacian ⁡ ( f ) = ∑ i j ( f i − f j ) 2 S i j Var ⁡ ( f ) \\operatorname{Laplacian}(f)=\\frac{\\sum_{i j}\\left(f_i-f_j\\right)^2 S_{i j}}{\\operatorname{Var}(f)} Laplacian(f)=Var(f)ij(fifj)2Sij

f i f_i fi 表示样本 i i i 在特征 f f f 上的取值; S i j S_{ij} Sij 表示权重矩阵 S S S 中的对应值, S S S 是对数据空间结构的模拟表达,描述了同类(近邻)样本两两之间的距离,两个同类(近邻)样本距离越大对应权重也越大,反之越小; V a r ( f ) Var( f ) Var(f) 表示特征 f f f 的方差。由上式易知 Laplacian 得分越低,特征 f f f 越好。

code

[Lap_idx,scores] = fsulaplacian(X);      % Laplacian 得分

mRMR

原理思想

mRMR 准则通过特征和类别之间的相关性和特征和特征之间的冗余度这两方面的信息来评价每个特征。

max ⁡ Φ ( D , R ) , Φ = D − R \\max \\Phi(D, R), \\Phi=D-R maxΦ(D,R),Φ=DR

D D D 代表相关性 R R R 代表冗余性,具体定义自己去了解

code

代码有点多,全是自己写的,应该是对的,我信心我自己的专业 哈哈哈哈。如果有错的还请各位评论区指正

[mRMR_idx,scores] = caculate_mRMR(X);      % mRMR得分

 

function [ind,mRMR_value] = caculate_mRMR(X,Y)
n = size(X,2);               % 特征数
mRMR_value = zeros(1,n);index_use = 1:n;
[D]=caculate_I_feature_and_class(X,Y);
[I_between_feature]= calculate_I_between_feature (X);
featureD = D/n;  %D
featureR = fun_cfR(X,index_use,I_between_feature);  % R 
featureW = featureD - featureR;         % D-R [~,ind] = sort(mRMR_value,'descend');
end

 

function [I_between_feature]= calculate_I_between_feature (X)
n = size(X,2); %特征数
I_between_feature = zeros(n,n);for i= 1:nfor j = 1:nif i == j continue;endif i>jI_between_feature(i,j)= I_between_feature(j,i);continue;endI_between_feature(i,j) = fun_Ixy(X(:,i),X(:,j));  % 差不多每次要一秒,有时少点,有时多点end
end

 

function [D]=caculate_I_feature_and_class(X,Y)
n = size(X,2);               % 特征数
D = zeros(n,1);
for i = 1:nD(i) = fun_Ixy(X(:,i),Y);   % 计算特征x_i与分类Y之间的互信息
end
function R = fun_cfR(X,index_use,I_between_feature)
%   计算冗余性 R
[n,m] = size(X);
R = zeros(m,1);
R(1) = 0;
for i = 2:msum = 0;for j = 1:i-1sum = sum + I_between_feature(index_use(i),index_use(j));endR(i) = sum;
end

 

function [ lambda ] = fun_Ixy(X,Y)
% 求互信息的函数 I(X,Y)
d=2;
N = size(X,1);
h = (4/(d+2))^(1/(d+4))*N^(-1/(d+4));
XY = [X,Y];
sum = 0;
for i = 1:Npx = fun_sigma(X(i),X,h);      % 第i个样本特征值概率py = fun_sigma(Y(i),Y,h);      % 第i个样本类别概率pxy = fun_sigma(XY(i,:),XY,h); % 两者联合概率sum = sum+log(pxy/(px*py));    % 后一项是信息熵,这儿加和后面再除以N是为了求最大相关
end
Ixy = sum/N;                % 计算互信息
lambda = sqrt(1-exp(-2*Ixy)); 
if isnan(lambda)lambda = 0;
end

 

function  pxy  = fun_sigma( xiyi,XYall,h) 
[N,d] = size(XYall);
Cxy = cov(XYall);  % 协方差
detC = det(Cxy);   % 行列式xiyi = repmat(xiyi,N,1);       % 把 xiyi 重复N*1遍
Z = xiyi-XYall;
p2 = Z*(Cxy^(-1))*Z';
p2 = diag(p2);                 % 求特征根
temp = 1/sqrt((2*pi)^d*detC)*exp(-p2/(2*h^2));
temp = sum(temp,1);
pxy = 1/(N*h^d)*temp;

隐翅虫网