我们知道生活中的很多现象,比如身高体重的分布,都满足高斯分布 (正态分布)。而高斯混合模型,则是通过多个高斯分布的叠加,实现对数据集的拟合。

高斯分布

如果学过概率论,我们知道高斯分布的公式如下:
python多维高斯分布概率计算 多元高斯分布公式_python
生活中的很多现象,比如身高,都近似一种高斯分布:

python多维高斯分布概率计算 多元高斯分布公式_机器学习_02

考虑一个问题,如果有一组数据,其中包括男性和女性的身高,比起使用一个高斯分布,使用两个高斯分布拟合的效果是不是更好呢?

python多维高斯分布概率计算 多元高斯分布公式_聚类_03

然而,我们只知道数据集,并不知道分布的参数,高斯混合要做的,就是把每个高斯分布的参数求出来。

多元高斯分布

多元高斯分布的公式如下:
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_04

  • python多维高斯分布概率计算 多元高斯分布公式_python_05
  • python多维高斯分布概率计算 多元高斯分布公式_聚类_06python多维高斯分布概率计算 多元高斯分布公式_机器学习_07

高斯混合模型 (GMM)

考虑数据集

编号

密度

含糖率

1

0.697

0.460

2

0.774

0.376

3

0.634

0.264

4

0.608

0.318

5

0.556

0.215

6

0.403

0.237

7

0.481

0.149

8

0.437

0.211

9

0.666

0.091

10

0.243

0.267

初始化

首先考虑将数据集分成几类,比如分 3 类。

接下来就需要初始化 3 个类,也就是三个高斯分布的参数:

初始化三个高斯分布的权重各为 1/3
python多维高斯分布概率计算 多元高斯分布公式_聚类_08
初始化三个高斯分布的协方差矩阵,由于样本集有 2 个维度,故高斯分布也满足二维
python多维高斯分布概率计算 多元高斯分布公式_聚类_09
随机选择 3 个样本作为 3 个高斯分布的初始参数
python多维高斯分布概率计算 多元高斯分布公式_python_10

python多维高斯分布概率计算 多元高斯分布公式_聚类_11

python多维高斯分布概率计算 多元高斯分布公式_人工智能_12

求出每个样本对于每个高斯分布的概率密度

python多维高斯分布概率计算 多元高斯分布公式_机器学习_13

其中
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_14

python多维高斯分布概率计算 多元高斯分布公式_聚类_15

计算得到
python多维高斯分布概率计算 多元高斯分布公式_人工智能_16
同理
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_17
计算得到
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_18

python多维高斯分布概率计算 多元高斯分布公式_机器学习_19

python多维高斯分布概率计算 多元高斯分布公式_聚类_20

经过对 10 个样本的计算,得到如下矩阵:

  • 每一行代表一个样本
  • 每一列代表样本在该类的概率密度
([[1.49150105, 1.06734902, 0.6998446 ],
  [1.59154943, 1.10239273, 0.69713097],
  [1.35525283, 1.5254402 , 1.22695811],
  [1.36357241, 1.48905699, 1.19207803],
  [1.10239273, 1.59154943, 1.45081146],
  [0.72607499, 1.41233311, 1.5222782 ],
  [0.80076963, 1.51407248, 1.57621756],
  [0.69713097, 1.45081146, 1.59154943],
  [1.00026306, 1.38725646, 1.20404055],
  [0.36622698, 0.96208067, 1.22986945]])

将概率密度乘以权重python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_21

即第 1 列的每个值 * python多维高斯分布概率计算 多元高斯分布公式_机器学习_22,第 2 列的每个值 * python多维高斯分布概率计算 多元高斯分布公式_python_23,第 3 列的每个值 * python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_24

对于第一个样本,得到:
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_25

python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_26

python多维高斯分布概率计算 多元高斯分布公式_人工智能_27

对于 10 个样本,得到如下矩阵:

([[0.49716702, 0.35578301, 0.23328153],
  [0.53051648, 0.36746424, 0.23237699],
  [0.45175094, 0.50848007, 0.40898604],
  [0.45452414, 0.49635233, 0.39735934],
  [0.36746424, 0.53051648, 0.48360382],
  [0.242025  , 0.4707777 , 0.50742607],
  [0.26692321, 0.50469083, 0.52540585],
  [0.23237699, 0.48360382, 0.53051648],
  [0.33342102, 0.46241882, 0.40134685],
  [0.12207566, 0.32069356, 0.40995648]])

归一化得到 python多维高斯分布概率计算 多元高斯分布公式_聚类_28

即对于每一个样本:
python多维高斯分布概率计算 多元高斯分布公式_聚类_29
对于第一个样本:
python多维高斯分布概率计算 多元高斯分布公式_聚类_30

python多维高斯分布概率计算 多元高斯分布公式_机器学习_31

python多维高斯分布概率计算 多元高斯分布公式_聚类_32

对于每一个样本,得到如下矩阵:

([[0.45769893, 0.32753883, 0.21476225],
  [0.46933504, 0.32508669, 0.20557828],
  [0.32993377, 0.37136557, 0.29870066],
  [0.3371251 , 0.36814949, 0.2947254 ],
  [0.26597304, 0.38399132, 0.35003563],
  [0.19834395, 0.38581102, 0.41584503],
  [0.20579731, 0.38911572, 0.40508697],
  [0.18642398, 0.38797021, 0.4256058 ],
  [0.27850378, 0.38625456, 0.33524166],
  [0.14315935, 0.37608056, 0.48076009]])

更新参数

更新 python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_21

python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_21 相当于每个聚类概率的均值,更新公式如下:
python多维高斯分布概率计算 多元高斯分布公式_机器学习_35
更新后的 python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_21
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_37

python多维高斯分布概率计算 多元高斯分布公式_机器学习_38

python多维高斯分布概率计算 多元高斯分布公式_人工智能_39

更新 python多维高斯分布概率计算 多元高斯分布公式_机器学习_40

python多维高斯分布概率计算 多元高斯分布公式_机器学习_40 即 x 的均值,更新公式如下:
python多维高斯分布概率计算 多元高斯分布公式_机器学习_42
即对于每一个聚类:其 python多维高斯分布概率计算 多元高斯分布公式_机器学习_40 = 该聚类的 python多维高斯分布概率计算 多元高斯分布公式_聚类_28 * 对应的样本 / 该聚类的 python多维高斯分布概率计算 多元高斯分布公式_聚类_28

对于第一个样本:
python多维高斯分布概率计算 多元高斯分布公式_人工智能_46

python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_47


python多维高斯分布概率计算 多元高斯分布公式_python_48
同理
python多维高斯分布概率计算 多元高斯分布公式_人工智能_49
对于每一个样本,求得矩阵:

([[0.60055553, 0.28114106],
  [0.54399246, 0.24676209],
  [0.51381731, 0.23498059]])

更新 python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_50

更新公式如下:
python多维高斯分布概率计算 多元高斯分布公式_python多维高斯分布概率计算_51
更新后的 python多维高斯分布概率计算 多元高斯分布公式_聚类_52

[[0.01011193, 0.00593932],
 [0.00593932, 0.01346392]]

更新后的 python多维高斯分布概率计算 多元高斯分布公式_聚类_53

[[0.00311919, 0.0047306 ],
 [0.0047306 , 0.02108242]]

更新后的 python多维高斯分布概率计算 多元高斯分布公式_python_54

[[0.01032781, 0.00330684],
 [0.00330684, 0.01090279]]

按照上面的顺序,进行多次迭代更新,最终根据概率密度可以得到分类结果:

后的 python多维高斯分布概率计算 多元高斯分布公式_聚类_52

[[0.01011193, 0.00593932],
 [0.00593932, 0.01346392]]

更新后的 python多维高斯分布概率计算 多元高斯分布公式_聚类_53

[[0.00311919, 0.0047306 ],
 [0.0047306 , 0.02108242]]

更新后的 python多维高斯分布概率计算 多元高斯分布公式_python_54

[[0.01032781, 0.00330684],
 [0.00330684, 0.01090279]]

按照上面的顺序,进行多次迭代更新,最终根据概率密度可以得到分类结果:

python多维高斯分布概率计算 多元高斯分布公式_python_58