您的位置:首页 > 其它

基于Bayes Net ToolBox对层次隐马尔可夫模型进行建模、训练和推理

2016-01-08 11:37 274 查看
参考论文“Linear Time Inference in Hierarchical HMMs”,示例文件夹:..\bnt\BNT\examples\dynamic\HHMM

Sample 1. 建立已知结构的HHMM模型



对应的DBN模型如下图所示



Qsize = [2 3 2];    % 第1、2、3层的节点个数

Qnodes = 1:3;

D = 3;      % HHMM depth

transprob = cell(1,D);  % 层内状态转移概率

termprob = cell(1,D);   % 某状态到end的转移概率

startprob = cell(1,D);   % 某层初始状态概率

clear A;

%% LEVEL 1
%       1 2 e, 第一层有2个节点,它们之间不能相互转移,只能转移到end节点
A{1} = [0 0 1;

            0 0 1];
% 不将end状态作为一个节点, transporb表示nodes之间的转移概率,termprob表示node i到end的转移概率

% transprob矩阵的大小为Qsize(d)×Qsize(d-1)×Qsize(d), termprob大小为Qsize(d-1)×Qsize(d)
[transprob{1}, termprob{1}] = remove_hhmm_end_state(A{1});  

startprob{1} = [0.5 0.5];   % 先验分布

%% LEVEL 2      3    2 (above nodes) 4 (normal state + end)
A{2} = zeros(Qsize(2),  Qsize(1),      Qsize(2)+1);

%              1 2 3 e
A{2}(:,1,:) = [0 1 0 0      % Q1=1 => model below state 0

                    0 0 1 0

                    0 0 0 1];

%              5 6 7 e
A{2}(:,2,:) = [0 1 0 0      % Q1=2 => model below state 1

                    0 0 1 0

                    0 0 0 1];

[transprob{2}, termprob{2}] = remove_hhmm_end_state(A{2});      
% transprob{2}(:,1,:) = [0 1 0; 0 0 1; 0 0 0];  % 输出结果

% termprob{2} = [0 0 1; 0 0 1]; % 输出结果

% 先验分布,state 1 in level 1 always enter state 1 in level 2 
startprob{2} = [1 0 0

                         1 0 0];

%% LEVEL 3     2      3(父) 3(normal state + end)
A{3} = zeros([Qsize(3), Qsize(2), Qsize(3)+1]);

endstate = Qsize(3)+1;
%    Qt-1(3) Qt(2) Qt(3)
A{3}(1,      1,  endstate) = 1.0;  % below state 2/5

A{3}(:,      2,    :)      = [0.0 1.0 0.0 % below state 3/6

                               0.5 0.0 0.5]; 

A{3}(1,      3,  endstate) = 1.0;  % below state 4/7

[transprob{3}, termprob{3}] = remove_hhmm_end_state(A{3});      

startprob{3} = 'leftstart';

%% Observation LEVEl
chars = ['a', 'b', 'c', 'd', 'x', 'y'];

Osize = length(chars);

obsprob = zeros([Qsize Osize]);
%       1 2 3 O
obsprob(1,1,1,find(chars == 'a')) =  1.0;

obsprob(1,2,1,find(chars == 'x')) =  1.0;

obsprob(1,2,2,find(chars == 'y')) =  1.0;

obsprob(1,3,1,find(chars == 'b')) =  1.0;

obsprob(2,1,1,find(chars == 'c')) =  1.0;

obsprob(2,2,1,find(chars == 'x')) =  1.0;

obsprob(2,2,2,find(chars == 'y')) =  1.0;

obsprob(2,3,1,find(chars == 'd')) =  1.0;

Oargs = {'CPT', obsprob};

%% HHMM建模

bnet = mk_hhmm('Qsizes', Qsize, 'Osize', Osize, 'discrete_obs', 1, ...
      'Oargs', Oargs, 'Ops', Qnodes(1:3), ...
      'startprob', startprob, 'transprob', transprob, 'termprob', termprob);

Q1 = 1; Q2 = 2; Q3 = 3; F3 = 4; F2 = 5; Onode = 6;

Qnodes = [Q1 Q2 Q3]; Fnodes = [F2 F3];

% 从已知模型中生成样本序列

for seqi=1:3

  evidence = sample_dbn(bnet, 'stop_test', 'is_F2_true_D3');      

  ev = cell2num(evidence);

  chars(ev(end,:))
  %T = size(evidence, 2)

  %pretty_print_hhmm_parse(evidence, Qnodes, Fnodes, Onode, chars);
end

Sample 2. 通过样本训练HHMM模型

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: