参考论文“Linear Time Inference in Hierarchical HMMs”,示例文件夹:..\bnt\BNT\examples\dynamic\HHMM\abcd_hhmm.m
Sample 1. 建立已知结构的HHMM模型

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; % 第三层的end节点编号
% 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; % DBN中不同节点的编号
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
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; % 第三层的end节点编号
% 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; % DBN中不同节点的编号
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