2011-07-21 9 views
3

scipyのoptimize.fminとoptimize.leastsqの違いは何ですか?彼らはthis example pageでほぼ同じように使用されているようです。私が見ることができる唯一の違いは、(実際には名前が示唆するように)leastsqが実際に自乗和を計算するのに対し、fminを使うときは手動でこれを行う必要があるということです。それ以外の2つの機能は同等ですか?Scipy:optimize.fminとoptimize.leastsqの差

答えて

4

下の異なるアルゴリズム。

fminはシンプレックス法を使用しています。 leastsqは最小二乗適合を使用しています。

+0

おかげで、duffymo。だから、最小化アルゴリズムを選択する最良の方法は何ですか?私はoptimize.leastsqとoptimize.fmin_slsqpで少し演奏しましたが、場合によっては少し異なる結果になります。適切なルーチンを選択する「科学的」な方法があるのか​​、それとも与えられたデータセットに最適なものを見るのが試行錯誤なのか? – gandi2223

+0

試行錯誤と判断。あらゆる場合にユニークな「正しい」答えがないかもしれません。 – duffymo

0

いくつかの情報を追加するだけで、私はbiexponential関数に適合するモジュールを開発しています。最小と最小の時間差はほぼ100倍に見えます。詳細は以下のコードを見てください。

2指数の合計である二指数曲線を使用し、モデル関数には4つのパラメータがあります。 S、F、D_star及びD.

フィッティングすべてのデフォルトパラメーターを

S [FE ^( - X * D_star)+(1 - f)のE ^( - X * D)]を使用した

('Time taken for minimize:', 0.011617898941040039) 
('Time taken for leastsq :', 0.0003180503845214844) 

使用コード:

import numpy as np 
from scipy.optimize import minimize, leastsq 
from time import time 


def ivim_function(params, bvals): 
    """The Intravoxel incoherent motion (IVIM) model function. 

     S(b) = S_0[f*e^{(-b*D\*)} + (1-f)e^{(-b*D)}] 

     S_0, f, D\* and D are the IVIM parameters. 

    Parameters 
    ---------- 
     params : array 
       parameters S0, f, D_star and D of the model 

     bvals : array 
       bvalues 

    References 
    ---------- 
    .. [1] Le Bihan, Denis, et al. "Separation of diffusion 
       and perfusion in intravoxel incoherent motion MR 
       imaging." Radiology 168.2 (1988): 497-505. 
    .. [2] Federau, Christian, et al. "Quantitative measurement 
       of brain perfusion with intravoxel incoherent motion 
       MR imaging." Radiology 265.3 (2012): 874-881. 
    """ 
    S0, f, D_star, D = params 
    S = S0 * (f * np.exp(-bvals * D_star) + (1 - f) * np.exp(-bvals * D)) 
    return S 


def _ivim_error(params, bvals, signal): 
    """Error function to be used in fitting the IVIM model 
    """ 
    return (signal - ivim_function(params, bvals)) 


def sum_sq(params, bvals, signal): 
    """Sum of squares of the errors. This function is minimized""" 
    return np.sum(_ivim_error(params, bvals, signal)**2) 

x0 = np.array([100., 0.20, 0.008, 0.0009]) 
bvals = np.array([0., 10., 20., 30., 40., 60., 80., 100., 
        120., 140., 160., 180., 200., 220., 240., 
        260., 280., 300., 350., 400., 500., 600., 
        700., 800., 900., 1000.]) 
data = ivim_function(x0, bvals) 

optstart = time() 
opt = minimize(sum_sq, x0, args=(bvals, data)) 
optend = time() 
time_taken = optend - optstart 
print("Time taken for opt:", time_taken) 


lstart = time() 
lst = leastsq(_ivim_error, 
       x0, 
       args=(bvals, data),) 
lend = time() 
time_taken = lend - lstart 
print("Time taken for leastsq :", time_taken) 

print('Parameters estimated using minimize :', opt.x) 
print('Parameters estimated using leastsq :', lst[0])