Условная модель Logit в pymc3 - PullRequest
       91

Условная модель Logit в pymc3

0 голосов
/ 23 сентября 2019

Я пытаюсь создать условную модель логита в pymc3.У меня есть код, который генерирует параметры, которые идентифицируют правильные категории в моей игрушечной проблеме.Однако параметры, которые он производит, далеки от оптимальных.Ниже я показываю версию, где я сгенерировал MAP.С диффузными априорами это должно быть несколько близко к MLE, но легко видеть, что бета-вектор (0, больший отрицательный, 0) даст гораздо лучшие логарифмические вероятности.

Что особенно озадачиваетЯ в том, что с увеличением количества случаев оценка бета [1] становится еще ближе к 0, и модель становится менее определенной из соответствующих категорий.Я бы подумал, что обратное должно быть правдой.

Любое разъяснение будет наиболее ценно.

NumberOfCases = 5
NumberOfOptions = 3
NumberOfFeatures = 3

# generate data

inputs = ones((NumberOfCases, NumberOfFeatures, NumberOfOptions), float)
choices = np.zeros(NumberOfCases, dtype="int")

for case in range(NumberOfCases):
    c = randint(NumberOfOptions)
    choices[case] = c
    inputs[case, 1, c] = 0.0   # set up dimension 1 to be a better predictor than the other dimensions

# define model and sample

with pm.Model() as model_sf:
    beta = pm.Normal ('beta', mu = 0, sd = 100, shape = (1,NumberOfFeatures))
    mu = tt.tensordot(beta, inputs, [[1], [1]])[0,:,:]
    theta = pm.Deterministic("theta", tt.nnet.softmax(mu))
    y = pm.Categorical ('y', p = theta, observed = choices)
    d = pm.find_MAP()


print(choices)
print(d["beta"])
print(d["theta"])

Вывод:

[1 2 0 1 0]
[[-0.     -0.1178 -0.    ]]
[[0.32 0.36 0.32]
 [0.32 0.32 0.36]
 [0.36 0.32 0.32]
 [0.32 0.36 0.32]
 [0.36 0.32 0.32]]
...