維特比算法實現 李航《統計學習方法》

% 維特比算法實現
% 參考:李航《統計學習方法》 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章