我希望使用贝叶斯多元线性回归来估计团体运动中球员的实力(例如冰球、篮球或足球)。为此,我创建了一个矩阵X,其中包含球员作为列和比赛作为行。对于每场比赛,球员条目是1(球员在主队中出场)、-1(球员在客队中出场)或0(球员不参加此场比赛)。因此,在每场比赛中,依赖变量Y被定义为两个队的得分差(主队得分-客队得分)。
因此,一个赛季的参数数量将非常大(例如,X由300行x450列定义;即450个球员系数+y截距)。当运行拟合时,我遇到了编译错误:
现在,抽样正在运行。然而,即使我只取300行中的35行,抽样也需要20分钟以上才能完成。
这是我的基本代码:
小样本量(例如9行,80列)的采样在7分钟内完成。然而,随着样本量的增加,时间显著增加。
有什么建议可以使这个贝叶斯线性回归在合理的时间内运行?这种问题是否可用PyMC3解决(记得我遇到了一个括号嵌套错误)?我在最近的一篇论文中看到,这种分析在R中是可行的(https://arxiv.org/pdf/1810.08032.pdf)。因此,我想它也应该在Python 3中以某种方式工作。
感谢任何帮助!
因此,一个赛季的参数数量将非常大(例如,X由300行x450列定义;即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)
小样本量(例如9行,80列)的采样在7分钟内完成。然而,随着样本量的增加,时间显著增加。
有什么建议可以使这个贝叶斯线性回归在合理的时间内运行?这种问题是否可用PyMC3解决(记得我遇到了一个括号嵌套错误)?我在最近的一篇论文中看到,这种分析在R中是可行的(https://arxiv.org/pdf/1810.08032.pdf)。因此,我想它也应该在Python 3中以某种方式工作。
感谢任何帮助!
beta = pm.Normal('beta', mu=0, sd=10, shape=X.shape[1])
和mu = alpha + pm.math.dot(X, beta)
。也许这个答案可能会有所帮助,它还演示了如何增加X
以包括截距并避免单独使用alpha
变量。 - merv