www.pudn.com > training_gmm.rar > trGmms.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [GMMs,errLog,options,time] = trGmms(data,feat_type,feat_sel,m)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%train one type GMMs corresponding to selected features.
%input:
% data = train data with labels;
% feat_type = feature type;
% m = mix number
%output:
% GMMs = gauss mix models;
% errlog = log likehood of each iteration;
% time = run time.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Written by Qianyong Gao %%
%% Data:May 11,2006 %%
%% Update:June 27,2006 by Qianyong Gao %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tic;
if nargin < 3
m = 32;
end
label = unique(data(:,end));
if length(label) > 1
error('data belong to different kind of audio');
end
options = foptions;
options(14) = 12;
options(1) = 1.0;
GMMs = opt_gmm_init(data,m,options);
data(:,end) = [];
options(14) = 128;
[GMMs.centres,post] = mykmeans(GMMs.centres,data,options);
cluster_size = sum(post,1);
GMMs.priors = cluster_size / sum(cluster_size);
GMM_WIDTH = eps;
GMMs.covars = [];
%ncentres = GMMs.ncentres;
%centres = GMMs.centres;
%temp_data = data;
for j = 1:GMMs.ncentres
% Pick out data points belonging to this centre
c = data(find(post(:,j)),:);
if size(c,1) == 0% (size(data,1)/GMMs.ncentres)*1E-1
warning(['the ',num2str(j),'th is zero cluster']);
%GMMs.priors(j) = [];
%centres(j,:) = [];
%ncentres = ncentres - 1;
%temp_data(find(post(:,j)),:) = [];
GMMs.covars = [GMMs.covars;eps*ones(1,GMMs.nin)];
else
diffs = c - (ones(size(c,1),1)*GMMs.centres(j,:));
covj = sum((diffs.*diffs),1)/size(c,1);
%if ~any(covj>eps)
% warning('some identical input train data')
% centres(j,:) = [];
% GMMs.priors(j) = [];
% ncentres = ncentres - 1;
% temp_data(find(post(:,j)),:) = [];
%elseif any(covj>eps)
% GMMs.covars = [GMMs.covars;covj];
if any(covj