2015-07-28 8 views
0

Я пытаюсь выполнить оценку параметра для одного параметра в SoftMax функции выбора в следующем сценарии:Softmax выбор вероятность с категоричным в PyMC3

В каждом испытании три значения параметра приведено (например, [1 , 2,3]), и субъект делает выбор между опциями (0, 1 или 2). Функция softmax преобразует значения опций в вероятности выбора (вектор 3 вероятностей, суммируя до 1), в зависимости от температурного параметра (здесь связанного между 0 и 10).

Выбор в каждом испытании должен быть смоделирован как категориальное распределение с вероятностями пробного выбора, рассчитанными из softmax. Обратите внимание, что вероятности выбора категоризации зависят от значений опций и поэтому различаются в каждом испытании.

Вот что я придумал:

# Generate data 
nTrials = 60 # number of trials (value triplets and choices) 
np.random.seed(42) 
# generate nTrials triplets of values 
values = np.random.choice([1,2,3,4,5], size=(nTrials, 3)) 

choices = values.argmax(axis=1) # choose highest value option 
# add some random variation, so that *not* always the highest value option is chosen 
errors = np.random.rand(nTrials)>0.8 # determine trials with non-optimal choice 
# randomly determine new choices for these trials 
choices[errors] = np.random.choice([0,1,2], size=sum(errors==True)) 

# Model specification & estimation 
import pymc3 as pm 
from theano import tensor as t 
with pm.Model(): 

    # prior over theta 
    theta = pm.Uniform('theta', lower=0, upper=10) 

    # softmax implementation 
    enumerator = pm.exp(theta*values) 
    denominator = t.reshape(pm.sum(pm.exp(theta*values), axis=1), (nTrials, 1)) 
    ps = enumerator/denominator 

    # Likelihood (sampling model for the data) 
    for trial in range(nTrials): 
     yobs = pm.Categorical('yobs{}'.format(trial), p=ps[trial], observed=choices[trial]) 

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

Этот код не для nTrials больших, чем-то вроде 50 с очень длинным сообщением предупреждения/ошибки:

Предупреждение:

INFO (theano.gof.compilelock): Refreshing lock /Users/felixmolter/.theano/compiledir_Darwin-14.4.0-x86_64-i386-64bit-i386-2.7.8-64/lock_dir/lock 
INFO:theano.gof.compilelock:Refreshing lock /Users/felixmolter/.theano/compiledir_Darwin-14.4.0-x86_64-i386-64bit-i386-2.7.8-64/lock_dir/lock 
00001 #include <Python.h> 
00002 #include <iostream> 
00003 #include <math.h> 
00004 #include <numpy/arrayobject.h> 
00005 #include <numpy/arrayscalars.h> 
00006 #include <vector> 
00007 #include <algorithm> 
00008 ////////////////////// 
00009 //// Support Code 
00010 ////////////////////// 
00011 
00012 
00013  namespace { 
00014  struct __struct_compiled_op_65734e56ae54d89bdcf84e36893358e6 { 
00015   PyObject* __ERROR; 
00016 
00017   PyObject* storage_V3; 
00018 PyObject* storage_V5; 
00019 PyObject* storage_V7; 
00020 PyObject* storage_V9; 
00021 PyObject* storage_V11; 
00022 PyObject* storage_V13; 
[...] 

Ошибка:

Exception: ('The following error happened while compiling the node', Elemwise{Composite{((Switch(LE(Abs((i0 + i1)), i2), log(i3), i4) + Switch(LE(Abs((i0 + i5)), i2), log(i6), i4) + Switch(LE(Abs((i0 + i7)), i2), log(i8), i4) + Switch(LE(Abs((i0 + i9)), i2), log(i10), i4) + Switch(LE(Abs((i0 + i11)), [...] 

Я довольно новичок в PyMC (и Theano), и я чувствую, что моя реализация действительно неуклюжая и субоптимальная. Любая помощь и советы очень ценится!

Felix

Edit: Я загрузил код, как ноутбук, показывая предупреждения и сообщения об ошибках в полном объеме: http://nbviewer.ipython.org/github/moltaire/softmaxPyMC/blob/master/softmax_stackoverflow.ipynb

+1

Для того, чтобы помочь, мне нужно полное сообщение об ошибке. – nouiz

+0

Спасибо за ваш ответ. Я загрузил записную книжку с полным сообщением об ошибке в github: https://github.com/moltaire/softmaxPyMC/blob/master/softmax_stackoverflow.ipynb – Felix

ответ

0

я нашел снова этот случай. Так же, как и последующие, теперь они не способны воспроизвести его сейчас. Поэтому я думаю, что это исправлено. Мы исправили связанную проблему, которая могла вызвать в некоторых случаях эту ошибку.

Работает с g ++ 4.5.1. Если у вас есть эта проблема, обновите Theano до версии разработки. Если это не исправить, попробуйте использовать g ++ более недавно, это может быть связано с более старой версией g ++.