高斯混合模型

k-means 聚类模型非常简单并且易于理解,但是它的简单性也为实际应用带
来了挑战。特别是在实际应用中,k-means 的非概率性和它仅根据到簇中心点的距离来指
派簇的特点将导致性能低下。这一节将介绍高斯混合模型,该模型可以被看作是k-means
思想的一个扩展,但它也是一种非常强大的聚类评估工具。还是从标准导入开始:

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np

高斯混合模型(GMM)为什么会出现:k-means

算法的缺陷
下面来介绍一些k-means 算法的不足之处,并思考如何改进我们的聚类模型。就像前一节
所看到的,只要给定简单且分离性非常好的数据,k-means 就可以找到合适的聚类结果。
例如,只要有简单的数据簇,k-means 算法就可以快速给这些簇作标记,标记结果和通过
肉眼观察到的簇的结果十分接近:

from sklearn.datasets import make_blobs
X, y_true = make_blobs(n_samples=400, centers=4,
cluster_std=0.60, random_state=0)
X = X[:, ::-1] # 交换列是为了方便画图
#用k-means标签画出数据
from sklearn.cluster import KMeans
kmeans = KMeans(4, random_state=0)
labels = kmeans.fit(X).predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis');

簇似乎有一小块区域重合,因此我们对重合部分的点将被分配到哪个簇不是很有信心。不
幸的是,k-means 模型本身也没有度量簇的分配概率或不确定性的方法(虽然可以用数据
重抽样方法bootstrap 来估计不确定性)。因此,我们必须找到一个更通用的模型。
理解k-means 模型的一种方法是,它在每个簇的中心放置了一个圆圈(在更高维空间中是
一个超空间),圆圈半径根据最远的点与簇中心点的距离算出。这个半径作为训练集分配
簇的硬切断(hard cutoff),即在这个圆圈之外的任何点都不是该簇的成员。可以用以下函
数将这个聚类模型可视化:

from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
def plot_kmeans(kmeans, X, n_clusters=4, rseed=0, ax=None):labels = kmeans.fit_predict(X)# 画出输入数据ax = ax or plt.gca()ax.axis('equal')ax.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2)# 画出k-means模型的表示centers = kmeans.cluster_centers_radii = [cdist(X[labels == i], [center]).max() for i, center in enumerate(centers)]for c, r in zip(centers, radii):ax.add_patch(plt.Circle(c, r, fc='#CCCCCC', lw=3, alpha=0.5, zorder=1))
kmeans = KMeans(n_clusters=4, random_state=0)
plot_kmeans(kmeans, X)

k-means 有一个重要特征,它要求这些簇的模型必须是圆形:k-means 算法没有内置的方法
来实现椭圆形的簇。因此,如果对同样的数据进行一些转换,簇的分配就会变得混乱:

rng = np.random.RandomState(13)
X_stretched = np.dot(X, rng.randn(2, 2))
kmeans = KMeans(n_clusters=4, random_state=0)
plot_kmeans(kmeans, X_stretched)

通过肉眼观察,可以发现这些变形的簇并不是圆形的,因此圆形的簇拟合效果非常糟糕。
总之,k-means 对这个问题有点无能为力,只能强行将数据拟合至4 个圆形的簇,但却导
致多个圆形的簇混在一起、相互重叠,右下部分尤其明显。有人可能会想用PCA(详情请
参见5.9 节)先预处理数据,从而解决这个特殊的问题。但实际上,PCA 也不能保证这样
的全局操作不会导致单个数据被圆形化。
k-means 的这两个缺点——类的形状缺少灵活性、缺少簇分配的概率——使得它对许多数
据集(特别是低维数据集)的拟合效果不尽如人意。
你可能想通过对k-means 模型进行一般化处理来弥补这些不足,例如可以通过比较每个点
与所有簇中心点的距离来度量簇分配的不确定性,而不仅仅是关注最近的簇。你也可能想
通过将簇的边界由圆形放宽至椭圆形,从而得到非圆形的簇。实际上,这正是另一种的聚
类模型——高斯混合模型——的两个基本组成部分。

一般化E-M:高斯混合模型

一个高斯混合模型(Gaussian mixture model,GMM)试图找到多维高斯概率分布的混合
体,从而获得任意数据集最好的模型。在最简单的场景中,GMM 可以用与k-means 相同
的方式寻找类:

from sklearn.mixture import GaussianMixture as GMM
gmm = GMM(n_components=4).fit(X)
labels = gmm.predict(X)
plt.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis');

但由于GMM 有一个隐含的概率模型,因此它也可能找到簇分配的概率结果——在Scikit-
Learn 中用predict_proba 方法实现。这个方法返回一个大小为[n_samples, n_clusters]
的矩阵,矩阵会给出任意点属于某个簇的概率:

probs = gmm.predict_proba(X)
print(probs[:5].round(3))
[[0.469 0.531 0.    0.   ][0.    0.    0.    1.   ][0.    0.    0.    1.   ][0.    1.    0.    0.   ][0.    0.    0.    1.   ]]

我们可以将这个不确定性可视化,用每个点的大小体现预测的不确定性,使其成正比.在簇边界上的点反映了簇分配的不确定性:

size = 50 * probs.max(1) ** 2 # 平方强调差异
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=size);

高斯混合模型本质上和k-means 模型非常类似,它们都使用了期望最大化方法,具体实现
如下。

  1. 选择初始簇的中心位置和形状。
  2. 重复直至收敛。
  • 期望步骤(E-step):为每个点找到对应每个簇的概率作为权重。
  • 最大化步骤(M-step):更新每个簇的位置,将其标准化,并且基于所有数据点的权重来确定形状。

最终结果表明,每个簇的结果并不与硬边缘的空间(hard-edged sphere)有关,而是通过高
斯平滑模型实现。正如在k-means 中的期望最大化方法,这个算法有时并不是全局最优解,
因此在实际应用需要使用多个随机初始解。
下面创建一个可视化GMM 簇位置和形状的函数,该函数用gmm 的输出结果画出椭圆:

from matplotlib.patches import Ellipsedef draw_ellipse(position, covariance, ax=None, **kwargs):"""Draw an ellipse with a given position and covariance"""ax = ax or plt.gca()# Convert covariance to principal axesif covariance.shape == (2, 2):U, s, Vt = np.linalg.svd(covariance)angle = np.degrees(np.arctan2(U[1, 0], U[0, 0]))width, height = 2 * np.sqrt(s)else:angle = 0width, height = 2 * np.sqrt(covariance)# Draw the Ellipsefor nsig in range(1, 4):ax.add_patch(Ellipse(position, nsig * width, nsig * height,angle, **kwargs))def plot_gmm(gmm, X, label=True, ax=None):ax = ax or plt.gca()labels = gmm.fit(X).predict(X)if label:ax.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2)else:ax.scatter(X[:, 0], X[:, 1], s=40, zorder=2)ax.axis('equal')w_factor = 0.2 / gmm.weights_.max()for pos, covar, w in zip(gmm.means_, gmm.covars_, gmm.weights_):draw_ellipse(pos, covar, alpha=w * w_factor)
gmm = GMM(n_components=4, random_state=42)
# plot_gmm(gmm, X)

高斯混合模型(GMM)相关推荐

  1. 高斯混合模型GMM、核心参数、高斯混合模型GMM的数学形式

    高斯混合模型GMM.核心参数.高斯混合模型GMM的数学形式 高斯混合模型GMM 混合模型是一个可以用来表示在总体分布(distribution)中含有 K 个子分布的概率模型,换句话说,混合模型表示了 ...

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

    参考:http://blog.sina.com.cn/s/blog_54d460e40101ec00.html 概率指事件随机发生的机率,对于均匀分布函数,概率密度等于一段区间(事件的取值范围)的概率 ...

  3. 高斯混合模型--GMM

    原文:http://blog.sina.com.cn/s/blog_54d460e40101ec00.html   高斯混合模型--GMM(Gaussian Mixture Model)     统计 ...

  4. 单高斯分布模型GSM,高斯混合模型GMM

    本文就高斯混合模型(GMM,Gaussian Mixture Model)参数如何确立这个问题,详细讲解期望最大化(EM,Expectation Maximization)算法的实施过程. 单高斯分布 ...

  5. EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)

    文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...

  6. 高斯混合模型GMM的理解

    高斯混合模型(Gaussian Mixture Model,简称GMM)是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型.通俗点 ...

  7. 混合高斯模型_大数据小白入门高斯混合模型(GMM)聚类算法

    导读 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,属于生成式模型,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的.从中 ...

  8. 使用高斯混合模型(GMM)近似未知分布:EM算法的应用

    该篇博客是对邱锡鹏老师<神经网络与深度学习>的学习笔记.在阅读本博文之前,建议读者先阅读上一篇博客EM算法. 高斯混合模型(Gaussian Mixture Model) 如果一个连续随机 ...

  9. EM算法及高斯混合模型GMM详述

    1.最大似然估计 最大似然估计(Maximum Likelihood Estimation,MLE)就是利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值的计算过程.直白来讲,就是给定了 ...

  10. 高斯混合模型 GMM 的详细解释

    高斯混合模型(后面本文中将使用他的缩写 GMM)听起来很复杂,其实他的工作原理和 KMeans 非常相似,你甚至可以认为它是 KMeans 的概率版本. 这种概率特征使 GMM 可以应用于 KMean ...

最新文章

  1. vscode个人配置
  2. 基于 KIF 的 iOS UI 自动化测试和持续集成
  3. Java Throwable toString()方法与示例
  4. 【今日CV 计算机视觉论文速览】 11 Mar 2019
  5. Spring自学日志03(作用域,自动装配)
  6. 鸿蒙内核之内存调测:动态内存池信息统计
  7. [渝粤教育] 西南科技大学 计算机辅助设计 在线考试复习资料2021版
  8. php 获取数组第一个元素的几种方法
  9. 网课学习:PDF阅读器,Blumind思维导图
  10. sql server 2000 打了sp4补丁包仍不能监听1433端口问题的解决
  11. Invalid prop:type check failed for prop“value“.Expected String with value“8“,got Number with value 8
  12. NCA:九岁已经发起了 DDoS 攻击
  13. 回归- Regression
  14. 实战案例!用 Python 绘制全国鸿星尔克门店分布图,最多的是你所在城市吗?
  15. HJ70 矩阵乘法计算量估算 ——
  16. 福昕阅读器无法添加书签
  17. [安卓]实现苹果实现的效果之 流光溢彩背景
  18. mysql.js回调函数_js回调函数(callback)
  19. 面试+学习+做项目+最全Java视频讲解
  20. 美股日志|三大股票指数升金价重上1800

热门文章

  1. Axure页面基础操作
  2. java四大特性_java四大特性详解
  3. 化繁为简|中信建投基于StarRocks构建统一查询服务平台
  4. 《面向对象程序设计——Java语言·翁恺》第3周编程题 查找里程
  5. Relu激活函数、sigmoid
  6. 广技师专插本c语言真题,插本经验----献给广技师汉语言文学专业
  7. Galera Cluster详解
  8. [Error] invalid types ‘float [10][float]‘ for array subscript
  9. Thymeleaf详解
  10. 每天一练——牛客网基础语法(7)