变分贝叶斯一维高斯混合模型

5视图(30天)
里
2016年9月25日
评论道: 2016年9月27日
嗨,我想开发一个变分海湾一维高斯混合模型后,彭妮·罗伯茨纸(有ND实现matlab文件交换,但结果并不总是收敛所以我决定写我自己的代码)。功能我写了到目前为止收敛有时在4 - 5的迭代中,有时只给NaN值。我调试和交叉检查我的代码与方程但没找到是什么导致它的行为如此奇怪。有可能有人在这个论坛看看,给我一些建议吗?我会很感激的帮助!
谢谢你!
X =高斯混合一维数据
函数[标签、模型L] = mixGaussVb_SB (X)
%为高斯混合变分贝叶斯推理。
%的输入:
% X: 1 X n数据矩阵
%输出:
%标签:1 x n集群标签
%模式:训练有素的模型结构
流(“贝叶斯高斯混合变分:跑步…\ n”);
N =长度(X);
% %分配之前
prior.m0 =意味着(X);prior.v0 = ((max (X)分钟(X)) / 3) ^ 2;%之前的意思是
prior.b0 = 1 e3;prior.c0 = 1 e - 3;%之前的方差
prior.lambda0 = 5;%之前混合权重
% % VBGM
托尔= 1 e-8;
麦克斯特= 2000;
L =无穷(1、麦克斯特);
模型= init (X,之前,N);
iter = 2:麦克斯特
iter
prevmu = model.m;
模型=期望(X,模型);
模型=最大化(X,模型中,N,之前);
如果sum ((abs (model.m) abs (prevmu)) ^ 2) <托尔
打破;
结束
% L (iter) =绑定(X)模型、前N) / N;
%如果abs (L (iter) - L (iter-1)) < tol * abs (L (iter));打破;结束
结束
L = L (2: iter);
标签= 0 (1,N);
(~,标签(:))= max (model.R [], 2);
(~,~,标签(:))=独特(标签);
函数模型= init (X,之前,N)
idx = kmeans (X, 2);
s = 1:长度(独特(idx))
temp1 = X (idx = = s);
π(s) = (X (idx = = s))长度/长度(X);
μ(s) =意味着(X (idx = = s));
β(s) = 1. / var (X (idx = = s));
结束
m =μ;%之前的意思是
v =(1. /β)。/ (n *π);%之前的意思是
b = var(β)。/β;%之前的方差
c = beta. / b;%之前的方差
λ= 100。*π;%之前的重量
模型。R =全(稀疏(1:N idx 1, N,马克斯(idx), N));
model.m = m;
model.v = v;
model.lambda =λ;
模型=最大化(X,模型中,N,之前);
函数模型=最大化(X,模型中,N,之前)
R = model.R;
m = model.m;
v = model.v;
s = 1:长度(米)
pi_bar (s) = (1 / N) *总和(R (:, s));
N_bar (s) = N * pi_bar(年代);
y_est (:, s) = (1 / N) * (R (:, s) * X);
y_est2 (:, s) = (1 / N) * (R (:, s) * x ^ 2);
%更新超参数
%混合权重
λ(s) = N_bar (s) + prior.lambda0;
%方差
sigma_bar2 (s) = y_est2 (:, s) + pi_bar (s) * (m (s) ^ 2 + v (s)) 2 * (m (s) * y_est (s));
b (s) = 1 / ((N / 2) * sigma_bar2 (s) + (1 / prior.b0));
c (s) = (0.5 * N_bar (s)) + prior.c0;
%的意思
tau0 = 1 / prior.v0;
τ(s) = 1 / v(年代);
beta_bar (s) = b (s) * c (s);
τ(s) = tau0 + (N_bar (s) * beta_bar (s));
m (s) = (tau0 /τ(s)) * prior.m0 + ((N_bar (s) * beta_bar (s)) /τ(s)) * (y_est (s) / pi_bar (s));
结束
tmp1 = gamrnd (c, b);
tmp2 = gamrnd(λ1);
v = 1. /τ;
模型。意味着= normrnd (m v);
模型。sigma2 = 1. / tmp1;
模型。重量= tmp2. /总和(tmp2);
model.lambda =λ;
model.b = b;
model.c = c;
model.v = v;
model.m = m;
model.beta_bar = beta_bar;
model.N_bar = N_bar;
%完成
函数模型=期望(X,模型)
λ= model.lambda;
c = model.c;
b = model.b;
m = model.m;
v = model.v;
beta_bar = model.beta_bar;
s = 1:长度(model.mean)
tmp_lambda =λ(~ ismember(λλ(s)));
pi_est (s) = exp(ψ(λ(s))ψ(sum (tmp_lambda)));
beta_est (s) = exp(ψ(c (s)) +日志(b (s)));
pdf_w (:, s) = pi_est (s) * sqrt (beta_est (s)) * exp (-0.5 * beta_bar (s) * (X ^ 2 + m (s) ^ 2 + v (s) 2 * m(年代)。* X));
结束
R = bsxfun (@rdivide pdf_w, sum (pdf_w, 2));
模型。logR =日志(R);
模型。R = R;
model.pi_est = pi_est;
model.beta_est = beta_est;
2的评论
里
2016年9月26日
谢谢你的回复。请查收附件两个输入。他们都是一维混合模型生成的数据从3组件。

登录置评。

答案(1)

沃尔特·罗伯森
沃尔特·罗伯森 2016年9月26日
我注意到您附加的代码并不像您发布的代码完全相同。附加的代码似乎更多的评论。
我从nan_input加载您的X。垫,跑
GMMVb_SB (X”。)
通过迭代# 12,R(: 1)都成为0 最大化 。导致N_bar(1)变成0,从而导致c(1)成为分配之前。c。当你到达beta_est (s) = exp(ψ(c (s)) +日志(b (s)));在 预计 然后因为c (s)很小,-789.025866305206 psi (c(1))变得和日志(b)(1)只会增加大约6 1/2,exp () = 0。你pdf_w(: 1)完全变成了0。sum()的pdf_w仍有0。rdivide 0/0是南。然后整个的计算是污染。
R(: 1)不似乎都开始是0,虽然他们中的一些人做的。
我不知道任何关于你使用的计算算法(我不熟悉它的数学)。目前我看不到任何 固有的 为什么它不应该所有的值可以“迁移”到一边。当你正在与exp()和概率,下溢0或溢出到正无穷是一个永恒的风险。
1评论
里
2016年9月27日
谢谢你考虑代码。奇怪的是方程还没有,很难实现一维图我小姐,可能我不能我将使用一些文件的发布文件交换的n维。
再一次感谢你!

登录置评。

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!