当目标函数有多个参数时,如何使用scipy.optimize minimize_scalar?

9

我有一个多参数函数。我想在保持其他参数不变的情况下优化其中一个变量。为此,我想使用scipy.optimize中的minimize_scalar。我已经阅读了文档,但仍然不清楚如何告诉minimize_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))

1
错误是平方和,而你正在使用mean()函数,它会除以n,这是不正确的。 - Vadim Kirilchuk
3个回答

23

你可以使用lambda函数

minimize_scalar(lambda w1: error(w0,w1,x,y),bounds=(-5,5))

6
您也可以使用部分函数。
from functools import partial
error_partial = partial(error, w0=w0, x=x, y_actual=y)
minimize_scalar(error_partial, bounds=(-5, 5))

如果您对性能有疑问...它与Lambda相同。
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

0
标记为正确答案的实际上是关于W0的最小化。应该是:
minimize_scalar(lambda w1: error(w1,w0,x,y),bounds=(-5,5))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接