高斯混合模型(GMM)

article/2025/10/12 9:36:04

高斯混合模型

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)

http://chatgpt.dhexx.cn/article/VKC2eiv8.shtml

相关文章

机器学习笔记 - 什么是高斯混合模型(GMM)?

1、高斯混合模型概述 高斯混合模型 (GMM) 是一种机器学习算法。它们用于根据概率分布将数据分类为不同的类别。高斯混合模型可用于许多不同的领域,包括金融、营销等等!这里要对高斯混合模型进行介绍以及真实世界的示例、它们的作用以及何时应该使用GMM。 高斯混合模型 (GMM) …

机器学习算法(二十九):高斯混合模型(Gaussian Mixed Model,GMM)

目录 1 混合模型(Mixture Model) 2 高斯模型 2.1 单高斯模型 2.2 高斯混合模型 3 模型参数学习 3.1 单高斯模型 3.2 高斯混合模型 4 高斯混合模型与K均值算法对比 1 混合模型(Mixture Model) 混合模型是一个可以用来表示在总…

重启虚拟机异常:Unmount and run xfs_repair

重启虚拟机异常:Unmount and run xfs_repair 解决办法: 原因:看出来应该是sda3分区损坏,修复就可以了 1:启动虚拟机E进入单用户模式 2:在linux16开头的哪一行后面添加rd.break,ctrlx进入救援模式…

Unmount and run xfs_repair

开启虚拟机报错:Unmount and run xfs_repair 从错误可以查看到是vda3错误。 解决办法: 1、umount /dev/vda3 2、xfs_repair -L /dev/vda3 3、reboot 就ok了。

Linux mount/unmount命令

开机自动挂载 如果我们想实现开机自动挂载某设备,只要修改/etc/fstab文件即可。 文件挂载的配置文件:/etc/fstab 查看此文件可知 每行定义一个要挂载的文件系统; 其每行的格式如下 要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项…

android.permission.MOUNT_UNMOUNT_FILESYSTEMS添加权限报错

<!--这是在sd卡内创建和删除文件权限--> <uses-permission android:name"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name"android.permission.WRITE_SETTINGS" /> 出现报错有两种解决方法&#xff1…

Centos7 虚拟机非法关机导致系统无法启动报Unmount and run xfs_repair的解决方法

1&#xff0c;电脑不正常启动导致我的虚拟机无法启动&#xff0c;报以下错误Unmount and run xfs_repair&#xff0c;大概意思是xfs文件系统出现问题了&#xff0c;导致无法挂载&#xff0c;需要使用xfs_repair进行修复。 2&#xff0c;执行如下命令 xfs_repair /dev/mapper/c…

linux下unmount了移动硬盘之后,硬盘灯还是常亮并且硬盘还在一直转动

linux下unmount了移动硬盘之后&#xff0c;硬盘灯还是常亮并且硬盘还在一直转动 ​ 参考:https://www.zhihu.com/question/23362385 希捷2T移动硬盘 在windows下卸载硬盘之后硬盘灯就不亮了&#xff0c;手摸也没有震动感。 在ubuntu下卸载硬盘之后&#xff0c;硬盘灯仍然常…

centos7异常断电,重启提示Unmount and run xfs_repair

周末服务器由于阵列卡问题&#xff0c;异常重启&#xff0c;重启后前台异常报错&#xff0c;提示磁盘元数据问题&#xff0c;需要修复 如故障图所示&#xff0c;sdb1&#xff0c;sdf1&#xff0c;sdi1 3块磁盘出现问题&#xff0c; 下面的解决办法&#xff1a; 解决办法&…

Android/C/C++ 中解决 USB UnMount(禁止USB端口)

引&#xff1a;因为某些特殊需求&#xff0c;需要在某些设备接入车机的时候&#xff0c;动态UnMount USB设备&#xff0c;因为代码其中有一些方法是自定义过的&#xff0c;所以该文章仅供思路参考。 &#xff08;20200319 更新&#xff09;&#xff1a;在后续跟进中&#xff0…

linux移动硬盘unmount报错处理

备份数据用的移动硬盘unmount时报&#xff1a; 通过fuser命令来kill掉设备进程&#xff0c;再unmount移动设备 先看fuser命令帮助信息&#xff1a; [rootathenadb2 ~]# fuser -helpUsage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME... [ - ] [ -n SPAC…

虚拟机 报错:Unmount and run xfs_repair

1&#xff0c;启动虚拟机的时候&#xff0c;摁 E 键 找到linux16 这一行(在fi下一行) 的最后&#xff0c;添加&#xff1a; rd.break 摁 &#xff1a;ctrlx进入救援模式 2&#xff0c;执行&#xff1a;umount /dev/sda3 xfs_repair -L /dev/sda3 …

VMware 安装Centos7 虚拟机 报Unmount and run xfs_repair

VMware 安装Centos7 虚拟机 报Unmount and run xfs_repair 问题描述 安装完虚拟机后重启无法进入用户登录界面 报错&#xff1a;Unmount and run xfs_repair 原因&#xff1a; dm-0分区损坏 解决办法 卸载目录 umount /dev/mapper/centos-root 修复目录 xfs_repair -L…

linux 开机遇见unmount and run xfs_repair

vmware 开机提示 看不懂反正提示 dm-0 没有正确挂载&#xff0c;需要修复 直接上干货执行如下两条命令 ls -l /dev/mapper xfs_repair /dev/mapper/cl_root 或是 xfs_repair -L /dev/mapper/cl_root echo $? 如果返回零&#xff0c;代表成功 最后重启服务器即可 init 6

Linux虚拟机(lvm)报Unmount and run xfs_repair

原因&#xff1a;因为突然断电&#xff0c;导致机器关闭 结果&#xff1a;发现有一台虚拟机无法启动&#xff0c;一直报错 Unmount and run xfs_repair 分析&#xff1a;主机异常掉电后里面的虚拟机无法启动&#xff0c;主要是损坏的分区 解决办法&#xff1a; 原因&#x…

Ubuntu远程装载硬盘Mount and unmount disk

小虎本来以为Ubuntu&#xff08;Linux系统&#xff09;不能够远程装载硬盘&#xff0c;每次重开机都要线下重新装载硬盘。但是苦于工作站不在身边&#xff0c;跑来跑去太麻烦&#xff0c;所以想远程装载一下。 解决方法 遍历搜索所有硬盘。找到对应名字。 lsblk创建一个文件…

mount unmount oracle,umount- 0506-349 Cannot unmount -dev-cd0- The requested reso

umount- 0506-349 Cannot unmount -dev-cd0- The requested reso (2011-12-21 04:20:37) 标签&#xff1a; requested 杂谈 umount: 0506-349 Cannot unmount /dev/cd0: The requested reso请问&#xff1a;我在安装oracle的时候&#xff0c;当系统提示我放入第二张光盘的时候&…

umount卸载磁盘_如何使用umount命令在Linux,Ubuntu,CentOS中卸载磁盘

umount卸载磁盘 Linux distributions like Ubuntu, Debian, CentOS, RHEL, and others use disks by mounting them to the file system. We have already examined mount command in the following tutorial. In this tutorial we will learn how to umount the disk in a Lin…

Linux之磁盘管理df、du、mount 、unmount 命令

1、Linux磁盘管理常用命令为 df、du df &#xff1a;列出文件系统的整体磁盘使用量du&#xff1a;检查磁盘空间使用量 2、df 列出文件系统的整体磁盘使用量 df命令参数功能&#xff1a;检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间&#xff0c;目…

strtok 函数

C 库函数 - strtok() C 标准库 - <string.h> 描述 C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串&#xff0c;delim 为分隔符。 声明 下面是 strtok() 函数的声明。 char *strtok(char *str, const char *delim) 参数 str -…