【问题标题】:EM algorithm code is not workingEM算法代码不工作
【发布时间】:2015-07-10 20:50:29
【问题描述】:

我正在尝试使用 EM 算法估计高斯混合的平均值、权重和协方差,但是对于向量的所有值,我都得到了“NaN”(不是数字)。这是我的代码:

function [nw,ns,nu]=est(wo,so,uo,w,s,u,o,J)
% o is the data points vector (size=nx2)
% J is the number of Gaussian curve
% maximum number of Gaussians=5
% wo is the old weight vector (size=1x5) and "w" is the actual weight vector (size=1x5)
% so is the old covariance vector (size=1x5) and "s" is the actual covariance value (size=1x5)
% uo is the old mean vector (size=5x2) and "u" is the actual mean vector (size=5x2)

o=unique(o,'rows');
t=length(o);

for i=1:5
for j=1:J
    un=0;ud=0;s2n=0;
    for T=1:t
        ud=ud+probab(wo,o(T,:),uo,so,j,J);
    end
    for T=1:t
        un=un+probab(wo,o(T,:),uo,so,j,J)*(o(T,:));
    end
    for T=1:t
        s2n=s2n+probab(wo,o(T,:),uo,so,j,J)*(o(T,:)-uo(j,:))*(((o(T,:)-uo(j,:))'));
    end
    wtemp(j)=ud/t;
    utemp(j,:)=un/ud;
    stemp(j)=sqrt(s2n/(ud));
end
wo=wtemp;
uo=utemp;
so=stemp;
end
    nw=wo;
    ns=so;
    nu=uo;

函数“概率”是:

function [pro]=probab(w,o,u,s,j,J)
pro=w(j).*(1/(2*pi*s(j))).*exp((-1/(2.*(s(j).^2)))*((o(1)-u(j,1)).^2+(o(2)-u(j,2)).^2))/(gaussiandistribution(w,u,s,o(1),o(2),J));

函数“高斯分布”是

function [z]=gaussiandistribution(w,u,s,X,Y,J)
z1=w(1).*(1/(2*pi*s(1))).*exp(-(((X-u(1,1)).^2)/(2.*s(1).^2)+((Y-u(1,2)).^2)/(2.*s(1).^2)));
z2=w(2).*(1/(2*pi*s(2))).*exp(-(((X-u(2,1)).^2)/(2.*s(2).^2)+((Y-u(2,2)).^2)/(2.*s(2).^2)));
z3=w(3).*(1/(2*pi*s(3))).*exp(-(((X-u(3,1)).^2)/(2.*s(3).^2)+((Y-u(3,2)).^2)/(2.*s(3).^2)));
z4=w(4).*(1/(2*pi*s(4))).*exp(-(((X-u(4,1)).^2)/(2.*s(4).^2)+((Y-u(4,2)).^2)/(2.*s(4).^2)));
z5=w(5).*(1/(2*pi*s(5))).*exp(-(((X-u(5,1)).^2)/(2.*s(5).^2)+((Y-u(5,2)).^2)/(2.*s(5).^2)));
if J==5
z=z1+z2+z3+z4+z5;
elseif J==4
z=z1+z2+z3+z4;
elseif J==3
z=z1+z2+z3;
elseif J==2
z=z1+z2;
elseif J==1
z=z1;
end

【问题讨论】:

  • "但它不起作用" 这很模糊。代码是否运行?不会报错吗?如果是这样,错误信息是什么?如果没有,它在哪里失败?没有人会为您完成所有这些代码,您需要自己付出一些努力。
  • 通过说“它不工作”,我的意思是它给了我所有向量的“NaN”,并且为了你的信息,我正在研究它两个月,所以我不期待语法错误或其他东西,我我不指望有人通过所有的代码。不幸的是,即使我彻底阅读了有关该主题的一些论文,我也没有任何统计知识来找出确切的问题。也许这是一个错误的地方问...
  • OK,遍历代码,找到第一个NaN出现的位置,告诉我们什么变量,代码的哪个阶段。这将帮助您解决问题。
  • 实际上问题出现在权重向量接近零(或非常小的值)时。当权重向量接近零时,“gaussiandistribution”函数的输出将变为零,这导致“probab”函数的输出变为零。如您所见,probab 函数在更新均值、权重和协方差向量方面起着最大的作用。我怀疑“ud”变量接近零并除以零导致“NaN”。

标签: algorithm matlab statistics


【解决方案1】:

我已经运行了您的代码(在 Octave 中),但没有看到任何 NaN。以下是我的价值观:

octave:13> wo
wo =

   0.20000   0.20000   0.20000   0.20000   0.20000

octave:14> so
so =

   1   1   1   1   1

octave:15> uo
uo =

   0   0
   0   0
   0   0
   0   0
   0   0

octave:16> w
w =

   0.20000   0.20000   0.20000   0.20000   0.20000

octave:17> s
s =

   1   1   1   1   1

octave:18> u
u =

   0   0
   0   0
   0   0
   0   0
   0   0

octave:19> 
octave:19> o
o =

   1.00000   2.00000
   3.00000   1.00000
  -1.00000   2.00000
   2.00000  -2.00000
  -2.00000  -1.00000
   3.00000  -2.00000
   2.00000   3.00000
   1.50000  -0.25000

这是我得到的输出:

octave:20> [nw, ns, nu] = est(wo, so, uo, w, s, u, o, 5)
nw =

   0.20000   0.20000   0.20000   0.20000   0.20000

ns =

   2.4770   2.4770   2.4770   2.4770   2.4770

nu =

   1.18750   0.34375
   1.18750   0.34375
   1.18750   0.34375
   1.18750   0.34375
   1.18750   0.34375

我没有检查这些是否正确,但无论如何它们都不是NaN。

你对输入有什么价值?

【讨论】:

  • 这是我的价值观:we=[0.2,0.5,0.3,0,0],ue=[12,12;10,10;9,9;0,0;0,0] ,se=[0.5,0.5,0.5,1,1],w=[0.3,0.3,0.4,0,0],u=[20,20;15,30;30,20;0,0;0, 0],s=[3,1.6,2,1,1],J=3。当我应用一个大的“o”向量时,它更有可能得到“NaN”。
  • 如果你有时会得到 NaN,有时不会,那么 o 的值似乎很重要……那么 o 的值是多少?顺便说一句,当我使用您提供的参数运行est 以及我之前使用的相同o 时,我得到了一个超出范围的数组索引。不知道那里发生了什么;我没有看到任何明显的错误。
  • “o”的值应该在0到1之间。我的“o”很大。你把 J 设为 3 了吗?
  • 好吧,请记住,如果您不告诉我您使用的 o 的确切值,我无法测试您的代码。理想情况下,您会告诉我一个产生 NaN 的值和另一个不产生的值。如果o“相当大”,也许你需要寻找一个更小的例子来显示这种行为。
  • 如何上传变量向量?
猜你喜欢
  • 1970-01-01
  • 2018-02-22
  • 2013-06-03
  • 2015-08-16
  • 2016-11-29
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多