-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmixGaussPred.m
37 lines (34 loc) · 917 Bytes
/
mixGaussPred.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function [label, R] = mixGaussPred(X, model)
% Predict label and responsibility for Gaussian mixture model.
% 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 ([email protected]).
mu = model.mu;
Sigma = model.Sigma;
w = model.w;
n = size(X,2);
k = size(mu,2);
logRho = zeros(n,k);
for i = 1:k
logRho(:,i) = loggausspdf(X,mu(:,i),Sigma(:,:,i));
end
logRho = bsxfun(@plus,logRho,log(w));
T = logsumexp(logRho,2);
logR = bsxfun(@minus,logRho,T);
R = exp(logR);
[~,label(1,:)] = max(R,[],2);
function y = loggausspdf(X, mu, Sigma)
d = size(X,1);
X = bsxfun(@minus,X,mu);
[U,p]= chol(Sigma);
if p ~= 0
error('ERROR: Sigma is not PD.');
end
Q = U'\X;
q = dot(Q,Q,1); % quadratic term (M distance)
c = d*log(2*pi)+2*sum(log(diag(U))); % normalization constant
y = -(c+q)/2;