% 維特比算法實現
% 參考:李航《統計學習方法》 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
維特比算法實現 李航《統計學習方法》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.