• [无监督学习] 15.详细图解混合高斯分布


    混合高斯分布
    在机器学习和统计学中常用的高斯分布,可以表示一组数据。
    如果数据集中有多组数据,可以使用混合高斯分布(即多个高斯分布的线性组合)来实现聚类。

    概述
    与其说混合高斯分布是一种算法的名称,不如说它是一种概率分布的名称。本节我们来介绍对于被看作由这种概率分布产生的数据,估计其分布的参数的方法。混合高斯分布可以用于聚类。
    高斯分布是混合高斯分布的基础,是统计学和机器学习中经常使用的一种概率分布。数据的分布可以用均值和方差表示,均值描述数据的中心位置,方差描述数据的离散程度。混合高斯分布是以多个高斯分布的线性叠加来表示数据的模型。
    下面来看一下高斯分布和混合高斯分布的区别。图 3-21 所示为对鸢尾花数据分别应用高斯分布和混合高斯分布后的结果,每种分布情况在图中以等高线表示。

    ▲图 3-21 对鸢尾花数据分别应用高斯分布 (a) 和混合高斯分布 (b) 的结果


    观察图 3-21a,可以知道整个鸢尾花数据每个轴的均值和方差。不过鸢尾花数据包括 setosa(山鸢尾)、versicolor(杂色鸢尾)和 virginica(维吉尼亚鸢尾)3 个品种,而高斯分布的每个轴都只有一个均值和一个方差,所以使用一个分布无法体现不同品种之间的差异。
    图 3-21b 是应用了混合高斯分布的结果,它是由 3 个高斯分布叠加而成的。混合高斯分布能够表示由多个类别(在本例中为品种)组成的复杂数据。


    算法说明
    混合高斯分布的学习过程是从给定的数据点中找到每个高斯分布的均值和方差的过程。简单起见,这里以在一维数据上求出这些参数的方法为例进行说明。图 3-22 是两个高斯分布及从这两个高斯分布采样得到的一维数据的示意图。红色的点是从均值为 - 2.0、方差为 2.2 的高斯分布中采样得到的数据;蓝色的点是从均值为 3.0、方差为 4.0 的高斯分布中采样得到的数据。

    ▲图 3-22 两个高斯分布及从这两个高斯分布中采样得到的一维数据


    现在要解决的混合高斯分布的问题是从数据点中找到高斯分布的参数。如果是如图 3-22 所示的“每个数据点所属的类可以通过颜色来区别”的情况,问题就简单了,因为只需计算每种颜色的数据点的均值和方差即可。然而,混合高斯分布必须在不知道每个数据点的类别的情况下求出参数。因此,我们需要在推测“每个数据点属于某个类别”的权重的基础上,计算出数据点的各个类别的高斯分布的参数(均值和方差)。具体来说,要通过如图 3-23 所示的步骤求得参数。

    1. 初始化参数(各高斯分布的均值和方差)。
    2. 对每个类别计算数据点的权重。
    3. 根据步骤 2 中计算出的权重重新计算参数。
    4. 重复步骤 2 和步骤 3,直到通过步骤 3 更新前后的每个均值的变化足够小。


    ▲图 3-23 对一维数据应用混合高斯分布


    在步骤 1 中初始化参数,确定每个高斯分布的均值和方差。在步骤 2 中计算数据点拥有的权重,权重计算方法为“每个高斯分布的值 / 所有高斯分布的值之和”。当计算出所有数据点的权重后,求出每个类别的权重的均值,然后计算方差。方差是均值与数据点之间的差的平方的均值,不过这里计算的是均值与数据点之间的差的平方的加权平均值。根据得到的均值和方差,在步骤 3 中计算一个新的高斯分布。然后,依次重复步骤 2 和步骤 3 来更新参数。这种方法的特点是,它并不明确数据点所属的具体是哪一个类别,而是用权重来表示所属类别,并一点一点地更新均值和方差。


    示例代码
    下面是对包含 3 个品种的鸢尾花数据应用混合高斯分布的示例代码。

    1. from sklearn.datasets import load_iris
    2. from sklearn.mixture import GaussianMixture
    3. data = load_iris()
    4. n_components = 3 # 高斯分布的数量
    5. model = GaussianMixture(n_components=n_components)
    6. model.fit(data.data)
    7. print(model.predict(data.data)) # 预测类别
    8. print("***************************")
    9. print(model.means_) # 各高斯分布的均值
    10. print("***************************")
    11. print(model.covariances_) # 各高斯分布的方差
    12. print("***************************")

    结果:

    [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 0 2 0 2
     2 2 2 0 2 2 2 2 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     0 0]
    ***************************
    [[6.54639415 2.94946365 5.48364578 1.98726565]
     [5.006      3.428      1.462      0.246     ]
     [5.9170732  2.77804839 4.20540364 1.29848217]]
    ***************************
    [[[0.38744093 0.09223276 0.30244302 0.06087397]
      [0.09223276 0.11040914 0.08385112 0.05574334]
      [0.30244302 0.08385112 0.32589574 0.07276776]
      [0.06087397 0.05574334 0.07276776 0.08484505]]
    
     [[0.121765   0.097232   0.016028   0.010124  ]
      [0.097232   0.140817   0.011464   0.009112  ]
      [0.016028   0.011464   0.029557   0.005948  ]
      [0.010124   0.009112   0.005948   0.010885  ]]
    
     [[0.2755171  0.09662295 0.18547072 0.05478901]
      [0.09662295 0.09255152 0.09103431 0.04299899]
      [0.18547072 0.09103431 0.20235849 0.06171383]
      [0.05478901 0.04299899 0.06171383 0.03233775]]]
    ***************************

    详细说明
    使用混合高斯分布实现聚类

    这里尝试使用混合高斯分布对以下数据进行聚类。图 3-24 所示为对同一数据集分别应用混合高斯分布和 k-means 算法的聚类结果。

    ▲图 3-24 分别应用混合高斯分布 (a) 和 [插图] 算法 (b) 后的聚类结果


    由于混合高斯分布中的每个高斯分布对呈椭圆形分布的数据有效,所以混合高斯分布对这个数据集的聚类效果很好。而 k-means 算法对从重心开始呈圆形分布的数据有效,所以它对这个数据集的部分数据的聚类效果不好。

    ———————————————————————————————————————————

    文章来源:书籍《图解机器学习算法》

    作者:秋庭伸也 杉山阿圣 寺田学

    出版社:人民邮电出版社

    ISBN:9787115563569

    本篇文章仅用于学习和研究目的,不会用于任何商业用途。引用书籍《图解机器学习算法》的内容旨在分享知识和启发思考,尊重原著作者秋庭伸也 杉山阿圣 寺田学的知识产权。如有侵权或者版权纠纷,请及时联系作者。
    ——————————————————————————————————————————

  • 相关阅读:
    激光焊接汽车尼龙塑料配件透光率测试仪
    Linux 下 JDK 安装(tar.gz版) - jdk8
    详解位段+枚举+联合(接结构体)
    怎么快速制作书单视频?书单视频如何制作?
    【Vue】组件间传值及传值校验
    硬件知识:独立显卡和集成显卡的区别,你知道吗?
    Java:如何加速Java中的大型集合处理
    安装Docker
    [运维|数据库] MySQL中的longtext类型在PostgreSQL中用text表示
    LVS FILTER UNUSED OPTION
  • 原文地址:https://blog.csdn.net/jhghuhbb/article/details/139411482