如需转载请注明出处!
GMM的初探,有理论出入的地方还请见谅并指正,提前谢过!
基础部分预习:
1. 行列式
2. 协方差与协方差矩阵
实际工程实现中,对于离散的随机变量,由于实际的采样数据量是有限的,因此对于描述统计特性的基本统计变量的计算如下所示:
均值:
标准差:
方差:
通过MATLAB举个计算协方差矩阵的例子。
MySample = fix(rand(10,3)*50) |
本例子中样本点的个数为10,每个样本点为3维向量。首先,我们手动计算协方差矩阵的对角线单边数据:
dim1 = MySample(:,1);dim2 = MySample(:,2);dim3 = MySample(:,3);
sum( (dim1-mean(dim1)) .* (dim2-mean(dim2)) ) / ( size(MySample,1)-1 ) % 得到 74.5333 sum( (dim1-mean(dim1)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到 -10.0889 sum( (dim2-mean(dim2)) .* (dim3-mean(dim3)) ) / ( size(MySample,1)-1 ) % 得到 -106.4000 |
协方差矩阵的对角线就是各个维度上的方差,下面我们依次计算
|
std(dim1)^2 % 得到 108.3222 std(dim2)^2 % 得到 260.6222 std(dim3)^2 % 得到 94.1778 |
这样,我们就得到了计算协方差矩阵所需要的所有数据,调用Matlab自带的cov函数进行验证:
3. n维随机向量的单高斯分布
4. GMM高斯混合模型
GMM高斯混合模型之所以被广泛应用在统计分析中,是因为任意概率分布模型都可以通过多个高斯分布通过加权组合的方式去逼近。应用的高斯分布个数越多,对数据分布模型的逼近越近似。
GMM混合模型的概率密度函数的数学表达为:
现在假设我们有 个数据点,并假设它们服从某个分布(记作 ),现在要确定里面的一些参数的值,例如,在 GMM 中,我们就需要确定 、 和 这些参数。 我们的想法是,找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于 ,我们把这个乘积称作似然函数 (Likelihood Function)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和 ,得到 log-likelihood function 。
下面让我们来看一看 GMM 的 log-likelihood function:
由于在对数函数里面又有加和,我们没法直接用求导解方程的办法直接求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步,实际上也就类似于 K-means的两步。adsfadsf
adsfadsf
adsfadsf
1.估计数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据 来说,它由第 个 Component 生成的概率为:
由于式子里的 和 也是需要我们估计的值,我们采用迭代法,在计算 的时候我们假定 和 均已知,我们将取上一次迭代所得的值(或者初始值)。
2.估计每个 Component 的参数:现在我们假设上一步中得到的 就是正确的“数据 由 Component 生成的概率”,亦可以当做该 Component 在生成这个数据上所做的贡献,或者说,我们可以看作 这个值其中有 这部分是由 Component 所生成的。集中考虑所有的数据点,现在实际上可以看作 Component 生成了 这些点。由于每个 Component 都是一个标准的 Gaussian 分布,可以很容易分布求出最大似然所对应的参数值:
其中 ,并且 也顺理成章地可以估计为 。
3. 重复迭代前两步,知道收敛为止。
所谓收敛:不断迭代EM步骤,更新参数,直到似然函数前后差值小于一个阈值,或者参数前后之间的差(一般选择欧式距离)小于某个阈值
Matlab代码如下:
function [Priors, Mu, Sigma] = EM_init_kmeans(Data, nbStates)
% Inputs -----------------------------------------------------------------
% o Data: D x N array representing N datapoints of D dimensions.
% o nbStates: Number K of GMM components.
% Outputs ----------------------------------------------------------------
% o Priors: 1 x K array representing the prior probabilities of the
% K GMM components.
% o Mu: D x K array representing the centers of the K GMM components.
% o Sigma: D x D x K array representing the covariance matrices of the
% K GMM components.
% Comments ---------------------------------------------------------------
% o This function uses the 'kmeans' function from the MATLAB Statistics
% toolbox. If you are using a version of the 'netlab' toolbox that also
% uses a function named 'kmeans', please rename the netlab function to
% 'kmeans_netlab.m' to avoid conflicts.
[nbVar, nbData] = size(Data);
%Use of the 'kmeans' function from the MATLAB Statistics toolbox
[Data_id, Centers] = kmeans(Data', nbStates);
Mu = Centers';
for i=1:nbStates
idtmp = find(Data_id==i);
Priors(i) = length(idtmp);
Sigma(:,:,i) = cov([Data(:,idtmp) Data(:,idtmp)]');
%Add a tiny variance to avoid numerical instability
Sigma(:,:,i) = Sigma(:,:,i) + 1E-5.*diag(ones(nbVar,1));
end
Priors = Priors ./ sum(Priors);
(2)E步
%% E-step %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:nbStates
%Compute probability p(x|i)
Pxi(:,i) = gaussPDF(Data, Mu(:,i), Sigma(:,:,i));
end
%Compute posterior probability p(i|x)
Pix_tmp = repmat(Priors,[nbData 1]).*Pxi;
Pix = Pix_tmp ./ repmat(sum(Pix_tmp,2),[1 nbStates]);
%Compute cumulated posterior probability
E = sum(Pix);
function prob = gaussPDF(Data, Mu, Sigma)
% Inputs -----------------------------------------------------------------
% o Data: D x N array representing N datapoints of D dimensions.
% o Mu: D x K array representing the centers of the K GMM components.
% o Sigma: D x D x K array representing the covariance matrices of the
% K GMM components.
% Outputs ----------------------------------------------------------------
% o prob: 1 x N array representing the probabilities for the
% N datapoints.
[nbVar,nbData] = size(Data);
Data = Data' - repmat(Mu',nbData,1);
prob = sum((Data*inv(Sigma)).*Data, 2);
prob = exp(-0.5*prob) / sqrt((2*pi)^nbVar * (abs(det(Sigma))+realmin));
(3)M步
%% M-step %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:nbStates
%Update the priors
Priors(i) = E(i) / nbData;
%Update the centers
Mu(:,i) = Data*Pix(:,i) / E(i);
%Update the covariance matrices
Data_tmp1 = Data - repmat(Mu(:,i),1,nbData);
Sigma(:,:,i) = (repmat(Pix(:,i)',nbVar, 1) .* Data_tmp1*Data_tmp1') / E(i);
%% Add a tiny variance to avoid numerical instability
Sigma(:,:,i) = Sigma(:,:,i) + 1E-5.*diag(ones(nbVar,1));
end
(4)截止条件
while 1
%% E-step %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:nbStates
%Compute probability p(x|i)
Pxi(:,i) = gaussPDF(Data, Mu(:,i), Sigma(:,:,i));
end
%Compute posterior probability p(i|x)
Pix_tmp = repmat(Priors,[nbData 1]).*Pxi;
Pix = Pix_tmp ./ repmat(sum(Pix_tmp,2),[1 nbStates]);
%Compute cumulated posterior probability
E = sum(Pix);
%% M-step %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:nbStates
%Update the priors
Priors(i) = E(i) / nbData;
%Update the centers
Mu(:,i) = Data*Pix(:,i) / E(i);
%Update the covariance matrices
Data_tmp1 = Data - repmat(Mu(:,i),1,nbData);
Sigma(:,:,i) = (repmat(Pix(:,i)',nbVar, 1) .* Data_tmp1*Data_tmp1') / E(i);
%% Add a tiny variance to avoid numerical instability
Sigma(:,:,i) = Sigma(:,:,i) + 1E-5.*diag(ones(nbVar,1));
end
%% Stopping criterion %%%%%%%%%%%%%%%%%%%%
for i=1:nbStates
%Compute the new probability p(x|i)
Pxi(:,i) = gaussPDF(Data, Mu(:,i), Sigma(:,:,i));
end
%Compute the log likelihood
F = Pxi*Priors';
F(find(F
参考资料:
http://blog.csdn.net/crzy_sparrow/article/details/7413019
http://blog.pluskid.org/?p=39
http://blog.163.com/baolong_zhu/blog/static/196311091201421185531966/
http://www.cnblogs.com/luxiaoxun/archive/2013/05/10/3071672.htm