scipy.optimize.

leastsq#

scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=False, col_deriv=False, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)[原始碼]#

最小化一組方程式的平方和。

x = arg min(sum(func(y)**2,axis=0))
         y
參數:
funccallable

應至少接受一個(可能是長度為 N 的向量)引數,並傳回 M 個浮點數。它不得傳回 NaN,否則擬合可能會失敗。M 必須大於或等於 N

x0ndarray

最小化的起始估計值。

argstuple, optional

要傳遞給 func 的任何額外引數都放在這個元組中。

Dfuncallable, optional

用於計算 func 的 Jacobian 矩陣的函數或方法,導數沿著列排列。如果為 None,將會估計 Jacobian 矩陣。

full_outputbool, optional

如果為 True,則傳回所有可選輸出(不只是 xier)。

col_derivbool, optional

如果為 True,指定 Jacobian 函數計算導數時是沿著行向下計算(速度更快,因為沒有轉置運算)。

ftolfloat, optional

平方和中期望的相對誤差。

xtolfloat, optional

近似解中期望的相對誤差。

gtolfloat, optional

函數向量與 Jacobian 矩陣的列之間期望的正交性。

maxfevint, optional

函數的最大呼叫次數。如果提供了 Dfun,則預設的 maxfev 為 100*(N+1),其中 N 是 x0 中的元素數量;否則預設的 maxfev 為 200*(N+1)。

epsfcnfloat, optional

用於確定 Jacobian 矩陣前向差分近似的合適步長的變數(對於 Dfun=None)。通常,實際步長將為 sqrt(epsfcn)*x。如果 epsfcn 小於機器精度,則假定相對誤差與機器精度同階。

factorfloat, optional

一個參數,用於確定初始步長邊界 (factor * || diag * x||)。應在區間 (0.1, 100) 內。

diagsequence, optional

N 個正數條目,用作變數的比例因子。

傳回值:
xndarray

解(或不成功呼叫的最後一次迭代結果)。

cov_xndarray

Hessian 矩陣的逆矩陣。fjacipvt 用於建構 Hessian 矩陣的估計值。值 None 表示奇異矩陣,這表示參數 x 中的曲率在數值上是平坦的。若要取得參數 x 的共變異數矩陣,cov_x 必須乘以殘差的變異數 – 請參閱 curve_fit。僅在 full_outputTrue 時傳回。

infodictdict

包含可選輸出的字典,鍵值如下

nfev

函數呼叫的次數

fvec

在輸出處評估的函數

fjac

最終近似 Jacobian 矩陣的 QR 分解的 R 矩陣的排列,以列方式儲存。與 ipvt 一起,可以近似估計值的共變異數。

ipvt

長度為 N 的整數陣列,其定義排列矩陣 p,使得 fjac*p = q*r,其中 r 是上三角矩陣,對角線元素的大小非遞增。p 的第 j 列是單位矩陣的第 ipvt(j) 列。

qtf

向量 (transpose(q) * fvec)。

僅在 full_outputTrue 時傳回。

mesgstr

提供有關失敗原因的字串訊息。僅在 full_outputTrue 時傳回。

ierint

整數旗標。如果等於 1、2、3 或 4,則表示已找到解。否則,表示未找到解。在任何一種情況下,可選輸出變數 'mesg' 都會提供更多資訊。

另請參閱

least_squares

用於解決變數受限的非線性最小平方問題的較新介面。特別請參閱 method='lm'

註解

“leastsq” 是 MINPACK 的 lmdif 和 lmder 演算法的包裝器。

cov_x 是最小平方目標函數的 Hessian 矩陣的 Jacobian 近似值。此近似值假設目標函數基於某些觀察到的目標資料 (ydata) 與參數的(非線性)函數 f(xdata, params) 之間的差異

func(params) = ydata - f(xdata, params)

因此目標函數為

  min   sum((ydata - f(xdata, params))**2, axis=0)
params

x 始終為 1 維陣列,無論 x0 的形狀為何,也無論 x0 是否為純量。

範例

>>> from scipy.optimize import leastsq
>>> def func(x):
...     return 2*(x-3)**2+1
>>> leastsq(func, 0)
(array([2.99999999]), 1)