Как исправить эту вероятность в Python и построить ее? - PullRequest
0 голосов
/ 27 февраля 2019

Для модели линейной логистической регрессии, сформулированной следующим образом: picture

Я пытался закодировать вероятность и построить ее график, чтобы увидеть, как она выглядит.Вот как я это реализовал:

# Define likelihood function
def likelihood(beta):
    # reshape correctly
    beta = np.array(beta).reshape(-1, 1)
    # X beta has x_i^T * \beta in every entry
    Xbeta = np.matmul(X, beta).flatten()
    exp_argument = np.multiply(newrows.y.values, Xbeta)
    numerator = np.exp(exp_argument.sum())
    denominator = np.prod((1 + np.exp(Xbeta)))
    return numerator / denominator
# Prepare a grid
b1 = np.linspace(-10, -8.5, 100)   # these values chosen by trial and error
b2 = np.linspace(4.5, 6.2, 100)    # these values chosen by trial and error
B1, B2 = np.meshgrid(b1, b2)
# Evaluate function at the gridpoints
Zbeta = np.array([likelihood(thing) for thing in zip(B1.ravel(), B2.ravel())])
Zbeta = Zbeta.reshape(B1.shape)
# Surface plot
fig = plt.figure(figsize=(15, 6))
ax = fig.add_subplot(121, projection='3d')
ax.plot_surface(B1, B2, Zbeta)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax = fig.add_subplot(122)
ax.contour(B1, B2, Zbeta)
plt.show()

Здесь матрица X - это матрица, содержащая «поддельные» наблюдения Бернулли.Это хорошо известный набор данных под названием BeetleMortality, который выглядит следующим образом, и я сохранил его в кадре данных Pandas с именем data.

figure2

, которыйв основном биномиальные наблюдения.Я создал наблюдения Бернулли следующим образом:

newrows = np.zeros((data.NumberExposed.sum(), 2))
for index, row in data.iterrows():
    obs = np.zeros(int(row.NumberExposed), dtype=int)
    obs[:int(row.NumberKilled)] = 1
    np.random.shuffle(obs)
    obs = obs.reshape(-1, 1)
    doses = np.repeat(row.Dose, len(obs)).reshape(-1, 1)
    obs = np.hstack((doses, obs))
    from_index = int(row.CumulativeN - row.NumberExposed)
    to_index = int(row.CumulativeN)
    newrows[from_index:to_index] = obs 
# Save it as a dataframe
newrows = pd.DataFrame(newrows, columns=['x', 'y'])
# Notice that if you wanted to check that these calculations are correct use: newrows.groupby('x').sum()
newrows.head()

Кажется, все работает нормально, за исключением того, что когда я пытаюсь построить это, я получаю следующий график:

figure3

Что абсолютно бессмысленно .. Любая помощь?Может я неправильно реализую функцию правдоподобия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...