维特比算法实现 李航《统计学习方法》

% 维特比算法实现
% 参考:李航《统计学习方法》 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

你可能感兴趣的:(算法,机器学习,Matlab)