Проблема масштабирования алгоритма Баума-Уэлча — Matlab

Я реализую алгоритм Баума-Уэлча в 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 значений из-за проблем с масштабированием или из-за чего-то еще?
Спасибо за ваше время.


person Community    schedule 26.03.2016    source источник
comment
Прошло некоторое время с тех пор, как я в последний раз работал с HMM, но вы можете взглянуть на BNT Кевина Мерфи. и HMM. Это будут функции dhmm_em и mhmm_em, которые реализуют алгоритм EM (Баума-Уэлча) для дискретных и непрерывных случаев: github.com/bayesnet/bnt/tree/master/HMM. MATLAB также имеет hmmtrain в панели инструментов статистики только для дискретного HMM. Вы можете видеть, как они определяют допуск как критерий остановки.   -  person Amro    schedule 26.03.2016
comment
конечно, основополагающая статья Лоуренса Рабинера незаменима здесь. Также есть статья: Численно стабильная реализация скрытой марковской модели о коэффициентах масштабирования и числовой стабильности реализаций HMM.   -  person Amro    schedule 26.03.2016
comment
@ Амро, спасибо, я посмотрю на это. но я должен изменить этот код на C и не хочу использовать предопределенные функции Matlab. Я уже видел наборы инструментов BNT и HMM Кевина Мерфи, на самом деле я нашел их немного сложными и запутанными, и я не могу найти в них ответ на свой первый вопрос.   -  person    schedule 26.03.2016
comment
Я нашел ответ на свой второй вопрос. Значения NaN появляются, когда последовательность наблюдений увеличивается. в моем случае после T>100. Поэтому я подумал, что процедуры масштабирования не могут решить мою проблему, и использовал пространство логарифмов для сравнения вероятностей. вот источник: Численно устойчивая реализация скрытой марковской модели Тобиаса П. Мэнна. Я все еще ищу ответ на первый вопрос.   -  person    schedule 10.04.2016
comment
это та же статья, о которой я упоминал в своем предыдущем комментарии :) Вероятности - это небольшие числа от 0 до 1, умножение многих вероятностей вместе из длинных последовательностей может быстро привести к недооценке, достигнув нуля с помощью арифметики с плавающей запятой, поэтому вы, вероятно, получите NaN в промежуточных вычислениях где-то ... В приведенной выше статье предлагается работать в логарифмическом масштабе с хорошим свойством log(a*b) = log(a) + log(b)   -  person Amro    schedule 10.04.2016
comment
Что касается сходимости, обычно это решается путем проверки того, не значительно ли улучшается логарифмическая правдоподобие данных для некоторого количества итераций. Итак, если LL_new - LL_old < threshold верно, скажем, для 5 итераций, вы останавливаетесь. Вы определяете приемлемый порог и максимальное количество итераций.   -  person Amro    schedule 10.04.2016