3

私が取り組んでいるモデルは、多項ロジット選択モデルです。これは非常に特殊なデータセットであるため、他の既存の MNLogit ライブラリは私のデータに適合しません。

基本的に、これは非常に複雑な関数で、11 個のパラメーターを取り、対数尤度値を返します。次に、scipy.optimize.minimize を使用して対数尤度を最小化できる最適なパラメーター値を見つける必要があります。

さまざまな方法で発生する問題は次のとおりです。

「Nelder-Mead」: うまく機能し、常に正しい答えを教えてくれます。ただし、非常に遅いです。より複雑な設定の別の関数の場合、最適なポイントに到達するまでに 15 時間かかります。同時に、同じ関数は、fminunc (デフォルトで BFGS を使用) を使用して Matlab で 1 時間しかかかりません。

'BFGS': これは、Matlab で使用される方法です。単純な関数に対してはうまく機能します。ただし、私が持っている関数では、常に収束に失敗し、「精度が失われたために必ずしも達成されたというわけではありません。」を返します。オプションをいじって多くの時間を費やしましたが、それでもうまくいきませんでした。

'Powell': すぐにうまく収束しますが、間違った答えを返します。コードは以下に表示されます (x0 が正解です。Nelder-Mead は初期値に関係なく機能します)。ここでデータを取得できます: https://www.dropbox.com/s/aap2dhor5jyxy94/data.csv

ありがとう!

import pandas as pd
import numpy as np
from scipy.optimize import minimize

# https://www.dropbox.com/s/aap2dhor5jyxy94/data.csv
df = pd.read_csv('data.csv', index_col=0)
dfhh = df.hh
B = df.ix[:,'b0':'b4'].values # NT*5
P = df.ix[:,'p1':'p4'].values # NT*4
F = df.ix[:,'f1':'f4'].values # NT*4
SDV = df.ix[:,'lagb1':'lagb4'].values

def Li(x):
    b1 = x[0] # coeff on prices
    b2 = x[1] # coeff on features
    a = x[2:7] # take first 4 values as alpha
    E = np.exp(a + b1*P + b2*F) # (1*4) + (NT*4) + (NT*4) build matrix (NT*J) for each exp()
    E = np.insert(E, 0, 1, axis=1) # (NT*5)
    denom = E.sum(1)
    return -np.log((B * E).sum(1) / denom).sum()


x0 = np.array([-32.31028223, 0.23965953, 0.84739154, 0.25418215,-3.38757007,-0.38036966])
np.random.seed(0)
x0 = x0 + np.random.rand(6)

 minL = minimize(Li, x0, method='Nelder-Mead',options={'xtol': 1e-8, 'disp': True})
# minL = minimize(Li, x0, method='BFGS')
# minL = minimize(Li, x0, method='Powell', options={'xtol': 1e-12, 'ftol': 1e-12})
print minL

更新: 2014 年 3 月 7 日 コードのより単純なバージョン Powell は非常に小さな許容誤差でうまく動作しますが、この場合、Powell の速度は Nelder-Mead よりも遅くなります。BFGS はまだ機能しません。

4

0 に答える 0