我希望你能帮助我在这里找到问题。我想实现基于互信息的最佳个体特征算法。作为算法的一部分,我需要计算每个n维特征向量f _j 与每个类标签w={1,2}之间的互信息(MI) ,可以写成:
I( f_j :w)=H(w)-H(w| f_j ),
其中 H(w)=-sum P(w)log2P(w) 并且条件熵是
H(w| f _j)=-sum{w=1:2} p(w| f _j)log2p(w| f _j)= -sum{w=1:2}sum{i=1:n}p (w|f_j,i)log2p(w|f_j,i)。
然后 p(w|f_j,i) 可以通过贝叶斯计算:
p(w|f_j,i)= (p(f_j,i|w)P(w))/p(f_j,i),
其中 p(f_j,i)=sum(w=1:2)p(f_j,i|w)P(w)。
可以使用 Parzen Windows 估计条件概率。
因此,我通过使用 KSDENSITY 在 MATLAB 中实现了以下代码来估计条件概率。
我需要知道它是否实施得很好,因为我的 MI 值大于 1,这是没有意义的,因为 H(w)=1,(见这里)然后 MI 的上限也应该是 1 , 正确的?
拜托,您发现的代码中的任何错误都可能有很大帮助-
最好的,
N=length(labels);
nf=size(features,2);
nC1=sum(labels);
nC2=N-nC1;
priors=[nC1 nC2]/N;
%class entropy
Hw=-sum(priors.*log2(priors));
%conditional probability p(fji|w),
%where fji is the jth feature value at ith trial
%Estimation based on gaussian parzen windows.
target=features(labels==1,:); %fj |w==1 (in columns)
nontarget=features(labels~=1,:);%fj |w~=1 (in columns)
for j=1:nf
for i=1:N
cp1 = ksdensity(target(:,j),features(i,j));
cp2= ksdensity(nontarget(:,j),features(i,j));
%% feature probability p(fji) or marginal likelihood
pf=sum(cp1*priors(1)+cp2*priors(2));
%% conditional probability by bayes rules
pwf1=(cp1*priors(1))/pf;
pwf2=(cp2*priors(2))/pf;
%% conditional Entropy
Hwf=-sum(pwf1*log2(pwf1+eps)+ pwf2*log2(pwf2+eps));
%% Mutual Inf
dMI(i)=Hw-Hwf;
end
MI(j)=nansum(dMI(:));
end