我正在通过此维基百科链接在 Matlab 中实现 Baum-Welch 算法:Baum-Welch algorithm。这是我在金融时间序列中预测波动性的一部分。
我有两个问题:
1:在维基百科页面的最后一个更新步骤中,有人告诉我们“这些步骤现在迭代地重复,直到达到所需的收敛水平。”。
那么如何声明一个条件来停止循环呢?此外,应该评估哪些变量以查看它们是否可以接受?
2:如果您注意维基百科的公式kesi
:
kesi = (alhpa(i,t) * a(i,j) * beta(j,t+1) * b(j,t+1) ) / sum over states for alpha(states,T)
alpha
分子 ( and beta
) 和分母 (just) 中有两个因子被缩放alpha
。所以他们不会取消彼此的效果。我已经实现了方程(例如,在一个重复 20 次的循环中)并且我已经完成了缩放过程。但是“转移概率矩阵”和“初始分布”和“排放矩阵”得到了NaN
值!!!
我已经阅读了这个问题的答案Baum-Welch 许多可能的观察结果。我已经根据那里提到的教程进行了缩放。
这是我的代码:
n = 3; % number of sataes
T = 20; % number of observations
%do some initializing things with random values and computing gamma,kesi...
index=20;
while index>=0
pi_star = gamma(:,1)';
P_star = zeros(n,n);
for i_2=1:n
makhraj = sum(gamma(i_2,:));
for j=1:n
sorat = sum(kesi(i_2,j,:));
P_star(i_2,j) =(sorat) / (makhraj) ;
end
end
Q_star=zeros(n,T);
for t=1:T
for i_2=1:n
makhraj = sum(gamma(i_2,:));
sorat=0;
for h=1:T
if Obs(h) == Obs(t)
sorat = sorat + (gamma(i_2,t));
end
end
Q_star(i_2,t) = (sorat)/(makhraj);
end
end
%computing the forward probabilities
for i_2=1:n
alpha(1,i_2) = pi_star(1,i_2)*Q_star(i_2,1);
end
for t=2:T
for j=1:n
alpha(t,j) = (alpha(t-1,:)*(P_star(:,j))) * Q_star(j,t) ;
end
end
%%% scaling forward probabilities
for t=1:T
c = 1 / sum(alpha(t,:));
for i2=1:n
alpha(t,i2) = alpha(t,i2) * c;
end
end
%computes backward probabilitis
for t=(T-1):(-1) : 1
rightVector=Q_star(:,t+1).* beta( t+1 ,:)' ;
beta ( t , : ) = P_star* rightVector ;
end
%%% scaling backward probabilities
for t=1:T
d = 1 / sum(beta(t,:));
for i2=1:n
beta(t,i2) = beta(t,i2) * d;
end
end
%computing gamma variable
sigma_ab = zeros(1,T);
for t=1:T
for j=1:n
sigma_ab(1,t) = sigma_ab(1,t) + (alpha(t,j)*beta(t,j));
end
end
for t=1:T
for j=1:n
gamma(j,t) = ((alpha(t,j)*beta(t,j))/sigma_ab(1,t));
end
end
%computing kesi
makhraj_k = zeros(1,T);
for t=1:T
for i_2=1:n
makhraj_k(1,t) = makhraj_k(1,t) + alpha(t,i_2);
end
end
for t=1:T-1
for i_2=1:n
for j=1:n
kesi(i_2,j,t) = (alpha(t,i_2)*P_star(i_2,j)*beta(t+1,j)*Q_star(j,t+1))/makhraj_k(1,t);
end
end
end
index = index -1;
end %end while
那么我现在应该为这个缩放问题做些什么呢?这个NaN
值是因为缩放问题还是其他原因?
谢谢你的时间。