2016-04-05 11 views
2

Birden çok argüman işlevi var. Başkalarını sabit tutarken tek bir değişkene göre optimize etmek istiyorum. Bunun için minimize_scalar spicy.optimize kullanmak istiyorum. Belgeleri okudum, ancak minimize_scalar'a minimize etmek istediğim minimize etmek istiyorum: w1. Aşağıda minimal çalışma kodu.Hedef işlevi birden çok bağımsız değişken olduğunda, scipy.optimize minimize_scalar nasıl kullanılır?

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

cevap

12

için de kısmi işlevi kullanabilir bir lambda fonksiyonu

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

kullanabilir.

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

Performans hakkında merak ediyorsanız, lambdalarla aynıdır.

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 
İlgili konular