2012-03-20 34 views
2

MATLAB统计工具箱函数hmmtrain.m似乎假设模型在训练序列之前最初处于状态1。有什么办法可以关掉这个“功能”?举例:MATLAB的hmmtrain假定从状态1开始初始转换

>> y = [ 3 3 1 2 3 ]; 
>> H = eye(3); 
>> T = ones(3)/3; 
>> [ T, H ] = hmmtrain(y, T, H) 

T = 

     0 0.5000 0.5000 
     0   0 1.0000 
    0.5000   0 0.5000 


H = 

    1  0  0 
    0  1  0 
    0  0  1 

训练集不包含从1到3的转换。为什么T(1,3)非零?!

+0

我不完全确定,因为我没有在我面前的计算机上的Matlab,但它看起来像你想要适应与已知状态,而不是未知的模型。 [Mathworks建议在这种情况下使用'hmmestimate()'](http://www.mathworks.com/help/toolbox/stats/hmmestimate.html)。虽然我完全同意你显示的输出对于Matlab来说是一件非常愚蠢的事情,但也许尝试'hmmestimate()'会让你在正确的轨道上? – ely 2012-03-20 16:39:53

+0

感谢您的提示,EMS。尽管出现了,但我确实希望通常只是从与国家不同的发射符号中学习。在上面的例子中,我使用了H = eye(3),以便更容易跟踪。 – Clark 2012-03-21 02:00:33

回答

1

我为hmmtrain编写了以下包装函数,它创建一个仅用于模型初始状态的特殊状态1。从外部呼叫者的角度来看,它不存在,你只能得到训练序列符号之间转换的统计信息;它对系统的初始状态一无所知。

% MYHMMTRAIN - Wrapper on HMMTRAIN that removes "initial state" effects 

    function [ T, H ] = myhmmtrain(y, T, H, varargin) 

    % hmmtrain assumes the system always starts in state 1, 
    % so we create a "state 1" that isn't used for anything else 
    N = size(T,1); 
    T = [ 0   ones(1,N)/N; ... 
     zeros(N,1) T ]; 
    M = size(H,2); 
    H = [ zeros(1,M); H ]; 

    % train 
    [ T, H ] = hmmtrain(y, T, H, varargin{:}); 

    % remove false state 1 
    T = T(2:end,2:end); 
    H = H(2:end,:); 

    end