sustaining_gazes/matlab_version/pdm_generation/nrsfm-em/mstep_lds_update.m

37 lines
1.1 KiB
Matlab

function [phi, Q, sigma_sq, mu0, sigma0] = mstep_lds_update(y, M, xt_n, Pt_n, Ptt1_n)
% Adapted from code written by Hrishi Deshpande
% M-step as described in Shumway, R.H. & Stoffer, D.S. (1982), "An approach to time series smoothing and forecasting using the EM algorithm",
% Journal of Time Series Analysis, 3, 253-264
q = size(y, 1);
n = size(y, 2)-1;
p = size(M{2}, 2);
%- - - - - - - - - -
% Eqns (9)-(11)
A = zeros(p); B = zeros(p); C = zeros(p);
for t=1:n
tIdx = t+1;
A = A + Pt_n{tIdx-1} + xt_n(:,tIdx-1) * xt_n(:,tIdx-1)';
B = B + Ptt1_n{tIdx} + xt_n(:,tIdx) * xt_n(:,tIdx-1)';
C = C + Pt_n{tIdx} + xt_n(:,tIdx) * xt_n(:,tIdx)';
end
%- - - - - - - - - -
% Eqns (12)-(14)
invA = inv(A);
phi = B * invA;
Q = (C - B*invA*B') / n;
R = zeros(q);
for t=1:n
tIdx = t+1;
R = R + (y(:,tIdx)-M{tIdx}*xt_n(:,tIdx)) * (y(:,tIdx)-M{tIdx}*xt_n(:,tIdx))' + ...
M{tIdx}*Pt_n{tIdx}*M{tIdx}';
end
R = R / n;
R = eye(q)*mean(diag(R));
sigma_sq = R(1,1);
mu0 = xt_n(:, 1); % (Eq 22, Ghahramani 1996)
sigma0 = Pt_n{1}; % (Eq 24, Ghahramani 1996)