% 维特比算法实现
% 参考:李航《统计学习方法》 P208
% Author: xueqing, 2019-08-19
%% 输入
% A: 盒子状态转移矩阵
% B: 观测概率矩阵;
% pi:初始概率分布
% Ou: 观测序列
A = [0.5, 0.2, 0.3; 0.3, 0.5, 0.2; 0.2, 0.3, 0.5];
B = [0.5, 0.5; 0.4, 0.6; 0.7, 0.3];
pi = [0.2; 0.4; 0.4];
Ou = [1, 2, 1]; % 1表示红,2表示白
%% 算法过程
delta = zeros(length(A), length(Ou)); % 状态记录矩阵
Phi = zeros(size(delta)); % 状态回溯矩阵
% 初始化
delta(:,1) = pi .* B(:,Ou(1));
% 迭代
for t = 2:length(Ou) % 对每个时刻
for h = 1:length(A) % 对每个盒子/状态
[delta(h,t), idx] = max( delta(:,t-1).* A(:,h) * B(h,Ou(t)) );
Phi(h,t) = idx; % 相对于书上的公式多了bi(o);对结果无影响
end
end
% 确定最优路径
[Px, ix] = max(delta(:,length(Ou))); % Px:最优路径概率;ix:最优路径终点
% 回溯
I = zeros(size(Ou)); % 记录最优路径的矩阵/向量
I(length(Ou)) = ix;
for t = length(Ou)-1:-1:1
ixt = Phi(I(t+1),t+1);
I(t) = ixt;
end
%% 输出
% I: 最优路径
I
维特比算法实现 李航《统计学习方法》
最新推荐文章于 2022-04-30 19:24:38 发布