gmminitparamset.m

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

M
78
字号
function gmmParam=gmmInitParamSet(data, gaussianNum, covType, gmmTrainParam);
% gmmParamSet: Set a set of initial parameters for GMM
%	Usage: gmmParam=gmmInitParamSet(data, gaussianNum, covType, gmmTrainParam);

%	Roger Jang, 20080726

if nargin<2, gaussianNum=3; end
if nargin<3, covType=1; end
if nargin<4, gmmTrainParam=gmmTrainParamSet; end
[dim, dataNum]=size(data);

for i=1:gaussianNum
	gmmParam(i).mu = zeros(dim, 1);
	gmmParam(i).w = 1/gaussianNum;
	switch covType
		case 1
			gmmParam(i).sigma = 1;
		case 2
			gmmParam(i).sigma = ones(dim, 1);
		case 3
			gmmParam(i).sigma = diag(ones(dim, 1));
		otherwise
			disp('Unknown covType!')
	end
end

% === Set the mean vectors
% Here we try several methods to find the initial mean vectors
if gmmTrainParam.useKmeans
	if gmmTrainParam.dispOpt, fprintf('\tStart KMEANS to find the initial mean vectors...\n'); end
%	muMat = vqKmeansMex(data, gaussianNum, 0);			% Method 1: Fast but less robust
	muMat = vqKmeans(data, gaussianNum, 0);			% Method 2: Slow but more robust
	if any(any(~isfinite(muMat)))
		muMat = vqLBG(data, gaussianNum, 0);			% Try another method of vqLBG
	end
	if any(any(~isfinite(muMat)))
		muMat = data(:, 1+floor(rand(gaussianNum,1)*dataNum));	% Try another method of random selection
	end	
else
	muMat = data(:, 1+floor(rand(gaussianNum,1)*dataNum));	% Randomly select several data points as the centers
end
% Set the intitial mean vectors of gmmParam
meanCell=mat2cell(muMat, dim, ones(1, gaussianNum));
[gmmParam.mu]=deal(meanCell{:});

% ====== Set the initial covariance matrix
dataRange=max(data, [], 2)-min(data, [], 2);
if gmmTrainParam.useKmeans
	% ====== Set the initial covariance matrix as the min squared distance between centers
	sqrDist=pairwiseSqrDistance(muMat);
%	sqrDist(1:(gaussianNum+1):gaussianNum^2)=inf;	% Diagonal elements are inf
	meanSqrDist = mean(mean(sqrDist))/2*log(2);;			% Initial variance for each Gaussian
	meanSqrDist = max(meanSqrDist, gmmTrainParam.minVariance);
	if gaussianNum==1, meanSqrDist=(mean(dataRange)/5)^2; end	% If there is only a single Gaussian, set it to a reasonable value
	% Set the initial covariance matrix of gmmParam
	for i=1:gaussianNum
		gmmParam(i).sigma=meanSqrDist*gmmParam(i).sigma;
	end
else
	% ====== Set the initial covariance matrix by the range of the input data
	switch covType
		case 1
			for i=1:gaussianNum
				gmmParam(i).sigma = (mean(dataRange)/5)^2;
			end
		case 2
			for i=1:gaussianNum
				gmmParam(i).sigma = (dataRange/5).^2;
			end
		case 3
			for i=1:gaussianNum
				gmmParam(i).sigma = diag((dataRange/5).^2);
			end
		otherwise
			disp('Unknown covType!')
	end
end

⌨️ 快捷键说明

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