我希望找到一个Scipy模块,以类似于下面测试示例的方式优化常量。这是否适合使用Basinhoping及其输入?我的意图是通过将"系数"优化为值"123"来最小化"factorarray"one_answers"factorarrayTrue"之间的差(SSE=0),从而使"factorarray"one_answers"FactorarrayTruy"彼此相等(SSE=0)。
import numpy as np
from scipy.optimize import basinhopping
inputarray = [1,2,3,4,5]
coefficient = 100
def objective_function(inputarray, coefficient):
factorarray = np.empty(len(inputarray))
factorarrayTrue = np.empty(len(inputarray))
for i, num in enumerate(inputarray):
factorarray[i] = num * coefficient
factorarrayTrue[i] = num *123
#### SQUARE ERROR
SEzip = zip(factorarrayTrue, factorarray)
sse = 0
for e in SEzip:
sse += (e[0] - e[1])**2
return sse
minimizer_kwargs = {"method": "COBYLA", "args": (coefficient)}
result = basinhopping(objective_function(inputarray, coefficient), coefficient, minimizer_kwargs = minimizer_kwargs)
您最初的代码不太正确。传递给basinhoping()的第一个参数应该只是您想要调用的函数。scipy将迭代调用该函数,该函数应将可优化系数作为其第一个参数。inputarray应该是minimizer_kwargs中提供的附加参数之一。
以下是有效的:
import numpy as np
from scipy.optimize import basinhopping
inputarray = [1,2,3,4,5]
coefficient = 100
def objective_function(coefficient, inputarray):
factorarray = np.empty(len(inputarray))
factorarrayTrue = np.empty(len(inputarray))
for i, num in enumerate(inputarray):
factorarray[i] = num * coefficient
factorarrayTrue[i] = num *123
#### SQUARE ERROR
SEzip = zip(factorarrayTrue, factorarray)
sse = 0
for e in SEzip:
sse += (e[0] - e[1])**2
return sse
minimizer_kwargs = {"method": "COBYLA", "args": (inputarray) }
result = basinhopping(objective_function, coefficient, minimizer_kwargs = minimizer_kwargs)
print(result)