【发布时间】:2021-10-01 12:17:02
【问题描述】:
我这几天一直在学习优化方法。我编写的以下代码返回了RuntimeWarning。
import numpy as np
from scipy.optimize import minimize
def func(a, x):
return 1 + (x - 0.5) * a
def log_like(a, x):
sum1 = 0
for i in range(len(x)):
sum1 += np.log(func(a, x[i]))
return sum1
def log_like_prime(a, x):
sum1 = 0
for i in range(len(x)):
sum1 += (x[i] - 0.5) / (1 + (x[i] - 0.5) * a)
return sum1
def log_like_prime2(a, x):
sum1 = 0
for i in range(len(x)):
sum1 += -(x[i] - 0.5) ** 2.0 / (1 + (x[i] - 0.5) * a) ** 2.0
return sum1
x = [0.89, 0.03, 0.50, 0.36, 0.49]
a = -1
a_opt = minimize(
log_like, a, args=(x,), method="Newton-CG",
jac=log_like_prime, hess=log_like_prime2
)
print(a_opt)
返回以下错误:
fun: array([0.03194467])
jac: array([0.18690836])
message: 'Warning: Desired error not necessarily achieved due to precision loss.'
nfev: 21
nhev: 1
nit: 0
njev: 21
status: 2
success: False
x: array([-1.])
py:17: RuntimeWarning: invalid value encountered in log
sum1 += np.log(func(a, x[i]))
py:17: RuntimeWarning: invalid value encountered in log
sum1 += np.log(func(a, x[i]))
对于x = [0.89, 0.03, 0.50, 0.36, 0.49]的给定值不应返回无效值,对数部分内的函数不得返回负值。我不明白为什么会出现这样的问题。
【问题讨论】:
-
您确定要最小化函数而不是最大化它吗?
x的选择没有本地最低要求。
标签: python scipy scipy-optimize-minimize