Я реализую алгоритм Баума-Уэлча в Matlab по этой ссылке в Википедии: Baum- Алгоритм Уэлча. Это часть моего прогнозирования волатильности в финансовых временных рядах.
У меня есть два вопроса:
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
и beta
) и один в знаменателе (только alpha
). Таким образом, они не будут отменять эффект друг друга. Я реализовал уравнения (например, в цикле, который повторяется 20 раз) и выполнил процедуру масштабирования. но "матрица вероятности перехода", "начальное распределение" и "матрица выбросов" получают NaN
значений!!!
Я прочитал ответ на этот вопрос много возможных наблюдений Баума-Уэлча. Я сделал масштабирование на основе учебника, упомянутого там.
Вот мой код:
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
значений из-за проблем с масштабированием или из-за чего-то еще?
Спасибо за ваше время.
dhmm_em
иmhmm_em
, которые реализуют алгоритм EM (Баума-Уэлча) для дискретных и непрерывных случаев: github.com/bayesnet/bnt/tree/master/HMM. MATLAB также имеетhmmtrain
в панели инструментов статистики только для дискретного HMM. Вы можете видеть, как они определяют допуск как критерий остановки. - person Amro   schedule 26.03.2016NaN
появляются, когда последовательность наблюдений увеличивается. в моем случае послеT>100
. Поэтому я подумал, что процедуры масштабирования не могут решить мою проблему, и использовал пространство логарифмов для сравнения вероятностей. вот источник: Численно устойчивая реализация скрытой марковской модели Тобиаса П. Мэнна. Я все еще ищу ответ на первый вопрос. - person   schedule 10.04.2016log(a*b) = log(a) + log(b)
- person Amro   schedule 10.04.2016LL_new - LL_old < threshold
верно, скажем, для 5 итераций, вы останавливаетесь. Вы определяете приемлемый порог и максимальное количество итераций. - person Amro   schedule 10.04.2016