64 lines
1.5 KiB
Matlab
Executable File
64 lines
1.5 KiB
Matlab
Executable File
% Class for Gaussian distribution used by Dirichlet process
|
|
classdef Gauss
|
|
properties
|
|
n_
|
|
mu_
|
|
U_
|
|
end
|
|
|
|
methods
|
|
function obj = Gauss(X)
|
|
n = size(X,2);
|
|
mu = mean(X,2);
|
|
U = chol(X*X');
|
|
|
|
obj.n_ = n;
|
|
obj.mu_ = mu;
|
|
obj.U_ = U;
|
|
end
|
|
|
|
function obj = clone(obj)
|
|
end
|
|
|
|
function obj = addSample(obj, x)
|
|
n = obj.n_;
|
|
mu = obj.mu_;
|
|
U = obj.U_;
|
|
|
|
n = n+1;
|
|
mu = mu+(x-mu)/n;
|
|
U = cholupdate(U,x,'+');
|
|
|
|
obj.n_ = n;
|
|
obj.mu_ = mu;
|
|
obj.U_ = U;
|
|
end
|
|
|
|
function obj = delSample(obj, x)
|
|
n = obj.n_;
|
|
mu = obj.mu_;
|
|
U = obj.U_;
|
|
|
|
n = n-1;
|
|
mu = mu-(x-mu)/n;
|
|
U = cholupdate(U,x,'-');
|
|
|
|
obj.n_ = n;
|
|
obj.mu_ = mu;
|
|
obj.U_ = U;
|
|
end
|
|
|
|
function y = logPdf(obj,X)
|
|
n = obj.n_;
|
|
mu = obj.mu_;
|
|
U = obj.U_;
|
|
d = size(X,1);
|
|
|
|
U = cholupdate(U/sqrt(n),mu,'-'); % Sigma=X*X'/n-mu*mu'
|
|
Q = U'\bsxfun(@minus,X,mu);
|
|
q = dot(Q,Q,1); % quadratic term (M distance)
|
|
c = d*log(2*pi)+2*sum(log(diag(U))); % normalization constant
|
|
y = -0.5*(c+q);
|
|
end
|
|
end
|
|
end |