gmm中隐变量是什么的_机器学习(十):EM算法与GMM算法原理及案例分析

2023-10-19 15:40

本文主要是介绍gmm中隐变量是什么的_机器学习(十):EM算法与GMM算法原理及案例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

EM算法

最大期望算法(Expectation-maximization algorithm,简称EM,又译期望最大化算法)在统计中被用于寻找依赖于不可观察的隐性变量的概率模型中,参数的最大似然估计。在统计计算中,最大期望(EM)算法是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。最大期望算法经常用在机器学习和计算机视觉得数据聚类领域。EM算法的标准计算框架由E步和M步交替组成,算法的收敛可以确保迭代至少逼近局部极大值。EM算法被广泛应用于处理数据的缺失值,以及很多机器学习算法,包括高斯混合模型和隐马尔科夫模型的参数估计。

Jensen不等式(又名琴生不等式、詹森不等式)

琴生不等式是以丹麦技术大学数学家约翰·延森(Johan Jensen)命名,它给出积分的凸函数值和凸函数的积分值间的关系。Jensen不等式是关于凸函数性质的不等式,它和凸函数的定义是息息相关的。

47c3d7ea3433

设f是定义域为实数的函数,如果对于所有的实数x,f(x)的二次导数大于等于0,那么f是凸函数

如果f是凸函数,X是随机变量,那么满足Jensen不等式:

math?formula=E%5Bf(x)%5D%20%5Cgeq%20f(E%5Bx%5D)

Jensen不等式应用于凹函数时,不等号方向反向。

二、算法原理

1、实例解析

47c3d7ea3433

这里有两个硬币分别是A和B,我们进行抛硬币的实验,假设这两个硬币做过手脚,出现正反面的概率不同,初始假设为:

A:0.6几率正面

B:0.5几率正面

那么我们分别抛10次硬币,会出现5正5反的概率:

选择硬币A的概率:

选择硬币B的概率:

math?formula=1-P(A)%3D0.55

我们跟着箭头一步一步看:

第一步:给出了初始假设,选择两个硬币的正面概率分别是0.6和0.5

第二步:E-step

1、初始值选择A的概率是:0.45,此时有5次H,5次T,可以计算出

math?formula=E(H)%3D0.45%20%5Ctimes%205%20%3D%202.2H%EF%BC%8CE(T)%3D0.45%20%5Ctimes%205%20%3D2.2T

选择B的概率是:0.55,此时有5次H,5次T,可以计算出

math?formula=E(H)%3D0.55%20%5Ctimes%205%20%5Capprox%202.8H%EF%BC%8CE(T)%3D0.55%20%5Ctimes%205%20%5Capprox%202.8T

2、先来看一下投掷出9次正面1次反面的概率

math?formula=P(A)%3DC_%7B10%7D%5E9(0.6%5E9)(0.4%5E1)%20%5Capprox%200.04%20%EF%BC%8CP(B)%3DC_%7B10%7D%5E9(0.5%5E9)(0.5%5E1)%20%5Capprox%200.0098

选择硬币A的概率

math?formula=%5Cfrac%7BP(A)%7D%7BP(A)%2BP(B)%7D%3D0.8%2C选择硬币B的概率

math?formula=1-P(A)%3D0.2

我们分别计算硬币A正反面的期望:

math?formula=E(H)%3D%200.8%20%5Ctimes%209%20%3D7.2H%2CE(T)%3D0.8%20%5Ctimes%201%20%3D0.8T

硬币B正反面的期望:

math?formula=E(H)%3D%200.2%20%5Ctimes%209%20%3D1.8H%2CE(T)%3D0.2%20%5Ctimes%201%20%3D0.2T

3、依次计算出所有的样本,并分别将A和B硬币出现H和T的期望求和,

A硬币:

math?formula=%5Csum_%7BH%7D%3D(2.2%2B7.2%2B5.9%2B1.4%2B4.5)H%3D21.3H

math?formula=%5Csum_%7BT%7D%3D(2.2%2B0.2%2B1.5%2B2.1%2B1.9)T%3D8.6T

B硬币:

math?formula=%5Csum_%7BH%7D%3D(2.8%2B1.8%2B2.1%2B2.6%2B2.5)H%3D11.7H

math?formula=%5Csum_%7BH%7D%3D(2.8%2B0.2%2B0.5%2B3.9%2B1.1)H%3D8.4H

第三步:M-step

通过E-step计算的结果分别求出两个硬币的分布,

math?formula=%5Cwidehat%20%5Ctheta_%7BA%7D%5E%7B(1)%7D%20%3D%5Cfrac%7B21.3%7D%7B21.3%2B8.6%7D%20%5Capprox%200.71

math?formula=%5Cwidehat%20%5Ctheta_%7BB%7D%5E%7B(1)%7D%20%3D%5Cfrac%7B11.7%7D%7B11.7%2B8.4%7D%20%5Capprox%200.58

将上述两个结果带入第一步进行迭代,不断更新P(A)和P(B),直到结果收敛为止就得到了我们需要的结果。

2、公式推导

(1) 问题:样本集

math?formula=%7B%5Clbrace%20x_%7B1%7D%2Cx_%7B2%7D%2C...%2Cx_%7Bm%7D%5Crbrace%7D,包含m个独立的样本,其中每个样本

math?formula=i对应的类别

math?formula=z_%7B(i)%7D是未知的,所以很难用最大似然求解

math?formula=l(%5Ctheta)%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Clog%20p(x_%7Bi%7D%3B%5Ctheta)%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20%5Clog%20%5Csum_%7BZ%7D%20p(x_%7Bi%7D%2Cz%3B%5Ctheta)

上式中,要考虑每个样本在各个分布中的情况,本来正常求偏导就可以了,但是现在

math?formula=%5Clog后面还有求和,这就难解了。

(2) 右式分子分母同时乘

math?formula=Q(z)(

math?formula=Q(z)

math?formula=Z的分布函数)

math?formula=%5Clog%20%5Csum_%7BZ%7D%20p(x_%7Bi%7D%2Cz%3B%5Ctheta)%3D%5Clog%20%5Csum_%7BZ%7DQ(z)%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D为什么这么做?目的是凑Jensen不等式

(3) 利用Jensen不等式求解

由于

math?formula=%5Csum_%7BZ%7DQ(z)%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D

math?formula=%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D的期望

假设

math?formula=Y%3D%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D ,则

math?formula=%5Clog%20%5Csum_%7Bz%7DQ%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ%7D%3D%5Clog%20%5Csum_%7BY%7DP(Y)Y%3D%5Clog%20E(Y)

此时:

math?formula=%5Clog%20E(Y)%20%5Cgeq%20E(%5Clog%20Y)%20%3D%5Csum_%7BY%7DP(Y)%5Clog%20Y%3D%5Csum_%7BZ%7DQ(z)%5Clog%20%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D

(4) 结论

math?formula=l(%5Ctheta)%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Clog%5Csum_%7BZ%7Dp(x_%7Bi%7D%2Cz%3B%5Ctheta)%20%5Cgeq%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%20%5Csum_%7BZ%7DQ(z)%5Clog%20%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D

下界比较好求,所以我们要优化这个下界来使得似然函数最大。

47c3d7ea3433

如何能使得等式成立呢?(取等号)

根据Jensen中等式成立的条件是随机变量是常数,则:

math?formula=Y%3D%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BQ(z)%7D%3DC

由于

math?formula=Q(z)是z的分布函数,则关于分布函数的和一定为1:

math?formula=%5Csum_%7Bz%7DQ(Z)%3D%5Csum_%7BZ%7D%20%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BC%7D%3D1

由上式可得,所有的分子和等于常数C(分母相同),即C就是

math?formula=p(x_%7Bi%7D%2Cz%3B%5Ctheta)对z求和

math?formula=Q(Z)%3D%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7BC%7D%3D%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7B%5Csum_%7Bz%7Dp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%3D%5Cfrac%7Bp(x_%7Bi%7D%2Cz%3B%5Ctheta)%7D%7Bp(x_%7Bi%7D)%7D%3Dp(z%7Cx_%7Bi%7D%3B%5Ctheta)

math?formula=Q(z)代表第

math?formula=i个数据是来自

math?formula=z_%7Bi%7D的概率,在固定

math?formula=%5Ctheta后,使下界拉升的

math?formula=Q(z)的计算公式,解决了

math?formula=Q(z)如何选择的问题。这一步就是E-step,建立

math?formula=l(%5Ctheta)的下界。接下来的M-step,就是在给定

math?formula=Q(z)后,调整

math?formula=%5Ctheta,去极大化

math?formula=l(%5Ctheta)的下界。

3、总结

EM算法流程

1、初始化分布参数

math?formula=%5Ctheta

2、E-step:根据参数

math?formula=%5Ctheta计算每个样本属于

math?formula=z_%7Bi%7D的概率(也就是我们的Q)

3、M-step:根据Q,求出含有

math?formula=%5Ctheta的似然函数的下界并最大化它,得到新的参数

math?formula=%5Ctheta

4、不断地迭代更新下去,直到收敛。

三、GMM(高斯混合模型)

GMM(Gaussian mixture model),高斯混合模型,也可以简写成MOG.高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。GMM已经在数值逼近、语音识别、图像分类、图像去噪、图像重构、故障诊断、视频分析、邮件过滤、密度估计、目标识别与跟踪等领域取得了良好的效果。实际上,GMM的目的就是找到一个合适的高斯分布(也就是确定高斯分布的参数μ,Σ),使得这个高斯分布能产生这组样本的可能性尽可能大(即:拟合样本数据)。高斯混合模型也​被视为一种聚类方法,是机器学习中对“无标签数据”进行训练得到的分类结果。其分类结果由概率表示,概率大者,则认为属于这一类。

1、算法适合的情形:

数据内部有多个类别,每个类别的数据呈现不同的分布,这时我们就可以使用GMM算法,尤其是有隐变量,隐变量有不同的分布。

2、公式推导

一般化的描述为:假设混合高斯模型由K个高斯模型组成(即数据包含K个类),则GMM的概率密度函数如下:

math?formula=p(x)%3D%5Csum_%7Bk%3D1%7D%5E%7BK%7Dp(k)p%7B(x%7Ck)%7D%3D%5Csum_%7Bk%3D1%7D%5E%7BK%7D%5Cpi_%7Bk%7DN(x%7C%5Cmu_%7Bk%7D%2C%5Csum%7Bk%7D)其中,

math?formula=p(x%7Ck)%3DN(x%7C%5Cmu_%7Bk%7D%2C%5Csum%20k)是第k个高斯模型的概率密度函数,可以看成选定第K个模型后,该模型产生x的概率;

math?formula=P(k)%3D%5Cpi%20k是第k个高斯模型的权重,称作选择第K个模型的先验概率,且满足,

math?formula=%5Csum_%7Bk%3D1%7D%5E%7BK%7D%5Cpi_%7Bk%7D%3D1

概率密度知道后,我们看一下最大化对数似然函数的意义:

首先直观化地解释一下最大化对数似然函数要解决的是什么问题。

假设我们采样得到一组样本yt ,而且知道变量Y服从高斯分布(本文只提及高斯分布,其他变量分布模型类似),数学形式表示为Y∼N(μ,Σ)。采样的样本如下图所示,我们的目的就是找到一个合适的高斯分布(也就是确定高斯分布的参数μ,Σ),使得这个高斯分布能产生这组样本的可能性尽可能大。那怎么找到这个合适的高斯分布呢(在如下图中的表示就是1~4哪个分布较为合适)?这时候似然函数就闪亮登场了。

47c3d7ea3433

似然函数数学化:设有样本集

math?formula=Y%3Dy_%7B1%7D%2Cy_%7B2%7D%2C...%2Cy_%7BN%7D%2Cp(y_%7Bn%7D%7C%5Cmu%2C%CE%A3)是高斯分布的概率分布函数,表示变量

math?formula=Y%3Dy_%7Bn%7D的概率。假设样本的抽样是独立的,那么我们同时抽到这N个样本的概率是抽到每个样本概率的乘积,也就是样本集Y的联合概率。此联合概率即为似然函数:

math?formula=L(%5Cmu%2C%CE%A3)%3DL(y_%7B1%7D%2Cy_%7B2%7D%2C...%2Cy_%7BN%7D%3B%5Cmu%2C%CE%A3)%3D%5Cprod_%7Bn%3D1%7D%5E%7BN%7Dp(y_%7Bn%7D%3B%5Cmu%2C%CE%A3)

对上式进行求导并令导数为0(即最大化似然函数,一般还会先转化为对数函数再最大化),所求出的参数就是最佳的高斯分布对应的参数。所以最大化似然函数的意义就是:通过使得样本集的联合概率最大来对参数进行估计,从而选择最佳的分布模型。

我们尝试使用最大化对数似然函数来解决GMM模型,

math?formula=lnL(%5Cmu%2C%CE%A3%2C%5Cpi)%3D%5Csum_%7Bn%3D1%7D%5E%7BN%7Dln%5Csum_%7Bk%3D1%7D%5E%7BK%7D%5Cpi_%7Bk%7DN(y_%7Bn%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D)然后求导,令导数为0,就可以得到模型参数(μ,Σ,π) ,然而仔细观察可以发现,对数似然函数里面,对数里面还有求和。实际上没有办法通过求导的方法来求这个对数似然函数的最大值。此时,就需要借助EM算法来解决此问题了

接下来我们使用EM算法求解GMM模型,

EM算法可以用于解决数据缺失的参数估计问题(隐变量的存在实际上就是数据缺失问题,缺失了各个样本来源于哪一类的记录)。

引入隐变量

math?formula=r_%7Bjk%7D,它的取值只能是1或者0。

取值为1:第j个观测变量来自第k个高斯分量

取值为0:第j个观测变量不是来自第k个高斯分量

那么对于每一个观测数据

math?formula=y_%7Bi%7D都会对应于一个向量变量,

math?formula=%5CGamma_%7Bj%7D%3D%7Br_%7Bj1%7D%2C...%2Cr_%7Bjk%7D%7D,那么有:

math?formula=%5Csum_%7Bk%3D1%7D%5E%7BK%7Dr_%7Bjk%7D%3D1

math?formula=p(%5CGamma_%7Bj%7D)%3D%5Cprod_%7Bk%3D1%7D%5E%7BK%7D%5Calpha_%7Bk%7D%5E%7Br_%7Bjk%7D%7D

其中,K为GMM高斯分量的个数,

math?formula=%5Calpha_%7Bk%7D 为第k个高斯分量的权值。因为观测数据来自GMM的各个高斯分量相互独立,而

math?formula=%5Calpha_%7Bk%7D 刚好可以看做是观测数据来自第k个高斯分量的概率,因此可以直接通过连乘得到整个隐变量

math?formula=%5CGamma_%7Bj%7D的先验分布概率。

​得到完全数据的似然函数

对于观测数据

math?formula=y_%7Bi%7D,当已知其是哪个高斯分量生成的之后,其服从的概率分布为:

math?formula=p(y_%7Bi%7D%7Cr_%7Bjk%7D%3D1%3B%5Ctheta)%3DN(y_%7Bj%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D) 由于观测数据从哪个高斯分量生成这个事件之间的相互独立的,因此可以写成:

math?formula=p(y_%7Bi%7D%7C%5CGamma_%7Bj%7D%3B%5Ctheta)%3D%5Cprod_%7Bk%3D1%7D%5E%7BK%7DN(y_%7Bj%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D)%5E%7Br_%7Bjk%7D%7D

这样我们就得到了已知

math?formula=%5CGamma_%7Bj%7D的情况下单个测试数据的后验概率分布。结合之前得到的

math?formula=%5CGamma_%7Bj%7D的先验分布,则我们可以写出单个完全观测数据的似然函数为:

math?formula=p(y_%7Bj%7D%2C%5CGamma_%7Bj%7D%2C%5Ctheta)%3D%5Cprod_%7Bk%3D1%7D%5E%7BK%7D%5Calpha_%7Bk%7D%5E%7Br_%7Bjk%7D%7DN(y_%7Bj%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D)%5E%7Br_%7Bjk%7D%7D取对数,得到对数似然函数为:

math?formula=lnp(y%2C%5CGamma_%7Bj%7D%3B%5Ctheta)%3D%5Csum_%7Bj%3D1%7D%5E%7BN%7D%5Csum_%7Bk%3D1%7D%5E%7BK%7D(r_%7Bjk%7D%5Cln%5Ctheta_%7Bk%7D%2Br_%7Bjk%7D%5Cln%20N(y_%7Bj%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D))得到各个高斯分量的参数计算公式,

首先,我们将上式的

math?formula=%5Cln%20N(y_%7Bj%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D)根据单高斯的向量形式的概率密度函数的表达形式展开:

math?formula=%5Cln%20N(y_%7Bj%7D%7C%5Cmu_%7Bk%7D%2C%CE%A3_%7Bk%7D)%3D-%5Cfrac%7BD%7D%7B2%7D%5Cln%20(2%5Cpi)-%5Cfrac%7B1%7D%7B2%7D%5Cln%20%7C%CE%A3_%7Bk%7D%7C-%5Cfrac%7B1%7D%7B2%7D(y_%7Bj%7D-%5Cmu_%7Bk%7D)%5ET%CE%A3_%7Bk%7D%5E%7B-1%7D(y_%7Bj%7D-%5Cmu_%7Bk%7D)假设我们已经知道隐变量

math?formula=r_%7Bjk%7D的取值,对上面得到的似然函数分别对

math?formula=%5Calpha_%7Bk%7D

math?formula=%CE%A3_%7Bk%7D求偏导并且偏导结果为零,可以得到:

math?formula=%5Cmu_%7Bk%7D%3D%5Cfrac%7B%5Csum_%7Bj%3D1%7D%5E%7BN%7D%5Csum_%7Bk%3D1%7D%5E%7BK%7Dr_%7Bjk%7Dy_%7Bj%7D%7D%7B%5Csum_%7Bj%3D1%7D%5E%7BN%7D%5Csum_%7Bk%3D1%7D%5E%7BK%7Dr_%7Bjk%7D%7D

math?formula=%CE%A3_%7Bk%7D%3D%5Cfrac%7B%5Csum_%7Bj%3D1%7D%5E%7BN%7D%5Csum_%7Bk%3D1%7D%5E%7BK%7Dr_%7Bjk%7D(y_%7Bj%7D-%5Cmu_%7Bk%7D)(y_%7Bj%7D-%5Cmu_%7Bk%7D)%5ET%7D%7B%5Csum_%7Bj%3D1%7D%5E%7BN%7D%5Csum_%7Bk%3D1%7D%5E%7BK%7Dr_%7Bjk%7D%7D现在参数空间中剩下一个

math?formula=%5Calpha_%7Bk%7D还没有求。这时一个约束满足问题,因为必须满足约束

math?formula=%CE%A3_%7Bk%7D%3D%5Csum_%7Bk%3D1%7D%5E%7BK%7D%5Calpha_%7Bk%7D%3D1.我们使用拉格朗日乘数法结合似然函数和约束条件对

math?formula=%5Calpha_%7Bk%7D求偏导,可以得到:

math?formula=%5Calpha_%7Bk%7D%3D%5Cfrac%7B%5Csum_%7Bj%3D1%7D%5E%7BN%7Dr_%7Bjk%7D%7D%7B-%5Clambda%7D将上式的左右两边分别对k=1,2,...,K求和,可以得到:

math?formula=%5Clambda%3D-N

math?formula=%5Clambda带入,最终得到:

math?formula=%5Calpha_%7Bk%7D%3D%5Cfrac%7B%5Csum_%7Bj%3D1%7D%5E%7BN%7Dr_%7Bjk%7D%7D%7BN%7D至此,我们在隐变量已知的情况下得到了GMM的三种类型参数的求解公式。

得到隐变量的估计公式

根据EM算法,现在我们需要通过当前参数的取值得到隐变量的估计公式也就是说隐变量的期望的表现形式。即如何求解

math?formula=E%7Br_%7Bjk%7D%7Cy%2C%5Ctheta%7D

47c3d7ea3433

四、案例分析

案例一

这里的数据集是每天经过美国西雅图弗莱蒙特桥上自行车的数量,时间间隔是[2012/10/02-2014/5/31]有需要的同学可以私信。

1、先来看一下数据集

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

from sklearn.mixture import GaussianMixture

def dataset():

"""

读取数据并处理

:return:

"""

data = pd.read_csv('../../../数据集/机器学习/EM算法/FremontHourly.csv',index_col='Date',parse_dates=True)

print(data.head(20))

if __name__=="__main__":

dataset()

47c3d7ea3433

2、将数据以图的形式展示

data.plot()

plt.show()

47c3d7ea3433

这时我们发现数据太多密集,我们以"周(week)"的形式展示

#在时间上进行重采样

data.resample('w').sum().plot()

plt.show()

47c3d7ea3433

我们还可以以"天(day)"的形式将一年的数据呈现出来

data.resample('D').sum().rolling(365).sum().plot()

plt.show()

47c3d7ea3433

我们按照每天的时间进行求平均值,看一下一天的那个时间点是峰值

data.groupby(data.index.time).mean().plot()

plt.xticks(rotation=45)

plt.show()

47c3d7ea3433

我们按照桥的两侧,分别计算每个时间点的停车量

data.columns=['East','West']

data['Total']=data['East']+data['West']

pivoted = data.pivot_table('Total',index=data.index.time,columns=data.index.date)

print(pivoted.iloc[:5,:5])

pivoted.plot(legend=False,alpha=0.01)

plt.xticks(rotation=45)

plt.show()

47c3d7ea3433

47c3d7ea3433

由于数据量比较少,上图不是很清晰,但是可以隐约看到是有两种分布的数据存在。

接下来我们看一下数据结构,

print(pivoted.shape)

47c3d7ea3433

通过上图我们得知数据是24 x 607的矩阵,这对于聚类来说是不合理的,数据量太少特征值过多,所以这里我们将矩阵进行转置,

X = pivoted.fillna(0).T.values

print(X.shape)

47c3d7ea3433

这时数据处理完后,我们发现特征值有点多,所以我们利用PCA进行降维处理,降到两维,我们看一下图像,

#PCA降维成2维

pca = PCA(n_components=2)

Y = pca.fit_transform(X)

# print(Y.shape)

plt.scatter(Y[:,0],Y[:,1])

plt.show()

47c3d7ea3433

降维结束后,我们开始使用GMM算法进行聚类,首先我们先看一下聚成两类之后的概率值,由于数据集比较明显,所以分出的概率值差异比较大,

def gmm(data,pivoted):

"""

利用GMM聚类算法进行聚类

:return:

"""

gmm = GaussianMixture(n_components=2)#两种高斯分布

gmm.fit(data)

labels = gmm.predict_proba(data)

x = gmm.predict(data)

print(labels)

if __name__=="__main__":

data,pivoted = dataset()

gmm(data,pivoted)

47c3d7ea3433

我们输出一下分类的结果看一下,

print(x)

47c3d7ea3433

接下来我们画图看一下分类的结果,

plt.scatter(data[:,0],data[:,1],c=x,cmap='rainbow')

plt.show()

47c3d7ea3433

最后我们看一下原始数据集分类后的分布图

fig, ax = plt.subplots(1, 2, figsize=(14, 6))

pivoted.T[labels == 0].T.plot(legend = False,alpha=0.1,ax=ax[0])

pivoted.T[labels == 1].T.plot(legend=False, alpha=0.1, ax=ax[1])

ax[0].set_title('Purple Cluster')

ax[1].set_title('Red Cluster')

plt.show()

47c3d7ea3433

这里是所有的代码

import pandas as pd

import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

from sklearn.mixture import GaussianMixture

def dataset():

"""

读取数据并处理

:return:

"""

data = pd.read_csv('../../../数据集/机器学习/EM算法/FremontHourly.csv',index_col='Date',parse_dates=True)

# print(data.head(30))

# data.plot()

# plt.show()

# #在时间上进行重采样

# data.resample('w').sum().plot()

# data.resample('D').sum().rolling(365).sum().plot()

# plt.show()

# data.groupby(data.index.time).mean().plot()

# plt.xticks(rotation=45)

# plt.show()

data.columns=['East','West']

data['Total']=data['East']+data['West']

pivoted = data.pivot_table('Total',index=data.index.time,columns=data.index.date)

print(pivoted.iloc[:5,:5])

pivoted.plot(legend=False,alpha=0.01)

plt.xticks(rotation=45)

plt.show()

# print(pivoted.shape)

X = pivoted.fillna(0).T.values

print(X.shape)

#PCA降维成2维

pca = PCA(n_components=2)

Y = pca.fit_transform(X)

# print(Y.shape)

plt.scatter(Y[:,0],Y[:,1])

plt.show()

return Y,pivoted

def gmm(data,pivoted):

"""

利用GMM聚类算法进行聚类

:return:

"""

gmm = GaussianMixture(n_components=2)#两种高斯分布

gmm.fit(data)

labels = gmm.predict_proba(data)

x = gmm.predict(data)

print(labels)

plt.scatter(data[:,0],data[:,1],c=x,cmap='rainbow')

plt.show()

fig, ax = plt.subplots(1, 2, figsize=(14, 6))

pivoted.T[labels == 0].T.plot(legend = False,alpha=0.1,ax=ax[0])

pivoted.T[labels == 1].T.plot(legend=False, alpha=0.1, ax=ax[1])

ax[0].set_title('Purple Cluster')

ax[1].set_title('Red Cluster')

plt.show()

return None

if __name__=="__main__":

data,pivoted = dataset()

gmm(data,pivoted)

案例二

这里我们举例对比一下GMM算法与K-means算法的聚类效果。

首先我们先制作一些数据集,同时画图展示一下。

from sklearn.datasets.samples_generator import make_blobs

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from sklearn.mixture import GaussianMixture

import numpy as np

def datasets():

"""

使用datasets包产生一些数据

:return:

"""

plt.rcParams['axes.unicode_minus'] = False#解决不显示负数问题

X,y_true = make_blobs(n_samples=800,centers=4,random_state=11)

plt.scatter(X[:,0],X[:,1])

plt.show()

if __name__ == "__main__":

datasets()

47c3d7ea3433

接下来我们先用K-means算法聚类一下,看看效果。

def GmmKmean(data):

"""

GMM算法与Kmeans算法对比

:return:

"""

kmeans = KMeans(n_clusters=4)

kmeans.fit(data)

y_kmeans = kmeans.predict(data)

plt.scatter(data[:,0],data[:,1],c=y_kmeans,s=50,cmap='viridis')

plt.show()

centers = kmeans.cluster_centers_

print(centers)

return None

if __name__ == "__main__":

data = datasets()

GmmKmean(data)

47c3d7ea3433

47c3d7ea3433

我们再用GMM算法实现一下,

gmm = GaussianMixture(n_components=4,random_state=1)

gmm.fit(data)

labels = gmm.predict(data)

plt.scatter(data[:,0],data[:,1],c=labels,s=40,cmap='viridis')

plt.show()

47c3d7ea3433

通过上面两个算法的对比,我们发现比较简单的数据集上,两者的分类效果差不多。

接下来,我们再制作一些数据集对比一下聚类效果,

plt.show()

rng = np.random.RandomState(13)

Y = np.dot(X,rng.randn(2,2))

plt.scatter(Y[:,0],Y[:,1])

plt.show()

47c3d7ea3433

我们的目的是希望能分出四个类,左上角两个,右下角两个

首先我们先看一下K-means算法的效果,

kmeansy = KMeans(n_clusters=4,random_state=1)

kmeansy.fit(dataY)

datay_kmeans = kmeansy.predict(dataY)

plt.scatter(dataY[:,0],dataY[:,1],c=datay_kmeans,s=40,cmap='viridis')

plt.show()

47c3d7ea3433

通过上图我们发现,K-means算法能够聚类出来,但是左上角两个类分出的效果并不是很理想,接下来我们用GMM算法再聚类一下,

gmm.fit(dataY)

labelsY = gmm.predict(dataY)

plt.scatter(dataY[:,0],dataY[:,1],c=labelsY,s=40,cmap='viridis')

plt.show()

47c3d7ea3433

这时我们发现GMM算法的聚类效果就非常好。

代码在这里展示一下,

from sklearn.datasets.samples_generator import make_blobs

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from sklearn.mixture import GaussianMixture

import numpy as np

def datasets():

"""

使用datasets包产生一些数据

:return:

"""

plt.rcParams['axes.unicode_minus'] = False#解决不显示负数问题

X,y_true = make_blobs(n_samples=800,centers=4,random_state=11)

plt.scatter(X[:,0],X[:,1])

plt.show()

rng = np.random.RandomState(13)

Y = np.dot(X,rng.randn(2,2))

plt.scatter(Y[:,0],Y[:,1])

plt.show()

return X,Y

def GmmKmean(data,dataY):

"""

GMM算法与Kmeans算法对比

:return:

"""

kmeans = KMeans(n_clusters=4)

kmeans.fit(data)

y_kmeans = kmeans.predict(data)

plt.scatter(data[:,0],data[:,1],c=y_kmeans,s=50,cmap='viridis')

plt.show()

centers = kmeans.cluster_centers_

print(centers)

gmm = GaussianMixture(n_components=4,random_state=1)

gmm.fit(data)

labels = gmm.predict(data)

plt.scatter(data[:,0],data[:,1],c=labels,s=40,cmap='viridis')

plt.show()

kmeansy = KMeans(n_clusters=4,random_state=1)

kmeansy.fit(dataY)

datay_kmeans = kmeansy.predict(dataY)

plt.scatter(dataY[:,0],dataY[:,1],c=datay_kmeans,s=40,cmap='viridis')

plt.show()

# gmmY = GaussianMixture(n_components=4)

gmm.fit(dataY)

labelsY = gmm.predict(dataY)

plt.scatter(dataY[:,0],dataY[:,1],c=labelsY,s=40,cmap='viridis')

plt.show()

return None

if __name__ == "__main__":

data,dataY = datasets()

GmmKmean(data,dataY)

好了,EM算法与GMM算法的学习到这里就结束了,本节的公式推导比较多,希望大家能够手动推一下!

这篇关于gmm中隐变量是什么的_机器学习(十):EM算法与GMM算法原理及案例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240758

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘(永久存储)主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1,且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了,大概支持30w次的读写操作。 闪存使用的是电容进行存储,断电数据就没了。 器件之间传输bit数据在总线上是一个一个传输的,因为通过电压传输(电流不稳定),但是电压属于电势能,所以可以叠加互相干扰,这也就是硬盘,U盘