Python Scipy优化:日志中遇到的运行时警告无效值

时间:2017-11-28 18:51:48

标签: python numpy scipy mathematical-optimization entropy

我正在尝试使用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代码。

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

我收到了实际的正确回答,但我收到了运行时警告:

[ 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])

之前我遇到过这个问题,一个更简单的优化问题,它返回了一个错误答案,我通过改变我的初步猜测来解决这个问题。我不明白为什么会这样。然而,在这种情况下,初始猜测是非常好的近似,所以我想保留它们,并且还改变它们并没有设法减轻运行时警告。

总结一下,解决方案是正确的,但我不理解运行时警告。

1 个答案:

答案 0 :(得分: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')