2016-09-17 6 views
0

Я написал очень простую реализацию вероятности/градиента для условной логитной модели (пояснил here) - вероятность работает отлично, но градиент неправильный. Мои два вопроса: мой вывод правильного градиента, и если да, то является ли моя реализация в Python правильной? Если это лучше спросить на форуме Math, не стесняйтесь двигаться.Почему эта реализация условного логического градиента не выполняется?

Модель: enter image description here

Вход Вероятность: enter image description here

Наконец, градиент: enter image description here

Здесь, я это каждое наблюдение, J является альтернативой в пределах наблюдения I, с является выбранная альтернатива в наблюдение i, Xij - это вектор признаков для выбора j в i, а B - соответствующие коэффициенты. Формула правдоподобия должна иметь вектор признаков, умноженный на вектор коэффициентов. Моя ошибка

Моя реализация для вероятности и градиентов заключаются в следующем:

правдоподобие:

def log_likelihood(coefs, observations, config, lasso): 
    def func(grp): 
     mtrx = grp.as_matrix(config.features) 
     dp = np.dot(mtrx, coefs) 
     sub = np.log(np.exp(dp).sum()) 
     inc = (dp * grp['choice']).sum() 
     return inc - sub 
    ll = observations.groupby(['observation_id']).apply(func).sum() 
    if lasso is not None: 
     ll -= (np.abs(coefs).sum() * lasso) 
    neg_log = ll * -1 
return neg_log 

Градиент:

def gradient(coefs, observations, config, lasso): 
    def func(grp): 
     mtrx = grp.as_matrix([config.features]) 
     tmtrx = mtrx.transpose() 
     tmp = np.exp(tmtrx * coefs[:, np.newaxis]) 
     sub = (tmp * tmtrx).sum(1)/tmp.sum(1) 
     inc = (mtrx * grp['choice'][:, np.newaxis]).sum(0) 
     ret = inc - sub 
     return ret 
    return -1 * observations.groupby(['observation_id']).apply(func).sum() 

Здесь coefs является NumPy массив, содержащий коэффициенты , наблюдения - это кадр данных, где каждая строка представляет собой альтернативу внутри наблюдения, а столбцы - это столбцы выбора столбца ting 0/1 для выбора внутри столбца и столбца observ_id, где все альтернативы внутри наблюдения имеют одинаковый идентификатор, и, наконец, config - это dict, содержащий элементы-члены, которые являются списком столбцов в наблюдениях df, содержащих функции , Примечание. Я тестирую без использования параметра lasso. Пример ниже, как выглядят данные.

Я проверял, что вероятность правильная; однако ошибка для градиента очень велика при использовании scipy.optimize.check_grad. Я также могу решить для B, когда не пропускаю градиент в scipy.optimize.minimize. Градиент оценивается так, как я ожидал, поэтому на этом этапе я могу только думать, что мой вывод неверен, но я не уверен, почему.

In [27]: df.head(14) 
Out[27]: 
      x1  x2  x3 observation_id choice 
0 0.187785 0.435922 -0.475349    211  1 
1 -0.935956 -0.405833 -1.753128    211  0 
2 0.210424 0.141579 0.415933    211  0 
3 0.507025 0.307965 -0.198089    211  0 
4 0.080658 -0.125473 -0.592301    211  0 
5 0.605302 0.239491 0.287094    293  1 
6 0.259580 0.415388 -0.396969    293  0 
7 -0.637267 -0.984442 -1.376066    293  0 
8 0.241874 0.435922 0.855742    293  0 
9 0.831534 0.650425 0.930592    293  0 
10 -1.682565 0.435922 -2.517229    293  0 
11 -0.149186 0.300299 0.494513    293  0 
12 -1.918179 -9.967421 -2.774450    293  0 
13 -1.185817 0.295601 -1.974923    293  0 

ответ

0

Вывод был неверен. При экспонировании я включал только функцию и коэффициент для частной производной данного коэффициента. Скорее, это должно было быть e для точечного произведения всех функций и коэффициентов.

 Смежные вопросы

  • Нет связанных вопросов^_^