gpt4 book ai didi

python-3.x - 使用 PyMC3 和大型数据集的贝叶斯线性回归 - 括号嵌套级别超过最大值且性能低下

转载 作者:行者123 更新时间:2023-12-02 02:47:40 27 4
gpt4 key购买 nike

我想使用贝叶斯多元线性回归来估计团队运动(例如冰球、篮球或足球)中运动员的实力。为此,我创建了一个矩阵 X,其中玩家作为列,比赛作为行。对于每场比赛,球员条目为 1(球员在主队比赛)、-1(球员在客队比赛)或 0(球员未参加本场比赛)。因变量 Y 定义为两队在每场比赛中的得分差异 (Score_home_team - Score_away_team)。

因此,一个赛季的参数数量将非常大(例如,X 由 300 行 x 450 列定义;即 450 个球员系数 + y 轴截距)。运行拟合时,我遇到了一个编译错误:

('Compilation failed (return status=1): /Users/me/.theano/compiledir_Darwin-17.7.0-x86_64-i386-64bit-i386-3.6.5-64/tmpdxxc2379/mod.cpp:27598:32: fatal error: bracket nesting level exceeded maximum of 256.

我试图通过设置来处理这个错误:

theano.config.gcc.cxxflags = "-fbracket-depth=1024"

现在,采样正在运行。但是,它太慢了,即使我只取 300 行中的 35 行,采样也不会在 20 分钟内完成。

这是我的基本代码:

import pymc3 as pm
basic_model = pm.Model()

with basic_model:

# Priors for beta coefficients - these are the coefficients of the players
dict_betas = {}
for col in X.columns:
dict_betas[col] = pm.Normal(col, mu=0, sd=10)

# Priors for unknown model parameters
alpha = pm.Normal('alpha', mu=0, sd=10) # alpha is the y-intercept
sigma = pm.HalfNormal('sigma', sd=1) # standard deviation of the observations

# Expected value of outcome
mu = alpha
for col in X.columns:
mu = mu + dict_betas[col] * X[col] # mu = alpha + beta_1 * Player_1 + beta_2 * Player_2 + ...

# Likelihood (sampling distribution) of observations
Y_obs = pm.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)

对于大型数据集,模型的实例化在一分钟内运行。我使用以下方法进行采样:

with basic_model:

# draw 500 posterior samples
trace = pm.sample(500)

在 7 分钟内完成小样本量(例如 9 行,80 列)的采样。然而,随着样本量的增加,时间也在大幅增加。

有什么建议可以让这个贝叶斯线性回归在可行的时间内运行吗?使用 PyMC3 是否可以解决这些问题(记得我遇到过括号嵌套错误)吗?我在最近的一份出版物中看到,这种分析在 R ( https://arxiv.org/pdf/1810.08032.pdf) 中是可行的。因此,我想它也应该以某种方式与 Python 3 一起工作。

感谢任何帮助!

最佳答案

消除 for 循环应该可以提高性能,并且还可以解决您报告的嵌套问题。 Theano TensorVariables 和派生自它们的 PyMC3 随机变量已经是多维的并且支持线性代数运算。尝试将您的代码更改为类似

的代码
beta = pm.Normal('beta', mu=0, sd=10, shape=X.shape[1])
...
mu = alpha + pm.math.dot(X, beta)
...

如果您需要为 mu 和/或 sd 指定不同的先验值,这些参数接受任何 theano.tensor.as_tensor_variable()接受,因此您可以传递列表或 numpy 数组。

我强烈建议您熟悉 theano.tensorpymc3.math操作,因为有时您必须使用这些操作来正确操作随机变量,并且通常它会导致更高效的代码。

关于python-3.x - 使用 PyMC3 和大型数据集的贝叶斯线性回归 - 括号嵌套级别超过最大值且性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670475/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com