首页 > 编程语言 >Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化

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

时间:2023-11-01 11:32:25浏览次数:46  
标签:idata GLM 采样器 贝叶斯 回归线 我们 后验

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

线性回归

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

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

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

概率重构

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

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

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

PyMC 中的贝叶斯 GLM

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

 

 

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

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

 

 

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);

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

估计模型

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

 

 

# 定义似然函数
    likelihood = Normal("y", mu=intercept + slope * x, sigma=sigma, observed=y)

    # 使用NUTS采样推断
    idata = sample(3000)

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

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

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

 

 

import bambi as bmb

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

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

 

 

idata = model.fit(draws=3000)

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

要短得多,但这段代码与之前的规范完全相同(如果我们愿意,您也可以更改先验和其他所有内容)。

分析模型

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

 

 

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

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

左侧显示了我们的边缘后验 – 对于 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");

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

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

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

总结

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

延伸阅读

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

版本信息:

 

 

%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

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


标签:idata,GLM,采样器,贝叶斯,回归线,我们,后验
From: https://blog.51cto.com/u_14293657/8120348

相关文章

  • 转:ChatGLM3-6B测评
    全新ChatGLM3-6B针对七项RAG能力的评测,谁最适合RAG?原创这个男人来自千祥土猛的员外2023-10-3017:32发表于浙江https://mp.weixin.qq.com/s/6fnZt2sBTakfXZMcS-scPA1.实体提取实体和关系提取当然也可以使用NER,但是有大模型,为什么不用呢,而且它后面还可以做格式,所以在RAG应......
  • R语言贝叶斯Metropolis-Hastings Gibbs 吉布斯采样器估计变点指数分布分析泊松过程车
    原文链接:http://tecdat.cn/?p=26578 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于吉布斯采样器的研究报告,包括一些图形和统计输出。指数分布是泊松过程中事件之间时间的概率分布,因此它用于预测到下一个事件的等待时间,例如,您需要在公共汽车站等待的时间,直到下一班车......
  • LLM探索:为ChatGLM2的gRPC后端增加连续对话功能
    前言之前我做AIHub的时候通过gRPC的方式接入了ChatGLM等开源大模型,对于大模型这块我搞了个StarAI框架,相当于简化版的langchain,可以比较方便的把各种大模型和相关配套组合在一起使用。主要思路还是用的OpenAI接口的那套,降低学习成本,但之前为了快速开发,就只搞了个简单......
  • 教你如何基于MindSpore进行ChatGLM微调
    本文分享自华为云社区《基于MindSpore的ChatGLM微调》,作者:JeffDing。基于MindSpore的ChatGLM微调克隆HuggingFace模型克隆chatglm-6b代码仓,下载分布式的模型文件gitlfsinstallgitclonehttps://huggingface.co/THUDM/chatglm-6b准备环境安装Transformerpipinsta......
  • GPU实验室-在阿里云云上部署ChatGLM2-6B大模型
    实验室地址:https://developer.aliyun.com/adc/scenario/f3dc63dc55a543c3884b8dbd292adcd5一、先买机器并开通对应安全组8501端口规格族:GPU计算型gn6i实例规格:ecs.gn6i-c4g1.xlarge安全组新增规则入方向端口范围:8501/8501授权对象:0.0.0.0/0二、最好是安装系统的时候把安装nvidi......
  • 基于 P-Tuning v2 进行 ChatGLM2-6B 微调实践
    微调类型简介1.SFT监督微调:适用于在源任务中具有较高性能的模型进行微调,学习率较小。常见任务包括中文实体识别、语言模型训练、UIE模型微调。优点是可以快速适应目标任务,但缺点是可能需要较长的训练时间和大量数据。2.LoRA微调:通过高阶矩阵秩的分解减少微调参数量,不改变预训......
  • 【开源】给ChatGLM写个,Java对接的SDK
    作者:小傅哥-百度搜小傅哥bugstack博客:bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!......
  • Langchain-Chatchat项目:1.1-ChatGLM2项目整体介绍
      ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第2代版本,引入新的特性包括更长的上下文(基于FlashAttention技术,将基座模型的上下文长度由ChatGLM-6B的2K扩展到了32K,并在对话阶段使用8K的上下文长度训练);更高效的推理(基于Multi-QueryAttention技术,ChatGLM2-6B有更高效的推理......
  • 先验概率和后验概率
    事情还没有发生,要求这件事情发生的可能性的大小,是先验概率。事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小,是后验概率。先验概率不是根据有关自然状态的全部资料测定的,而只是利用现有的材料(主要是历史资料)计算的;后验概率使用了有关自然状态更加全面的资......
  • ChatGLM2
    下载chatglm2-6bprint('开始加载分词器tokenizer...')tokenizer=AutoTokenizer.from_pretrained("THUDM/chatglm2-6b",trust_remote_code=True)print('开始加载语言模型model...')model=AutoModel.from_pretrained("THUDM/chatglm......