高斯混合模型--GMM(Gaussian Mixture Model)

高斯混合模型--GMMGaussian Mixture Model

    统计学习的模型有两种,一种是概率模型,一种是非概率模型。

    所谓概率模型,是指训练模型的形式是P(Y|X)。输入是X,输出是Y,训练后模型得到的输出不是一个具体的值,而是一系列的概率值(对应于分类问题来说,就是输入X对应于各个不同Y(类)的概率),然后我们选取概率最大的那个类作为判决对象(软分类--soft assignment)。所谓非概率模型,是指训练模型是一个决策函数Y=f(X),输入数据X是多少就可以投影得到唯一的Y,即判决结果(硬分类--hard assignment)。

    所谓混合高斯模型(GMM)就是指对样本的概率密度分布进行估计,而估计采用的模型(训练模型)是几个高斯模型的加权和(具体是几个要在模型训练前建立好)。每个高斯模型就代表了一个类(一个Cluster)。对样本中的数据分别在几个高斯模型上投影,就会分别得到在各个类上的概率。然后我们可以选取概率最大的类所为判决结果。

     从中心极限定理的角度上看,把混合模型假设为高斯的是比较合理的,当然,也可以根据实际数据定义成任何分布的Mixture Model,不过定义为高斯的在计算上有一些方便之处,另外,理论上可以通过增加Model的个数,用GMM近似任何概率分布。

    混合高斯模型的定义为:

   

    其中K 为模型的个数;πk为第k个高斯的权重;px / k 则为第k个高斯概率密度,其均值为μk,方差为σk。对此概率密度的估计就是要求出πkμk σk 各个变量。当求出px 的表达式后,求和式的各项的结果就分别代表样本x 属于各个类的概率。

    在做参数估计的时候,常采用的是最大似然方法。最大似然法就是使样本点在估计的概率密度函数上的概率值最大。由于概率值一般都很小,N 很大的时候, 连乘的结果非常小,容易造成浮点数下溢。所以我们通常取log,将目标改写成:

  


    也就是最大化对数似然函数,完整形式为:

    一般用来做参数估计的时候,我们都是通过对待求变量进行求导来求极值,在上式中,log函数中又有求和,你想用求导的方法算的话方程组将会非常复杂,没有闭合解。可以采用的求解方法是EM算法——将求解分为两步:第一步,假设知道各个高斯模型的参数(可以初始化一个,或者基于上一步迭代结果),去估计每个高斯模型的权值;第二步,基于估计的权值,回过头再去确定高斯模型的参数。重复这两个步骤,直到波动很小,近似达到极值(注意这里是极值不是最值,EM算法会陷入局部最优)。具体表达如下:

     1、(E step)

    对于第i个样本xi 来说,它由第k model 生成的概率为:

   

    在这一步,假设高斯模型的参数是已知的(由上一步迭代而来或由初始值决定)。

    2、(M step)

 高斯混合模型--GMM(Gaussian <wbr>Mixture <wbr>Model)

    3、重复上述两步骤直到算法收敛。


 

    最后总结一下,用GMM的优点是投影后样本点不是得到一个确定的分类标记,而是得到每个类的概率,这是一个重要信息。GMM每一步迭代的计算量比较大,大于k-means。GMM的求解办法基于EM算法,因此有可能陷入局部极值,这和初始值的选取十分相关了。GMM不仅可以用在聚类上,也可以用在概率密度估计上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高斯混合模型Gaussian Mixture Model,GMM)是一种基于概率密度函数的聚类方法,它假设数据集是由多个高斯分布混合而成的。EM算法是一种迭代算法,用于估计高斯混合模型的参数。下面是使用Python实现高斯混合模型-EM算法的示例代码: ```python import numpy as np from scipy.stats import multivariate_normal class GMM: def __init__(self, n_components, max_iter=100, tol=1e-4): self.n_components = n_components self.max_iter = max_iter self.tol = tol def fit(self, X): n_samples, n_features = X.shape # 初始化模型参数 self.weights = np.ones(self.n_components) / self.n_components self.means = X[np.random.choice(n_samples, self.n_components, replace=False)] self.covs = np.array([np.eye(n_features) for _ in range(self.n_components)]) # EM算法迭代 for i in range(self.max_iter): # E步:计算每个样本属于每个分布的后验概率 probs = np.array([multivariate_normal.pdf(X, mean=self.means[j], cov=self.covs[j]) for j in range(self.n_components)]).T probs *= self.weights probs /= probs.sum(axis=1, keepdims=True) # M步:更新模型参数 weights = probs.mean(axis=0) means = np.dot(probs.T, X) / probs.sum(axis=0, keepdims=True).T covs = np.array([np.dot((X - means[j]).T, (X - means[j]) * probs[:, j][:, np.newaxis]) / probs[:, j].sum() for j in range(self.n_components)]) # 判断收敛 if np.abs(weights - self.weights).max() < self.tol and np.abs(means - self.means).max() < self.tol and np.abs(covs - self.covs).max() < self.tol: break self.weights, self.means, self.covs = weights, means, covs def predict(self, X): probs = np.array([multivariate_normal.pdf(X, mean=self.means[j], cov=self.covs[j]) for j in range(self.n_components)]).T return np.argmax(probs, axis=1) # 示例 X = np.random.randn(100, 2) gmm = GMM(n_components=2) gmm.fit(X) labels = gmm.predict(X) plt.scatter(X[:, 0], X[:, 1], c=labels) plt.show() ``` 该示例代码使用numpy和scipy库实现了高斯混合模型-EM算法,并在二维数据集上进行了聚类。其中,GMM类的fit方法用于训练模型,predict方法用于预测样本所属的簇。在示例中,我们生成了一个二维的随机数据集,然后使用GMM类对其进行聚类,并将聚类结果可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值