非常感谢您对堆栈溢出所做的所有贡献。我几乎在这里找到了我问题的答案,而无需发布新问题。
我正在使用11个变量优化一个非常昂贵的函数(计算一个新点需要花费几个小时)。 我们正在使用代理功能优化方法,我需要将“代理功能”适合“昂贵的功能”。
为了进行优化,我们为11个变量中的每一个选择了一个二级政治函数a * x ** 2 + b * x + c,因此我们得到11(a)+ 11(b)+1 (c)= 23个参数
我没有找到太多有关具有多个变量和参数的scypy.curve_fit的信息。
您可以在下面找到一个简化的代码,其中包括测试台的创建。
问题: 1.如果在要优化的函数中打印X变量,则可以看到curve_fit每次都传递整个初始x1数组,而没有更改。什么是解释? (我尚未找到有关curve_fit的内部行为的任何信息) 2.您是否推荐其他适合的功能? 3. scypy是这项工作的好工具吗?您还有其他建议吗? 4.有没有更多的方法来管理参数?
import numpy as np
from scipy.optimize import curve_fit
def func_model(x, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11,
c):
a = [a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11]
b = [b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11]
y = np.sum(a * np.square(x) + b * x) + c
return y
def func_model2(X, P):
return func_model(X, P[0], P[1], P[2], P[3], P[4], P[5], P[6], P[7], P[8], P[9], P[10], P[11], P[12], P[13], P[14],
P[15],
P[16], P[17], P[18], P[19], P[20], P[21], P[22])
# =====================================================================================================================
# ====================================================Comienza el programam ============================================
p0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] # 2 x 11 + 1 parámetros
# Prepara las martrices X1 e Y1
x1 = np.zeros((30, 11), dtype=np.float64)
y1 = np.zeros(30, dtype=np.float64)
for sample in range(0, 30):
x1[sample, :] = np.linspace(0.1, sample, 11)
for sample in range(0, 30):
y1[sample] = func_model2(x1[sample, :], p0) + np.random.random(1) / 100
opt_param, opt_cov = curve_fit(func_model, x1, y1)