高斯混合模型算法

下面介绍一下几种典型的机器算法

首先第一种是高斯混合模型算法:

高斯模型有单高斯模型(SGM)和混合高斯模型(GMM)两种。

(1)单高斯模型:

为简单起见,阈值t的选取一般靠经验值来设定。通常意义下,我们一般取t=0.7-0.75之间。

二维情况如下所示:

(2)混合高斯模型:

 

      对于(b)图所示的情况,很明显,单高斯模型是无法解决的。为了解决这个问题,人们提出了高斯混合模型(GMM),顾名思义,就是数据可以看作是从数个高斯分布中生成出来的。虽然我们可以用不同的分布来随意地构造 XX Mixture Model ,但是 GMM是 最为流行。另外,Mixture Model 本身其实也是可以变得任意复杂的,通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布。

    每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“Component”,这些 Component 线性加成在一起就组成了 GMM 的概率密度函数:

 

                (1)

其中,πk表示选中这个component部分的概率,我们也称其为加权系数。

根据上面的式子,如果我们要从 GMM 的分布中随机地取一个点的话,实际上可以分为两步:

(1)首先随机地在这 K 个 Component 之中选一个,每个 Component 被选中的概率实际上就是它的系数 πk,选中了 Component 之后,再单独地考虑从这个 Component 的分布中选取一个点就可以了──这里已经回到了普通的 Gaussian 分布,转化为了已知的问题。假设现在有 N 个数据点,我们认为这些数据点由某个GMM模型产生,现在我们要需要确定 πk,μk,σk 这些参数。很自然的,我们想到利用最大似然估计来确定这些参数,GMM的似然函数如下:

        (2)

 

在最大似然估计里面,由于我们的目的是把乘积的形式分解为求和的形式,即在等式的左右两边加上一个log函数,但是由上文博客里的(2)式可以看出,转化为log后,还有log(a+b)的形式,因此,要进一步求解。

我们采用EM算法,分布迭代求解最大值:

EM算法的步骤这里不作详细的介绍,可以参见博客:

http://blog.pluskid.org/?p=39

贴出代码:

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


    函数返回的 Px 是一个 N\times K 的矩阵,对于每一个 x_i ,我们只要取该矩阵第 i 行中最大的那个概率值所对应的那个 Component 为 x_i 所属的 cluster 就可以实现一个完整的聚类方法了。

 

参考资料:

【C++代码】

http://www.cppblog.com/Terrile/archive/2011/01/19/120051.html

http://www.autonlab.org/tutorials/gmm.html

http://bubblexc.com/y2011/8/

http://blog.pluskid.org/?p=39&cpage=1#comments


### GMM高斯混合模型算法原理 #### 基本概念 GMM(高斯混合模型)是一种用于聚类分析的概率模型,它假设数据是由多个高斯分布叠加而成。通过最大化似然函数来估计这些高斯分量的参数,从而达到对未知数据进行分类的目的[^1]。 #### 数学表示 设观测向量$x_i$服从K个多元正态分布之一,则其联合概率密度可写成如下形式: $$ p(x|\theta)=\sum_{k=1}^{K}\pi_k \cdot N(\mu_k,\Sigma_k) $$ 其中$\pi_k$代表第$k$个成分的选择概率;而$N(\mu_k,Σ_k)$则指均值为$\mu_k$、协方差矩阵为$\Sigma_k$的标准多维正态分布。 #### 参数学习过程 为了求解上述公式的最优参数集θ={π₁,...,πₖ;μ₁,...,μₖ;Σ₁,...,Σₖ},通常采用EM(Expectation-Maximization)算法来进行迭代优化: - **E步**: 计算每个样本属于各个类别下的后验概率γ(zij),即给定当前参数条件下该样本来自某个特定高斯组件的可能性大小; - **M步**: 更新各组别的权重系数π以及对应的均值向量μ和协方差阵Σ,使得整体log likelihood最大化的方向前进。 这一交替执行的过程会持续直到收敛为止[^2]。 --- ### 实现案例展示 下面给出一段Python代码片段作为例子,展示了如何利用`sklearn.mixture.GaussianMixture`库快速构建并训练一个简单的二维空间内的GMM模型[^4]: ```python from sklearn.datasets import make_blobs import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture # 创建模拟数据集 X, y_true = make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0) gmm = GaussianMixture(n_components=4).fit(X) labels = gmm.predict(X) plt.figure(figsize=(8, 6)) plt.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis') plt.title('Clustering using GMM'); ``` 这段程序首先生成了一个具有四个中心点的人工数据集合,接着定义了一个含有相同数量簇数目的GMM对象,并调用了`.fit()`方法完成拟合操作。最后绘制出了预测标签所指示的颜色编码散点图以直观呈现聚类效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值