Я пытаюсь создать условную модель логита в 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]]