爲了澄清一點。有兩個相關的問題:
- 最小化功能
- 擬合模型數據
要擬合模型對觀測數據是要找到一個模型的這種參數,減少某種模型數據與觀測數據之間的錯誤。 (x
)可以是一個向量)。
F(x) = 0.5 * sum(rho(f_i(x)**2), i = 0, ..., m - 1)
(rho
是虧損的功能,默認是rho(x) = x
所以不介意它)
least_squares(func, x0)
預計調用func(x)
將返回一個矢量[a1, a2, a3, ...]
爲其平方和,將計算:S = 0.5 * (a1^2 + a2^2 + a3^2 + ...)
。
least_squares
將調整x0
以儘量減少S
。
因此,爲了用它來擬合模型數據,必須構建誤差的函數的模型和實際數據之間 - 殘差然後最小化殘差功能。
import numpy as np
from scipy.optimize import least_squares
x = np.asarray(range(20,401,20))
y = np.random.rand(20)
params = np.array([1,1])
def funcinv(x, a, b):
return b + a/x
def residuals(params, x, data):
# evaluates function given vector of params [a, b]
# and return residuals: (observed_data - model_data)
a, b = params
func_eval = funcinv(x, a, b)
return (data - func_eval)
res = least_squares(residuals, params, args=(x, y))
這給出了一個結果:在你的情況,你可以如下寫 print(res)
...
message: '`gtol` termination condition is satisfied.'
nfev: 4
njev: 4 optimality: 5.6774618339971994e-10
status: 1
success: True
x: array([ 6.89518618, 0.37118815])
但是,作爲一個殘差功能幾乎相同的所有的時間(res = observed_data - model_data
),有scipy.optimize
中的快捷方式叫做curve_fit
:curve_fit(func, xdata, ydata, x0)
。 curve_fit
自動構建殘差函數,你可以簡單地寫:
import numpy as np
from scipy.optimize import curve_fit
x = np.asarray(range(20,401,20))
y = np.random.rand(20)
params = np.array([1,1])
def funcinv(x, a, b):
return b + a/x
res = curve_fit(funcinv, x, y, params)
print(res) # ... array([ 6.89518618, 0.37118815]), ...
這是非常有用的謝謝你。 –