Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用PyMC3和大数据集-括号嵌套级别的贝叶斯线性回归超过了最大和慢速性能_Python 3.x_Bayesian - Fatal编程技术网

Python 3.x 使用PyMC3和大数据集-括号嵌套级别的贝叶斯线性回归超过了最大和慢速性能

Python 3.x 使用PyMC3和大数据集-括号嵌套级别的贝叶斯线性回归超过了最大和慢速性能,python-3.x,bayesian,Python 3.x,Bayesian,我想使用贝叶斯多元线性回归来估计团队运动(如冰球、篮球或足球)中运动员的力量。为此,我创建了一个矩阵X,其中包含玩家作为列,匹配项作为行。对于每场比赛,球员条目为1(球员在主队比赛)、-1(球员在客队比赛)或0(球员不参加本场比赛)。因变量Y定义为两队在每场比赛中的得分差异(主场得分-客场得分) 因此,一个赛季的参数数量将相当大(例如,X由300行X 450列定义;即450个玩家系数+y截距)。运行fit时,我遇到一个编译错误: ('Compilation failed (return stat

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

因此,一个赛季的参数数量将相当大(例如,X由300行X 450列定义;即450个玩家系数+y截距)。运行fit时,我遇到一个编译错误:

('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)
小样本量(例如9行80列)的采样在7分钟内完成。然而,时间随着样本量的增加而显著增加

有什么建议可以让贝叶斯线性回归在可行的时间内运行吗?使用PyMC3这些问题可行吗(记得我遇到了一个括号嵌套错误)?我在最近的一篇文章中看到,这种分析在R()中是可行的。因此,我想它也应该以某种方式与Python3一起工作


感谢您的帮助

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

beta = pm.Normal('beta', mu=0, sd=10, shape=X.shape[1])
...
mu = alpha + pm.math.dot(X, beta)
...
如果需要为
mu
和/或
sd
指定不同的先验值,则这些参数接受任何接受的值,因此可以传递列表或numpy数组


我强烈建议您熟悉and运算,因为有时您必须使用and运算来正确地处理随机变量,一般来说,这应该会产生更高效的代码。

也许可以尝试将其转换为点积形式,而不是使用
来处理
循环。类似于
beta=pm.Normal('beta',mu=0,sd=10,shape=X.shape[1])
mu=alpha+pm.math.dot(X,beta)
。也许,这还演示了如何增加
X
以包含截距,并避免使用单独的
alpha
变量。Merv,非常感谢您的有用评论。您建议使用点积而不是for循环/字典解决了括号嵌套问题和性能缓慢问题。程序运行良好,所有beta都设置为mu=0。然而,现在我不知道如何为每个玩家包含不同的MU?有没有办法使用您建议的beta定义将不同的mu和sigma包含到beta中?最后,我想用不同的先验值对每个玩家进行贝叶斯线性回归。太好了,梅尔夫!非常感谢你!mu和sd接受numpy阵列。在我的例子中,mu也接受一个列表,但sd不接受。使用numpy阵列,一切正常!