Python Scipy 优化:日志中遇到运行时警告无效值
Python Scipy Optimization: Runtime Warning Invalid Value Encountered in Log
我正在尝试使用 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])
我之前遇到过这个问题,它是一个更简单的优化问题,它返回一个 不正确的答案 ,我通过更改我的初始猜测来解决这个问题。我不明白为什么会这样。然而,在这种情况下,最初的猜测是非常好的近似值,所以我想保留它们,并且改变它们并没有设法减轻运行时警告。
总而言之,解决方案是正确的,但我不明白运行时警告。
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')
我正在尝试使用 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])
我之前遇到过这个问题,它是一个更简单的优化问题,它返回一个 不正确的答案 ,我通过更改我的初始猜测来解决这个问题。我不明白为什么会这样。然而,在这种情况下,最初的猜测是非常好的近似值,所以我想保留它们,并且改变它们并没有设法减轻运行时警告。
总而言之,解决方案是正确的,但我不明白运行时警告。
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')