使用 PyMC3 进行贝叶斯概率矩阵分解 (BPMF):使用“NUTS”的 PositiveDefiniteError

2024-02-12

我已经实施了贝叶斯概率矩阵分解 https://www.cs.toronto.edu/~amnih/papers/bpmf.pdf算法使用pymc3在Python中。我还实现了它的前身,概率矩阵分解(PMF)。看我之前的问题 https://stats.stackexchange.com/questions/146547/pymc3-implementation-of-probabilistic-matrix-factorization-pmf-map-produces-a以供参考此处使用的数据。

我在使用 NUTS 采样器绘制 MCMC 样本时遇到问题。我使用 PMF 中的 MAP 初始化模型参数,并使用高斯随机绘制的超参数在 0 附近进行初始化。但是,我得到了PositiveDefiniteError为采样器设置步骤对象时。我已经验证 PMF 的 MAP 估计是合理的,因此我预计它与超参数的初始化方式有关。 PMF 模型如下:

import pymc3 as pm
import numpy as np
import pandas as pd
import theano
import scipy as sp

data = pd.read_csv('jester-dense-subset-100x20.csv')    
n, m = data.shape
test_size = m / 10
train_size = m - test_size

train = data.copy()
train.ix[:,train_size:] = np.nan  # remove test set data
train[train.isnull()] = train.mean().mean()  # mean value imputation
train = train.values

test = data.copy()
test.ix[:,:train_size] = np.nan  # remove train set data
test = test.values    

# Low precision reflects uncertainty; prevents overfitting
alpha_u = alpha_v = 1/np.var(train)
alpha = np.ones((n,m)) * 2  # fixed precision for likelihood function
dim = 10  # dimensionality

# Specify the model.
with pm.Model() as pmf:
    pmf_U = pm.MvNormal('U', mu=0, tau=alpha_u * np.eye(dim),
                        shape=(n, dim), testval=np.random.randn(n, dim)*.01)
    pmf_V = pm.MvNormal('V', mu=0, tau=alpha_v * np.eye(dim),
                        shape=(m, dim), testval=np.random.randn(m, dim)*.01)
    pmf_R = pm.Normal('R', mu=theano.tensor.dot(pmf_U, pmf_V.T),
                      tau=alpha, observed=train)

    # Find mode of posterior using optimization
    start = pm.find_MAP(fmin=sp.optimize.fmin_powell)

这是 BPMF:

n, m = data.shape
dim = 10  # dimensionality
beta_0 = 1  # scaling factor for lambdas; unclear on its use
alpha = np.ones((n,m)) * 2  # fixed precision for likelihood function

logging.info('building the BPMF model')
std = .05  # how much noise to use for model initialization
with pm.Model() as bpmf:
    # Specify user feature matrix
    lambda_u = pm.Wishart(
        'lambda_u', n=dim, V=np.eye(dim), shape=(dim, dim),
        testval=np.random.randn(dim, dim) * std)
    mu_u = pm.Normal(
        'mu_u', mu=0, tau=beta_0 * lambda_u, shape=dim,
        testval=np.random.randn(dim) * std)
    U = pm.MvNormal(
        'U', mu=mu_u, tau=lambda_u, shape=(n, dim),
        testval=np.random.randn(n, dim) * std)

    # Specify item feature matrix
    lambda_v = pm.Wishart(
        'lambda_v', n=dim, V=np.eye(dim), shape=(dim, dim),
        testval=np.random.randn(dim, dim) * std)
    mu_v = pm.Normal(
        'mu_v', mu=0, tau=beta_0 * lambda_v, shape=dim,
         testval=np.random.randn(dim) * std)
    V = pm.MvNormal(
        'V', mu=mu_v, tau=lambda_v, shape=(m, dim),
        testval=np.random.randn(m, dim) * std)

    # Specify rating likelihood function
    R = pm.Normal(
        'R', mu=theano.tensor.dot(U, V.T), tau=alpha,
        observed=train)

# `start` is the start dictionary obtained from running find_MAP for PMF.
for key in bpmf.test_point:
    if key not in start:
        start[key] = bpmf.test_point[key]

with bpmf:
    step = pm.NUTS(scaling=start)

在最后一行,我收到以下错误:

PositiveDefiniteError: Scaling is not positive definite. Simple check failed. Diagonal contains negatives. Check indexes [   0    2   ...  2206  2207  ]

据我了解,我不能使用find_MAP使用具有超先验(如 BPMF)的模型。这就是为什么我尝试使用 PMF 中的 MAP 值进行初始化,PMF 使用 U 和 V 上参数的点估计,而不是参数化的超先验。


不幸的是,Wishart 发行版无法正常运行。我最近在这里添加了一个警告:https://github.com/pymc-devs/pymc3/commit/642f63973ec9f807fb6e55a0fc4b31bdfa1f261e https://github.com/pymc-devs/pymc3/commit/642f63973ec9f807fb6e55a0fc4b31bdfa1f261e

有关此棘手发行版的更多讨论,请参见此处:https://github.com/pymc-devs/pymc3/issues/538 https://github.com/pymc-devs/pymc3/issues/538

您可以通过修复协方差矩阵来确认这就是源。如果是这样的话,我会尝试使用 JKL 先验分布:https://github.com/pymc-devs/pymc3/blob/master/pymc3/examples/LKJ_correlation.py https://github.com/pymc-devs/pymc3/blob/master/pymc3/examples/LKJ_correlation.py

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PyMC3 进行贝叶斯概率矩阵分解 (BPMF):使用“NUTS”的 PositiveDefiniteError 的相关文章

  • Bayesian Neural Network Recent Papers-贝叶斯神经网络相关研究文章

    Bayesian Neural Network Recent Papers 贝叶斯神经网络相关研究文章 MethodsVariational Inference VI Markov Chain Monte CarloMCMC 43 VIEn
  • 多维时序

    多维时序 MATLAB实现基于贝叶斯线性回归 Bayesian Regression 的多变量输入回归预测 目录 多维时序 MATLAB实现基于贝叶斯线性回归 Bayesian Regression 的多变量输入回归预测 预测效果 基本介绍
  • 在 pytorch 上使用 MC Dropout 测量不确定性

    我正在尝试在 Pytorch 上使用 Mc Dropout 实现贝叶斯 CNN 主要思想是 通过在测试时应用 dropout 并运行多次前向传递 您可以从各种不同的模型中获得预测 我发现了 Mc Dropout 的应用 但我真的不明白他们是
  • pymc3:多个观察值

    我有一些观测数据想要估计参数 我认为这将是尝试 PYMC3 的好机会 我的数据由一系列记录构成 每条记录包含一对与固定的一小时时间段相关的观察结果 一项观察是给定一小时内发生的事件总数 另一个观察结果是该时间段内的成功数量 例如 一个数据点
  • 使用 ggplot() 和 bsts() 包通过 MCMC 进行贝叶斯时间序列分析生成 BSTS 平均绝对百分比误差 (MAPE) 图

    Problem 我有一个名为 FID 的数据框 见下文 其中包含 年 和 月 两列以及 Sighting Frequency 鸟类计数 数据框包含3 years之间的观察值2015 2017 表示我有 36 个月的数据 我已经运行了使用 M
  • PyMC3 Dirichlet 过程多元高斯混合模型

    我无法让我的形状适用于狄利克雷过程高斯混合模型 我的数据observations有形状 number of samples number of dimensions 每个高斯均值应从各向同性先验中得出 每个高斯协方差应为单位矩阵 我以为我设
  • 在 PyMC3 中使用复数似然

    pymc version 3 0 theano version 0 6 0 dev RELEASE 我正在尝试将 PyMC3 与复杂的似然函数一起使用 第一个问题 这可能吗 这是我尝试使用托马斯 维茨基的帖子作为指导 import nump
  • 如何使用 rstanarm 以 APA 风格报告贝叶斯线性(混合)模型?

    我目前正在努力解决如何按照 APA 6 建议报告输出的问题rstanarm stan lmer 首先 我将在频率论方法中拟合混合模型 然后尝试使用贝叶斯框架执行相同的操作 这是获取数据的可重现代码 library tidyverse lib
  • 如何使用 pymc 制作离散状态马尔可夫模型?

    我试图找出如何正确制作离散状态马尔可夫链模型pymc http pymc devs github io pymc index html 举个例子 查看nbviewer http nbviewer ipython org github shp
  • PyMC3 中的简单动态模型

    我正在尝试在 PyMC3 中构建一个动态系统模型 以推断两个参数 该模型是流行病学中常用的基本SIR dS dt r0 g S I dI dt g I r S 1 其中 r0 和 g 是要推断的参数 到目前为止 我根本无法走得太远 我见过的
  • 在 Python 中加速 Metropolis-Hastings 算法

    我有一些使用 MCMC 对后验分布进行采样的代码 特别是黑斯廷斯大都会 https en wikipedia org wiki Metropolis E2 80 93Hastings algorithm 我使用 scipy 生成随机样本 i
  • 如何使用pymc参数化概率图模型?

    如何使用 pymc 参数化概率图形模型 假设我有一个带有两个节点的 PGMX and Y 可以说X gt Y是图表 And X有两个值 0 1 and Y也有两个值 0 1 我想使用 pymc 来学习分布的参数并填充 用于运行推理的图形模型
  • 为 Twitter 情绪分析项目寻找 C# 中的开源朴素贝叶斯分类器 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PyMC - 方差-协方差矩阵估计

    我读了下面的论文 http www3 stat sinica edu tw statistica oldpdf A10n416 pdf http www3 stat sinica edu tw statistica oldpdf A10n4
  • pymc3 具有来自核密度估计的自定义似然函数

    我正在尝试将 pymc3 与从一些观察数据派生的似然函数一起使用 这些观察到的数据不符合任何好的标准分布 所以我想根据这些观察来定义我自己的数据 一种方法是对观测值使用核密度估计 这在 pymc2 中是可能的 但与 pymc3 中的 The
  • 聚类和贝叶斯分类器 Matlab

    因此 我正处于下一步该做什么的十字路口 我开始学习一些机器学习算法并将其应用于复杂的数据集 现在我已经做到了 我从一开始的计划就是结合两种可能的分类器 试图建立一个多分类系统 但这就是我被困住的地方 我选择聚类算法 模糊 C 均值 在学习了
  • 使用GpyOpt时如何添加限制条件?

    目前我尝试使用 GPyOpt 最小化函数并获得优化的参数 import GPy import GPyOpt from math import log def f x x0 x1 x2 x3 x4 x5 x 0 x 1 x 2 x 3 x 4
  • 如何使用 logit 函数编写 JAGS 二项式模型文件

    我正在做一项作业 使用 JAGS 对二项式分布进行建模p参数是另一个变量的函数d 这就是我正在尝试做的 为两个参数 alpha beta 从后验生成 10000 个样本 当 dist 25 进行 100 次尝试时 根据后验预测成功次数生成样
  • 在 R 中编写多重积分函数

    为了将以下内容转换为函数 我想知道如何用 R 代码编写以下二重积分 bar x mu 假设pi0 and pi1以向量化方式实现函数 pi 0 和 pi 1 可能的解决方案是 integral lt function n mu s pi0
  • 使用带有高斯先验的主持人

    我试图在使用 emcee 之前使用高斯 但似乎无法完全弄清楚 基本上我想更换 def lnprior theta a b c theta if 1 0 lt a lt 2 0 and 1 0 lt b lt 2 0 and 1 0 lt c

随机推荐