gmmeval.m

来自「一个关于数据聚类和模式识别的程序,在生物化学,化学中因该都可以用到.希望对大家有」· M 代码 · 共 98 行

M
98
字号
function [logProb, gaussianProb] = gmmEval(data, gmmParam);
% gmmEval: Evaluation of a GMM (Gaussian mixture model)
%	Usage: [logProb, gaussianProb] = gmmEval(data, gmmParam);
%		data: dim x dataNum matrix where each column is a data point
%		gmmParam(i): Parameters for Gaussian component i
%			gmmParam(i).mu: a mean vector of dim x 1
%			gmmParam(i).sigma: a covariance matrix of 3 possible dimensions:
%				1 x 1: identity covariance matrix times a constant for each Gaussian
%				dim x 1: diagonal covariance matrix for each Gaussian
%				dim x dim: full covariance matrix for each Gaussian
%			gmmParam(i).w: a weighting factor
%		logProb: 1 x dataNum vector of output probabilities
%		gaussianProb(i,j) is the probability of data(:,j) to the i-th Gaussian (This is for gmmTrain.m only)
%
%	For example, to plot 2D GMM:
%
%		data=linspace(-10, 10, 101);
%		gmmParam(1).mu = -5; gmmParam(1).sigma = 1; gmmParam(1).w = 0.1;
%		gmmParam(2).mu =  0; gmmParam(2).sigma = 4; gmmParam(2).w = 0.5;
%		gmmParam(3).mu =  5; gmmParam(3).sigma = 3; gmmParam(3).w = 0.4;
%		logProb = gmmEval(data, gmmParam);
%		prob=exp(logProb);
%		figure; plot(data, prob, '.-');
%		line(data, gmmParam(1).w*gaussian(data, gmmParam(1)), 'color', 'r');
%		line(data, gmmParam(2).w*gaussian(data, gmmParam(2)), 'color', 'm');
%		line(data, gmmParam(3).w*gaussian(data, gmmParam(3)), 'color', 'g');
%
%	Another example to plot 3D GMM:
%
%		gmmParam(1).mu = [-3, 3]'; gmmParam(1).sigma = [5, 2]'; gmmParam(1).w = 0.3;
%		gmmParam(2).mu = [3, -3]'; gmmParam(2).sigma = [4, 1]'; gmmParam(2).w = 0.3;
%		gmmParam(3).mu =  [3, 3]'; gmmParam(3).sigma = [1, 4]'; gmmParam(3).w = 0.4;
%		bound = 8;
%		pointNum = 51;
%		x = linspace(-bound, bound, pointNum);
%		y = linspace(-bound, bound, pointNum);
%		[xx, yy] = meshgrid(x, y);
%		data = [xx(:), yy(:)]';
%		logProb = gmmEval(data, gmmParam);
%		zz = reshape(exp(logProb), pointNum, pointNum);
%		subplot(2,2,1);
%		mesh(xx, yy, zz); axis tight; box on
%		subplot(2,2,2);
%		contour(xx, yy, zz, 30); axis image; box on

%	Roger Jang, 20000602, 20080726

if nargin<1, selfdemo; return; end

[dim, dataNum]=size(data);
gaussianNum=length(gmmParam);
log2pi=log(2*pi);
logProb=zeros(1, dataNum);
logGaussianProb=zeros(gaussianNum, dataNum);

if prod(size(gmmParam(1).sigma))==1	% identity covariance matrix times a constant for each Gaussian
	for i=1:gaussianNum
		dataMinusMu = data-repmat(gmmParam(i).mu, 1, dataNum);
		logGaussianProb(i,:) = (-sum(dataMinusMu.*dataMinusMu, 1)/gmmParam(i).sigma-dim*(log2pi+log(gmmParam(i).sigma)))/2;
	end
elseif prod(size(gmmParam(1).sigma))==dim	% diagonal covariance matrix for each Gaussian
	for i=1:gaussianNum
		dataMinusMu = data-repmat(gmmParam(i).mu, 1, dataNum);
		logGaussianProb(i,:) = (-sum(dataMinusMu.*dataMinusMu./repmat(gmmParam(i).sigma, 1, dataNum), 1)-dim*log2pi-log(prod(gmmParam(i).sigma)))/2;
	end
else	% full covariance matrix for each Gaussian
	for i=1:gaussianNum
		dataMinusMu = data-repmat(gmmParam(i).mu, 1, dataNum);
		logGaussianProb(i,:) = (-sum((inv(gmmParam(i).sigma)'*dataMinusMu).*dataMinusMu, 1)-dim*log2pi-log(det(gmmParam(i).sigma)))/2;
	end
end

logw=log([gmmParam.w]');
for i=1:dataNum
	logProb(i)=mixLogSumMex(logw(:)+logGaussianProb(:,i));
end

if nargout>1
	gaussianProb=exp(logGaussianProb);	% This output is necessary for gmmTrain.m!
end

% ====== Self demo
function selfdemo
gmmParam(1).mu = [-3, 3]'; gmmParam(1).sigma = [5, 2]'; gmmParam(1).w = 0.3;
gmmParam(2).mu = [3, -3]'; gmmParam(2).sigma = [4, 1]'; gmmParam(2).w = 0.3;
gmmParam(3).mu =  [3, 3]'; gmmParam(3).sigma = [1, 4]'; gmmParam(3).w = 0.4;
bound = 8;
pointNum = 51;
x = linspace(-bound, bound, pointNum);
y = linspace(-bound, bound, pointNum);
[xx, yy] = meshgrid(x, y);
data = [xx(:), yy(:)]';
logProb = gmmEval(data, gmmParam);
zz = reshape(exp(logProb), pointNum, pointNum);
subplot(2,2,1);
mesh(xx, yy, zz); axis tight; box on
subplot(2,2,2);
contour(xx, yy, zz, 30); axis image; box on

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?