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

参考论文“Linear Time Inference in Hierarchical HMMs”,示例文件夹:..\bnt\BNT\examples\dynamic\HHMM\abcd_hhmm.m

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;    % 第三层的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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值