2014-12-19 56 views
2

我有一個數似然函數,它是總和在很長的客戶名單的功能,我想用scipy.optimize.minimize()方法來optimpize它。最大限度地減少一些個體數似然函數中使用SciPy的

def log_likelihood_individual(r, alpha, a, b, x, tx, t): 
    ln_a1 = gammaln(r + x) - gammaln(r) + r * log(alpha) 
    ln_a2 = gammaln(a + b) + gammaln(b + x) - gammaln(b) - gammaln(a + b + x) 
    ln_a3 = -(r + x) * log(alpha + t) 
    a4 = 0 
    if x > 0: 
     a4 = exp(log(a) - log(b + x - 1) - (r + x) * log(alpha + tx)) 
    return ln_a1 + ln_a2 + log(exp(ln_a3) + a4) 


def log_likelihood(r, alpha, a, b, customers): 
    if r <= 0 or alpha <= 0 or a <= 0 or b <= 0: 
     return -np.inf 
    c = sum([log_likelihood_individual(r, alpha, a, b, x, tx, t) for x, tx, t in customers]) 
    return c 


def maximize(customers): 
    negative_ll = lambda params: -log_likelihood(*params, customers=customers) 
    params0 = np.array([1., 1., 1., 1.]) 
    res = minimize(negative_ll, params0, method='CG') 
    return res 

我嘗試使用scipy list的各種算法,但每次算法都會丟失自身。任何人都可以給我一個關於如何解決這些問題的一般性建議,即最大限度地減少我無法理解的功能?

回答

1

一個一般性的問題引發普遍的答案;)

最適合我的嘗試失敗(即不收斂),因爲較差的空調初始值。問問你自己:

  • params0 = np.array([1., 1., 1., 1.])真是一個很好的初始猜測?
  • 你也試過params0 = np.array([0., 0., 0., 0.])或其他組合(蠻力)
  • 你可以創建一個示例集,你知道參數的理想值嗎?你是否試圖適應它?

如果沒有上述作品出來,這個問題似乎更爲複雜,但配件的問題90%可以通過回答上述問題得到解決。

+0

謝謝你的建議,確實是PARAMS不是很理想,我MODIF他們一點點,但是我還是沒有結果,因爲我的猜測是完全的經驗。我最好的時刻的猜測是:2.5,10,0.001,10] – sweeeeeet 2014-12-19 09:58:11

+0

如何測試子集,然後呢? – jkalden 2014-12-19 10:12:48

+1

創建一個可能有10個客戶的集合,您可以知道結果應該是什麼。它是否會收斂,如果是的話,是否接近您已知的最佳擬合參數? – jkalden 2014-12-19 10:16:19

相關問題