2017-11-28 16 views
0

Scipy를 사용하여 후자의 두 가지 제약 기능이있는 첫 번째 기능을 최적화하려고합니다.Python Scipy 최적화 : 런타임 경고 로그에서 잘못된 값이 발생했습니다

def entropy(x): 
    entropy = 0 
    for i in range(6): 
     entropy = entropy + x[i]*np.log(x[i]) 
    return entropy 

def constraint_1(x): 
    validpmf = 0 
    for i in range(6): 
     validpmf = validpmf + x[i] 
    return validpmf - 1 

def constraint_2(x): 
    mean = 0 
    for i in range(7): 
     mean = mean + (i*x[i-1]) 
    return mean - 4.5 

여기는 Scipy 코드입니다. 나는 그것이 오답 반환 된 간단한 최적화 문제와 전에이 문제를 가지고

[ 0.05447023 0.07863089 0.1140969 0.16556351 0.23970755 0.34753092] 
RuntimeWarning: invalid value encountered in log 
entropy = entropy + x[i]*np.log(x[i]) 

: 나는 다시 실제 정답을 수신하고,하지만 난 런타임 경고를 얻고있다

ans = sp.optimize.minimize(entropy, [.04,.08,.1,.15,.25,.35], \ 
          constraints = cons, jac = False, method = 'SLSQP') 

처음의 추측을 바꾸어 수정했습니다. 나는 그것이 왜 효과가 있었는지 이해하지 못한다. 그러나이 경우 초기 추측은 아주 좋은 근사값이므로 계속 유지하려고하며 런타임 경고를 완화하지 못했습니다.

요약하면 솔루션은 정확하지만 런타임 경고는 이해할 수 없습니다.

답변

1

log은 0으로 정의되지 않았거나 컴퓨터가 0 인 경우 정의되어 있지 않습니다.

당신은 양의 값으로 제한하여 경고를 억제 할 수

import numpy as np 
import scipy as sp 
import scipy.optimize 

def entropy(x): 
    entropy = 0 
    for i in range(6): 
     entropy = entropy + x[i]*np.log(x[i]) 
    return entropy 

def constraint_1(x): 
    validpmf = 0 
    for i in range(6): 
     validpmf = validpmf + x[i] 
    return validpmf - 1 

def constraint_2(x): 
    mean = 0 
    for i in range(6): 
     mean = mean + (i*x[i]) 
    return mean - 4.5 

abstol = 1e-6 

cons = ({'type': 'eq', 'fun': constraint_1}, 
     {'type': 'eq', 'fun': constraint_2}, 
     {'type': 'ineq', 'fun': lambda x: x - abstol}) 


ans = sp.optimize.minimize(entropy, [.04,.08,.1,.15,.25,.35], \ 
          constraints = cons, jac = False, method = 'SLSQP')