我有多个参数的功能。我希望针对单个变量优化它,同时保持其他变量不变。为此,我想使用来自spicy.optimize的minimize_scalar。我阅读了文档,但我仍然很困惑如何告诉minim_scalar我想要最小化变量:w1。下面是最小的工作代码。
import numpy as np
from scipy.optimize import minimize_scalar
def error(w0,w1,x,y_actual):
y_pred = w0+w1*x
mse = ((y_actual-y_pred)**2).mean()
return mse
w0=50
x = np.array([1,2,3])
y = np.array([52,54,56])
minimize_scalar(error,args=(w0,x,y),bounds=(-5,5))
答案 0 :(得分:17)
您可以使用lambda函数
minimize_scalar(lambda w1: error(w0,w1,x,y),bounds=(-5,5))
答案 1 :(得分:5)
您也可以使用部分功能。
from functools import partial
error_partial = partial(error, w0=w0, x=x, y_actual=y)
minimize_scalar(error_partial, bounds=(-5, 5))
如果您想知道性能......它与lambdas相同。
import time
from functools import partial
import numpy as np
from scipy.optimize import minimize_scalar
def error(w1, w0, x, y_actual):
y_pred = w0 + w1 * x
mse = ((y_actual - y_pred) ** 2).mean()
return mse
w0 = 50
x = np.arange(int(1e5))
y = np.arange(int(1e5)) + 52
error_partial = partial(error, w0=w0, x=x, y_actual=y)
p_time = []
for _ in range(100):
p_time_ = time.time()
p = minimize_scalar(error_partial, bounds=(-5, 5))
p_time_ = time.time() - p_time_
p_time.append(p_time_ / p.nfev)
l_time = []
for _ in range(100):
l_time_ = time.time()
l = minimize_scalar(lambda w1: error(w1, w0, x, y), bounds=(-5, 5))
l_time_ = time.time() - l_time_
l_time.append(l_time_ / l.nfev)
print(f'Same performance? {np.median(p_time) == np.median(l_time)}')
# Same performance? True
答案 2 :(得分:0)
标记的正确答案实际上是关于 W0 的最小化。应该是:
minimize_scalar(lambda w1: error(w1,w0,x,y),bounds=(-5,5))