2017-08-22 120 views
0

我想適合我的數據集功能f(x) = b + a/x。對於這一點我發現從優化scipy leastsquares是合適的。擬合一個反比例函數

我的代碼如下:

x = np.asarray(range(20,401,20)) 

y是我計算的距離,但是是長度爲20的數組,這裏只是隨機數例如

y = np.random.rand(20) 

的初始猜測params a和b:

params = np.array([1,1]) 

功能最小化

def funcinv(x): 
    return params[0]/x+params[1] 

res = least_squares(funinv, params, args=(x, y)) 

錯誤給出:

return np.atleast_1d(fun(x, *args, **kwargs)) 

TypeError: funinv() takes 1 positional argument but 3 were given

我如何能適應我的數據?

回答

1

爲了澄清一點。有兩個相關的問題:

  1. 最小化功能
  2. 擬合模型數據

要擬合模型對觀測數據是要找到一個模型的這種參數,減少某種模型數據與觀測數據之間的錯誤。 (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_fitcurve_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]), ... 
+0

這是非常有用的謝謝你。 –