2017-11-28 14 views
0

後者の2つの制約関数である最初の関数を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はゼロでは定義されていません。また、コンピュータがゼロの場合は定義されていません。

あなたは正の値に制限することで警告を抑制することができます。

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') 
関連する問題