www.gusucode.com > classification_matlab_toolbox分类方法工具箱源码程序 > code/Classification_toolbox/Other/Bayesian_parameter_est.m

    function [mu, sigma] = Bayesian_parameter_est(train_features, train_targets, sigma, region)

% Estimate the mean using the Bayesian parameter estimation for Gaussian mixture algorithm
% Inputs:
% 	features	- Train features
%	targets	- Train targets
%	sigma		- The covariance matrix for each class 
%	region	- Decision region vector: [-x x -y y number_of_points]
%
% Outputs
%	mu			- The estimated mean
%	sigma		- The estimated covariances

[N,M]		= size(train_features);
Uclasses = unique(train_targets);
Nuc		= length(Uclasses);

%Find initial estimates for mu and sigma for the classes
mu0		= zeros(Nuc, N);
sigma0	= zeros(Nuc, N, N);
for i = 1:Nuc,
	indices	= find(train_targets == Uclasses(i));
   mu0(i,:) = mean(train_features(:,indices)');
   sigma0(i,:,:) = sqrtm(cov(train_features(:,indices)',1));
end

%Now gradually find the Bayesian estimate
mu_n		= zeros(Nuc, N);
sigma_n	= zeros(Nuc, N, N);

%For each class, estimate the mean and variance for each class
for i = 1:Nuc,
	indices	= find(train_targets == Uclasses(i));
   for n = 2:length(indices),
      indices		= indices(randperm(length(indices)));
      samples		= indices(1:n);
      
      mu_n_hat		= 1/n*sum(train_features(:,samples)')';
      mu_n(i,:)	= (squeeze(sigma0(i,:,:))*inv(squeeze(sigma0(i,:,:))+1/n*squeeze(sigma(i,:,:)))*mu_n_hat + ...
                  + 1/n*squeeze(sigma(i,:,:))*inv(squeeze(sigma0(i,:,:))+1/n*squeeze(sigma(i,:,:)))*mu0(i,:)')';
      sigma_n(i,:,:) = squeeze(sigma0(i,:,:))*inv(squeeze(sigma0(i,:,:))+1/n*squeeze(sigma(i,:,:)))*1/n*squeeze(sigma(i,:,:));
   end
end

%Return the estimates
mu 	= mu_n;
sigma = sigma + sigma_n;