为什么 scipy.optimize.mminimize 不使用提供的初始猜测
Why does scipy.optimize.mminimize not use the provided initial guesses
我有一个用 python 编写的应用程序,用于计算函数的最小 return 值。我使用 scipy.optimize.mminimize 和 SLSQP 作为优化方法。
它在一个循环中运行,为了节省时间并避免仅仅找到局部最小值,我需要它来使用我提供的 x0。
问题似乎是它不关心我给它的 x0。它只是开始以随机值进行优化。我做错了什么?
我已经编写了一个小型测试应用程序来测试最小化器上的 x0:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
global log
log = []
counter = 0
def callback(x):
global counter
counter += 1
log.append(x)
print('u_guessx',x)
return True
def objectivefunction(x, *arg):
SUM = 2*x[0]**3 + 3*(3-x[0])**2 - 5*x[2]**1 + 50
return SUM
# Defining Initial Conditions
u_guess = np.array([0 for u in range(3)])
#u_guess = np.zeros(4)
print("u shape: ",u_guess.shape)
print("u_init: ",u_guess)
#Simulation loop:
bounds_u = [(0,20) for i in u_guess]
# Run Optimizer
solution_guess = minimize(objectivefunction,
u_guess,
method = 'SLSQP',
callback = callback,
bounds=bounds_u,
options={'ftol': 1e-9, 'disp': True},
)
u_guess = solution_guess.x
u_opt = u_guess.item(0)
print("type(solution_guess.x): ",type(solution_guess.x))
print("u_opt: ",u_opt)
print("solution_guess.x: ",solution_guess.x)
#print("log: ",log)
print("counter: ",counter )
首先,你的objectivefunction()是不是错了?我怀疑应该是
def objectivefunction(x, *arg):
SUM = 2*x[0]**3 + 3*(3-x[1])**2 - 5*x[2]**1 + 50
return SUM
原函数中没有使用x[1],因此算法对x[1]不敏感。
其次,每次迭代后都会调用函数 callback()。因此,第一个输出不是初始条件,而是根据您的初始条件对最小值的第一个猜测。如果我 运行 更正后的程序并更改初始条件,它会输出不同的猜测。但是对于初始条件相同的不同运行s,它总是输出相同的猜测。没有随机性(假设我使用目标函数的更正版本)。
我有一个用 python 编写的应用程序,用于计算函数的最小 return 值。我使用 scipy.optimize.mminimize 和 SLSQP 作为优化方法。 它在一个循环中运行,为了节省时间并避免仅仅找到局部最小值,我需要它来使用我提供的 x0。 问题似乎是它不关心我给它的 x0。它只是开始以随机值进行优化。我做错了什么?
我已经编写了一个小型测试应用程序来测试最小化器上的 x0:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
global log
log = []
counter = 0
def callback(x):
global counter
counter += 1
log.append(x)
print('u_guessx',x)
return True
def objectivefunction(x, *arg):
SUM = 2*x[0]**3 + 3*(3-x[0])**2 - 5*x[2]**1 + 50
return SUM
# Defining Initial Conditions
u_guess = np.array([0 for u in range(3)])
#u_guess = np.zeros(4)
print("u shape: ",u_guess.shape)
print("u_init: ",u_guess)
#Simulation loop:
bounds_u = [(0,20) for i in u_guess]
# Run Optimizer
solution_guess = minimize(objectivefunction,
u_guess,
method = 'SLSQP',
callback = callback,
bounds=bounds_u,
options={'ftol': 1e-9, 'disp': True},
)
u_guess = solution_guess.x
u_opt = u_guess.item(0)
print("type(solution_guess.x): ",type(solution_guess.x))
print("u_opt: ",u_opt)
print("solution_guess.x: ",solution_guess.x)
#print("log: ",log)
print("counter: ",counter )
首先,你的objectivefunction()是不是错了?我怀疑应该是
def objectivefunction(x, *arg):
SUM = 2*x[0]**3 + 3*(3-x[1])**2 - 5*x[2]**1 + 50
return SUM
原函数中没有使用x[1],因此算法对x[1]不敏感。
其次,每次迭代后都会调用函数 callback()。因此,第一个输出不是初始条件,而是根据您的初始条件对最小值的第一个猜测。如果我 运行 更正后的程序并更改初始条件,它会输出不同的猜测。但是对于初始条件相同的不同运行s,它总是输出相同的猜测。没有随机性(假设我使用目标函数的更正版本)。