34 lines
1.0 KiB
Matlab
Executable File
34 lines
1.0 KiB
Matlab
Executable File
function [z, R] = mixGaussVbPred(model, X)
|
|
% Predict label and responsibility for Gaussian mixture model trained by VB.
|
|
% Input:
|
|
% X: d x n data matrix
|
|
% model: trained model structure outputed by the EM algirthm
|
|
% Output:
|
|
% label: 1 x n cluster label
|
|
% R: k x n responsibility
|
|
% Written by Mo Chen (sth4nth@gmail.com).
|
|
alpha = model.alpha; % Dirichlet
|
|
kappa = model.kappa; % Gaussian
|
|
m = model.m; % Gasusian
|
|
v = model.v; % Whishart
|
|
U = model.U; % Whishart
|
|
logW = model.logW;
|
|
n = size(X,2);
|
|
[d,k] = size(m);
|
|
|
|
EQ = zeros(n,k);
|
|
for i = 1:k
|
|
Q = (U(:,:,i)'\bsxfun(@minus,X,m(:,i)));
|
|
EQ(:,i) = d/kappa(i)+v(i)*dot(Q,Q,1); % 10.64
|
|
end
|
|
ElogLambda = sum(psi(0,0.5*bsxfun(@minus,v+1,(1:d)')),1)+d*log(2)+logW; % 10.65
|
|
Elogpi = psi(0,alpha)-psi(0,sum(alpha)); % 10.66
|
|
logRho = -0.5*bsxfun(@minus,EQ,ElogLambda-d*log(2*pi)); % 10.46
|
|
logRho = bsxfun(@plus,logRho,Elogpi); % 10.46
|
|
logR = bsxfun(@minus,logRho,logsumexp(logRho,2)); % 10.49
|
|
R = exp(logR);
|
|
z = zeros(1,n);
|
|
[~,z(:)] = max(R,[],2);
|
|
[~,~,z(:)] = unique(z);
|
|
|