聚类算法之GMM聚类算法

1. 估计数据由每个 Component 生成的概率（并不是每个 Component 被选中的概率）：对于每个数据  来说，它由第  个 Component 生成的概率为

其中  ，并且  也顺理成章地可以估计为  。

2. 重复迭代前面两步，直到似然函数的值收敛为止。

（Update 2012.07.03：如果你直接把下面的代码拿去运行了，碰到 covariance 矩阵 singular 的情况，可以参见这篇文章。）

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 function varargout = gmm(X, K_or_centroids) % ============================================================ % Expectation-Maximization iteration implementation of % Gaussian Mixture Model. % % PX = GMM(X, K_OR_CENTROIDS) % [PX MODEL] = GMM(X, K_OR_CENTROIDS) % % - X: N-by-D data matrix. % - K_OR_CENTROIDS: either K indicating the number of % components or a K-by-D matrix indicating the % choosing of the initial K centroids. % % - PX: N-by-K matrix indicating the probability of each % component generating each point. % - MODEL: a structure containing the parameters for a GMM: % MODEL.Miu: a K-by-D matrix. % MODEL.Sigma: a D-by-D-by-K matrix. % MODEL.Pi: a 1-by-K vector. % ============================================================   threshold = 1e-15; [N, D] = size(X);   if isscalar(K_or_centroids) K = K_or_centroids; % randomly pick centroids rndp = randperm(N); centroids = X(rndp(1:K), :); else K = size(K_or_centroids, 1); centroids = K_or_centroids; end   % initial values [pMiu pPi pSigma] = init_params();   Lprev = -inf; while true Px = calc_prob();   % new value for pGamma pGamma = Px .* repmat(pPi, N, 1); pGamma = pGamma ./ repmat(sum(pGamma, 2), 1, K);   % new value for parameters of each Component Nk = sum(pGamma, 1); pMiu = diag(1./Nk) * pGamma' * X; pPi = Nk/N; for kk = 1:K Xshift = X-repmat(pMiu(kk, :), N, 1); pSigma(:, :, kk) = (Xshift' * ... (diag(pGamma(:, kk)) * Xshift)) / Nk(kk); end   % check for convergence L = sum(log(Px*pPi')); if L-Lprev < threshold break; end Lprev = L; end   if nargout == 1 varargout = {Px}; else model = []; model.Miu = pMiu; model.Sigma = pSigma; model.Pi = pPi; varargout = {Px, model}; end   function [pMiu pPi pSigma] = init_params() pMiu = centroids; pPi = zeros(1, K); pSigma = zeros(D, D, K);   % hard assign x to each centroids distmat = repmat(sum(X.*X, 2), 1, K) + ... repmat(sum(pMiu.*pMiu, 2)', N, 1) - ... 2*X*pMiu'; [dummy labels] = min(distmat, [], 2);   for k=1:K Xk = X(labels == k, :); pPi(k) = size(Xk, 1)/N; pSigma(:, :, k) = cov(Xk); end end   function Px = calc_prob() Px = zeros(N, K); for k = 1:K Xshift = X-repmat(pMiu(k, :), N, 1); inv_pSigma = inv(pSigma(:, :, k)); tmp = sum((Xshift*inv_pSigma) .* Xshift, 2); coef = (2*pi)^(-D/2) * sqrt(det(inv_pSigma)); Px(:, k) = coef * exp(-0.5*tmp); end end end 

• 本文已收录于以下专栏：

聚类算法之高斯混合模型

• sunanger_wang
• 2013年04月26日 09:17
• 17996

GMM的EM算法实现

• abcjennifer
• 2012年11月19日 11:03
• 104900

Spark2.0机器学习系列之10： 聚类(高斯混合模型 GMM）

Spark GMM 高斯混合模型概念 参数设置 模型评估 代码
• qq_34531825
• 2016年09月25日 18:46
• 5489

聚类算法K-Means, K-Medoids, GMM, Spectral clustering，Ncut

• abcjennifer
• 2012年11月11日 13:44
• 106931

GMM聚类算法的实现

• u014568921
• 2015年04月14日 23:04
• 1461

机器学习算法原理与实践（五）、GMM与K-means的那些事

【原创】Liu_LongPo 转载请注明出处【CSDN】http://blog.csdn.net/llp1992GMM算法GMM ，Gaussian Mixture Model，顾名思义，就是说该算法...
• llp1992
• 2015年07月25日 17:05
• 8796

聚类算法K-Means, K-Medoids, GMM, Spectral clustering，Ncut

• GarfieldEr007
• 2016年04月06日 13:02
• 1202

聚类算法实现与分析

• liuheng0111
• 2016年08月28日 23:34
• 3078

聚类(1)——混合高斯模型 Gaussian Mixture Model

• jiang1st2010
• 2012年06月14日 17:57
• 51365

EM算法（期望最大化）——从EM算法角度理解K-Means与GMM的区别

K-Means算法简介K-Means算法是一种常用的聚类算法，它认为由一组数据点构成的一个聚类中，聚类内部点之间的距离应该小于数据点与聚类外部的点之间的距离。假设我们有一组数据集{x1,...,xN}...
• tingyue_
• 2017年04月25日 16:34
• 2126

举报原因： 您举报文章：聚类算法之GMM聚类算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)