2016-04-05 17 views
2

Ich habe eine Funktion von mehreren Argumenten. Ich möchte es in Bezug auf eine einzelne Variable optimieren, während andere konstant gehalten werden. Dafür möchte ich minimize_scalar von pictic.optimize verwenden. Ich lese die Dokumentation, aber ich bin immer noch verwirrt, wie man minimize_scalar sagt, dass ich in Bezug auf Variable minimieren möchte: w1. Unten ist ein minimaler Arbeitscode.Wie scipy.optimize minimize_scalar verwenden, wenn die Zielfunktion mehrere Argumente hat?

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)) 

Antwort

12

können Sie verwenden, um eine Lambda-Funktion

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

Sie können auch eine Teilfunktion verwenden.

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

Wenn Sie sich über die Leistung wundern ... es ist das gleiche wie bei 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 
Verwandte Themen