Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化

简介: Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化

全文链接:https://tecdat.cn/?p=33436


尽管贝叶斯方法相对于频率主义方法的理论优势已经在其他地方进行了详细讨论,但其更广泛采用的主要障碍是“可用性”。而使用贝叶斯方法,客户可以按照自己认为合适的方式定义模型点击文末“阅读原文”获取完整代码数据


线性回归

在此示例中,我们将帮助客户从最简单的 GLM – 线性回归开始。一般来说,频率论者对线性回归的看法如下:

image.png

然后,我们可以使用普通最小二乘法(OLS)或最大似然法来找到最佳拟合。

概率重构

贝叶斯主义者对世界采取概率观,并用概率分布来表达这个模型。我们上面的线性回归可以重新表述为:

image.png

换句话说,我们将Y其视为一个随机变量(或随机向量),其中每个元素(数据点)都根据正态分布分布。此正态分布的均值由具有方差sigma的线性预测变量提供。

PyMC 中的贝叶斯 GLM

要开始在 PyMC 中构建 GLM,让我们首先导入所需的模块。

print(f"Running on PyMC v{pm.__version__}")

image.png

az.style.use("arviz-darkgrid")

数据

本质上,我们正在创建一条由截距和斜率定义的回归线,并通过从均值设置为回归线的正态采样来添加数据点。

y = true_regression_line + rng.normal(scale=0.5, size=size)
data = pd.DataFrame(dict(x=x, y=y))
plt.legend(loc=0);

image.png

点击标题查阅往期内容


R语言用贝叶斯线性回归、贝叶斯模型平均 (BMA)来预测工人工资


01

02

03

04

估计模型

让我们将贝叶斯线性回归模型拟合到此数据。

# 定义似然函数
    likelihood = Normal("y", mu=intercept + slope * x, sigma=sigma, observed=y)
    # 使用NUTS采样推断
    idata = sample(3000)

image.png

image.png

对于了解概率编程的人来说,这应该是相当可读的。

import bambi as bmb

image.png

image.png

idata = model.fit(draws=3000)

image.png

要短得多,但这段代码与之前的规范完全相同。

分析模型

贝叶斯推理不仅给了我们一条最佳拟合线(就像最大似然那样),而是给出了合理参数的整个后验分布。让我们绘制参数的后验分布和我们绘制的单个样本。

az.plot_trace(idata, figsize=(10, 7));

image.png

左侧显示了我们的边缘后验 – 对于 x 轴上的每个参数值,我们在 y 轴上得到一个概率,告诉我们该参数值的可能性。

首先,各个参数(左侧)的采样链看起来均匀且平稳(没有大的漂移或其他奇怪的模式)。

其次,每个变量的最大后验估计值(左侧分布中的峰值)非常接近用于生成数据的真实参数(x是回归系数,sigma是我们正态的标准差)。

因此,在 GLM 中,我们不仅有一条最佳拟合回归线,而且有许多。后验预测图从后验图(截距和斜率)中获取多个样本,并为每个样本绘制一条回归线。我们可以直接使用后验样本手动生成这些回归线。

idata.posterior["y_model"] = idata.posterior["Intercept"] + idata.posterior["x"] * xr.DataArray(x)
_, ax = plt.subplots(figsize=(7, 7))
az.plot_lm(idata=idata, y="y", num_samples=100, axes=ax, y_model="y_model")
ax.set_title("Posterior predictive regression lines")
ax.set_xlabel("x");

image.png

image.png

我们估计的回归线与真正的回归线非常相似。但是由于我们只有有限的数据,我们的估计存在不确定性,这里用线的可变性来表示。

总结

  • 可用性目前是更广泛采用贝叶斯统计的巨大障碍。
  • Bambi允许使用从 R 借用的便捷语法进行 GLM 规范。然后可以使用pymc 进行推理。
  • 后验预测图使我们能够评估拟合度和其中的不确定性。

延伸阅读

有关其他背景信息,以下是一些关于贝叶斯统计的好资源:

  • 约翰·克鲁施克(John Kruschke)的优秀著作《做贝叶斯数据分析》。

版本信息:

%load_ext watermark
%watermark -n -u -v -iv -w -p pytensor
Python implementation: CPython
Python version       : 3.11.4
IPython version      : 8.14.0
pytensor: 2.14.2
pymc      : 5.7.2+0.gd59a960f.dirty
bambi     : 0.12.0
arviz     : 0.16.1
xarray    : 2023.7.0
matplotlib: 3.7.2
numpy     : 1.25.2
sys       : 3.11.4 | packaged by conda-forge | (main, Jun 10 2023, 18:08:17) [GCC 12.2.0]
pandas    : 2.0.3
Watermark: 2.4.3
相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
基于Python的数据分析与可视化实战
本文将引导读者通过Python进行数据分析和可视化,从基础的数据操作到高级的数据可视化技巧。我们将使用Pandas库处理数据,并利用Matplotlib和Seaborn库创建直观的图表。文章不仅提供代码示例,还将解释每个步骤的重要性和目的,帮助读者理解背后的逻辑。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和技能。
105 0
|
1月前
|
机器学习/深度学习 数据可视化 Python
Python实用记录(三):通过netron可视化模型
使用Netron工具在Python中可视化神经网络模型,包括安装Netron、创建文件和运行文件的步骤。
33 2
Python实用记录(三):通过netron可视化模型
|
1月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
279 3
|
12天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。
|
1月前
|
数据采集 Web App开发 数据可视化
Python爬虫教程:Selenium可视化爬虫的快速入门
Python爬虫教程:Selenium可视化爬虫的快速入门
|
2月前
|
数据可视化 Python
Python数据可视化-动态柱状图可视化
Python数据可视化-动态柱状图可视化
|
2月前
|
JSON 数据可视化 数据处理
Python数据可视化-折线图可视化
Python数据可视化-折线图可视化
|
1月前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据处理与可视化——以气温数据分析为例
【10月更文挑战第12天】使用Python进行数据处理与可视化——以气温数据分析为例
190 0
|
1月前
|
数据采集 数据可视化 数据挖掘
Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
【10月更文挑战第3天】Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
91 0
|
1月前
|
数据可视化 Python
Python 高级绘图:从基础到进阶的可视化实践
本文介绍了使用 Python 的强大绘图库 matplotlib 实现多种图表绘制的方法,包括简单的折线图、多条折线图、柱状图、饼图、散点图及 3D 图的绘制。通过具体代码示例展示了如何设置轴标签、标题、图例等元素,并指出了 matplotlib 支持更多高级绘图功能。来源:https://www.wodianping.com/app/2024-10/47112.html。
77 0