Я хотел бы использовать байесовскую многомерную линейную регрессию для оценки силы игроков в командных видах спорта (например, хоккей, баскетбол или футбол).Для этого я создаю матрицу X, в которой игроки представлены в виде столбцов, а совпадения - в виде строк.Для каждого матча вход игрока равен 1 (игрок играет в составе команды хозяев), -1 (игрок играет в команде гостей) или 0 (игрок не участвует в этой игре).Зависимая переменная Y определяется как разница в баллах для обеих команд в каждом матче (Score_home_team - Score_away_team).
Таким образом, количество параметров будет довольно большим в течение одного сезона (например, 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"
Теперь выборка запущена.Однако он настолько медленный, что даже если я беру только 35 из 300 строк, выборка не будет завершена в течение 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.
Любая помощь приветствуется!