Skip to content Skip to sidebar Skip to footer

How To Use Scipy.optimize Minimize_scalar When Objective Function Has Multiple Arguments?

I have a function of multiple arguments. I want to optimize it with respect to a single variable while holding others constant. For that I want to use minimize_scalar from spicy.op

Solution 1:

You can use a lambda function

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

Solution 2:

You can also use a partial function.

from functools import partial
error_partial = partial(error, w0=w0, x=x, y_actual=y)
minimize_scalar(error_partial, bounds=(-5, 5))

In case you are wondering about the performance ... it is the same as with lambdas.

import timefrom 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

Solution 3:

The marked correct answer is actually minimizing with respect to W0. It should be:

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

Post a Comment for "How To Use Scipy.optimize Minimize_scalar When Objective Function Has Multiple Arguments?"