使用高斯混合模型拆分多模态分布

简介: 本文介绍如何使用高斯混合模型将一维多模态分布拆分为多个分布。

高斯混合模型(Gaussian Mixture Models,简称GMM)是一种在统计和机器学习领域中常用的概率模型,用于对复杂数据分布进行建模和分析。GMM 是一种生成模型,它假设观测数据是由多个高斯分布组合而成的,每个高斯分布称为一个分量,这些分量通过权重来控制其在数据中的贡献。

生成具有多模态分布的数据

当一个数据集显示出多个不同的峰值或模态时,通常会出现显示出多个不同的峰值或模态,每个模态代表分布中一个突出的数据点簇或集中。这些模式可以看作是数据值更可能出现的高密度区域。

我们将使用numpy生成的一维数组。

 import numpy as np

 dist_1 = np.random.normal(10, 3, 1000)
 dist_2 = np.random.normal(30, 5, 4000)
 dist_3 = np.random.normal(45, 6, 500)

 multimodal_dist = np.concatenate((dist_1, dist_2, dist_3), axis=0)

让我们把一维的数据分布形象化。

 import matplotlib.pyplot as plt
 import seaborn as sns
 sns.set_style('whitegrid')

 plt.hist(multimodal_dist, bins=50, alpha=0.5)
 plt.show()

使用高斯混合模型拆分多模态分布

下面我们将通过使用高斯混合模型计算每个分布的均值和标准差,将多模态分布分离回三个原始分布。高斯混合模型是一种可用于数据聚类的概率无监督模型。它使用期望最大化算法估计密度区域。

 from sklearn.mixture import GaussianMixture

 gmm = GaussianMixture(n_components=3)
 gmm.fit(multimodal_dist.reshape(-1, 1))

 means = gmm.means_

 # Conver covariance into Standard Deviation
 standard_deviations = gmm.covariances_**0.5  

 # Useful when plotting the distributions later
 weights = gmm.weights_  


 print(f"Means: {means}, Standard Deviations: {standard_deviations}")

 #Means: [29.4, 10.0, 38.9], Standard Deviations: [4.6, 3.1, 7.9]

我们已经得到了均值和标准差,可以对原始分布进行建模。可以看到虽然平均值和标准差可能不完全正确,但它们提供了一个接近的估计。

把我们的估计和原始数据比较一下。

 from scipy.stats import norm

 fig, axes = plt.subplots(nrows=3, ncols=1, sharex='col', figsize=(6.4, 7))

 for bins, dist in zip([14, 34, 26], [dist_1, dist_2, dist_3]):
     axes[0].hist(dist, bins=bins, alpha=0.5)

 axes[1].hist(multimodal_dist, bins=50, alpha=0.5)

 x = np.linspace(min(multimodal_dist), max(multimodal_dist), 100)

 for mean, covariance, weight in zip(means, standard_deviations, weights):
     pdf = weight*norm.pdf(x, mean, std)
     plt.plot(x.reshape(-1, 1), pdf.reshape(-1, 1), alpha=0.5)

 plt.show()

总结

高斯混合模型是一个强大的工具,可以用来对复杂的数据分布进行建模和分析,同时也是许多机器学习算法的基础之一。它的应用范围涵盖了多个领域,能够解决各种数据建模和分析的问题。

这种方法可以作为一种特征工程技术来估计输入变量内子分布的置信区间。

https://avoid.overfit.cn/post/2d68eddf58c04732a4826c6d6c2d1a50

作者:Adrian Evensen

目录
相关文章
notepad++选中多行文本
notepad++选中多行文本
1202 0
notepad++选中多行文本
|
SQL API 数据库
Seata AT模式问题之抛出异常触发回滚如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题
1045 99
|
存储 Android开发
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
1800 0
【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
|
机器学习/深度学习 监控 数据挖掘
数据并非都是正态分布:三种常见的统计分布及其应用
这篇文章除了介绍线性模型在减肥app预测中的不切实际性,还探讨了不同统计分布在体重管理和数据分析中的应用。文章提到了正态分布和泊松分布,前者常用于描述围绕平均值对称分布的连续数据,如体重;后者适合计数数据,如体重变化次数。正态分布以其钟形曲线闻名,泊松分布则描述独立事件的数量。文章还简要介绍了卡方分布在检验分类变量关系时的作用。最后,文章指出了在线性回归中假设数据正态分布的原因,包括便于统计推断和最小化估计误差。
1753 5
|
10月前
|
设计模式 存储 Java
【再谈设计模式】备忘录模式~对象状态的守护者
备忘录模式属于行为型设计模式。它的主要目的是在不破坏对象封装性的前提下,捕获并外部化一个对象的内部状态,以便之后可以将该对象恢复到这个状态。原发器(Originator):创建一个备忘录,用于记录当前时刻它的内部状态。原发器还可以使用备忘录来恢复其内部状态。备忘录(Memento):存储原发器对象的内部状态。备忘录应该防止原发器以外的其他对象访问其内部状态。负责人(Caretaker):负责保存备忘录,但不能对备忘录的内容进行操作或检查。
367 82
|
11月前
|
存储 文字识别 JavaScript
Uppy:告别传统上传!这款开源工具如何让文件传输效率提升300%?🐶
**Uppy** 是由 Transloadit 团队开发的模块化、高扩展性的 JavaScript 文件上传库,支持断点续传、云存储直传、图片编辑等高级功能。它无缝集成 React、Vue 等框架,兼容移动端,被 Instagram、知乎等企业采用。Uppy 采用“核心+插件”架构,代码轻量且功能强大,适合电商、在线教育等多种场景。项目开源免费,GitHub 获得数万星标,提供丰富的插件生态和跨平台支持。
1145 4
|
11月前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
451 6
从零开始:用Python爬取网站的汽车品牌和价格数据
|
11月前
|
机器学习/深度学习 存储 算法
DeepSeek多智能体强化学习
多智能体强化学习(MARL)是强化学习的重要分支,专注于训练多个智能体在复杂环境中协同或竞争。与单智能体不同,MARL需考虑智能体间的交互与协作,更具挑战性。DeepSeek提供强大工具和API,助力高效构建和训练MARL模型。本文将详细介绍使用DeepSeek进行MARL的方法,并通过代码示例帮助读者掌握相关技巧。内容涵盖多智能体环境的构建、Q学习和DQN智能体的定义与训练,以及常见问题的解决方案。
|
11月前
|
数据采集 人工智能 安全
接入DeepSeek的云盒子AI知识库,欢迎内测!
云盒子AI智能知识库以其开放性和灵活性著称,目前正内测接入DeepSeek-R1。此次升级延续了云盒子的开放理念,为企业提供灵活选择,支持按需定制和自由适配。DeepSeek的加入拓展了知识库的能力边界,满足不同行业需求,提升了文档利用与知识获取的智能化水平。云盒子通过专利数据采集技术、深度解析、权限隔离和持续学习能力,确保高效、安全的知识管理。适用于单文档问答、企业内部知识管理、客户服务支持、教育与培训及医疗单位等多种场景,为用户带来全新体验。
551 1