最小二乘擬合

2022-07-12 14:54:22 字數 3252 閱讀 4741

來自:某小皮

最優化函式庫optimization

優化是找到最小值或等式的數值解的問題。scipy.optimization子模組提供函式最小值,曲線擬合和尋找等式的根的有用演算法。

最小二乘擬合

假設有一組實驗資料(xi, yi),事先知道它們之間應該滿足某函式關係yi = f(xi),通過這些已知的資訊,需要確定函式f的一些引數。例如,如果函式f是線性函式f(x) = kx + b,那麼引數k和b就是需要確定的值。

如果用p表示函式中需要確定的引數,那麼目標就是找到一組p,使下面的函式s的值最小:

這種演算法被稱作最小二乘擬合(least-square fitting)。

使用leastsq()進行最小二乘擬合計算。leastsq()只需要將計算誤差的函式和待確定引數的初始值傳遞給它即可。

leastsq()函式傳入誤差計算函式和初始值,該初始值將作為誤差計算函式的第乙個引數傳入;

計算的結果r是乙個包含兩個元素的元組,第乙個元素是乙個陣列,表示擬合後的引數k,b;第二個元素如果等於1,2,3,4中的其中乙個整數,則擬合成功,否則將返回mesg。

leastsq函式:

leastsq(func, x0, args=(), dfun=none, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=0.0, factor=100, diag=none, warning=true)
一般我們只要指定前三個引數:

注意:傳入leastsq函式的引數可以有多個,但必須把引數的初始值p0和其它引數分開放。其它引數應打包到args中。

最小二乘擬合示例:

使用最小二乘對帶雜訊的正弦波資料進行擬合:

擬合得到的引數雖然和實際的引數有可能完全不同,但是由於正弦函式具有週期性,實際上擬合的結果和實際的函式是一致的。

import

numpy as np

from scipy.optimize import

leastsq

#待擬合的函式,x是變數,p是引數

deffun(x, p):

a, b =p

return a*x +b

#計算真實資料和擬合資料之間的誤差,p是待擬合的引數,x和y分別是對應的真實資料

defresiduals(p, x, y):

return fun(x, p) -y

#一組真實資料,在a=2, b=1的情況下得出

x1 = np.array([1, 2, 3, 4, 5, 6], dtype=float)

y1 = np.array([3, 5, 7, 9, 11, 13], dtype=float)

#呼叫擬合函式,第乙個引數是需要擬合的差值函式,第二個是擬合初始值,第三個是傳入差值函式的其他引數

r = leastsq(residuals, [1, 1], args=(x1, y1))

#列印結果,r[0]儲存的是擬合的結果,r[1]、r[2]代表其他資訊

print(r[0])

執行結果:[ 2. 1.]

1

import

numpy as np

2import

pylab as pl

3from scipy.optimize import

leastsq45

deffunc(x, p):6#

資料擬合所用的函式:a*sin(2*pi*k*x + theta)

7 a, k, theta =p

8return a*np.sin(2*np.pi*k*x +theta)

9def

residuals(p, y, x):10#

真實資料x, y和擬合資料之間的誤差,p為待擬合引數

11return y -func(x, p)

1213 x = np.linspace(-2*np.pi, 0, 100)

1415 a, k, theta = 10, 0.34, np.pi/6    #

真實資料的函式引數

16 y0 = func(x, [a, k, theta])   #

真實資料

17 y1 = y0 + 2 * np.random.randn(len(x))  #

加入雜訊之後的實驗資料

1819 p0 = [7, 0.2, 0] #

第一次猜測的函式擬合引數

2021

#呼叫leastsq進行資料擬合,22#

residuals為我們自己定義的需要擬合的差值函式23#

p0為擬合初始值,24#

args為傳入差值函式的其他引數

25 plsq = leastsq(residuals, p0, args =(y1, x))

2627

"""28

除了初始值之外,還呼叫了args引數,用於指定residuals中使用到的其他引數(直線擬合是直接使用x,y的全域性變數),

29同樣也返回乙個元組,第乙個元素為擬合後的引數陣列;

30這裡將(y1, x)傳遞給args引數。leastsq()會將這兩個額外的引數傳遞給residuals()。

31因此residuals()有三個引數,p是正弦函式的引數,y和x是表示真實資料的陣列。

32"""

3334

print(u"

真實引數:

", [a, k, theta])

35print(u"

擬合引數

", plsq[0]) #

實驗資料擬合後的引數

36 pl.plot(x, y0, label = u"

真實資料")

37 pl.plot(x, y1, label = u"

帶雜訊的資料")

38 pl.plot(x, func(x, plsq[0]), label = u"

擬合資料")

39pl.legend()

40 pl.show()

執行結果:

最小二乘擬合 6 7 最小二乘擬合問題

資料擬合問題的一般形式 任給一組離散資料 注 這裡的擬合函式不一定為多項式函式 記殘量的平方和為 求使得殘量平方和最小得一組係數就是線性最小二乘問題,為最小二乘問題得基函式,求得的擬合函式為資料的最小二乘擬合。求解 利用偏導數為零得到極值點的原理可以得到最小二乘問題滿足的方程組,求解方程組中未知係數...

最小二乘線性擬合

實驗 給出實驗資料 程式 如下 write by void,2013.4.15,beijing import matplotlib.pyplot as plt import numpy as np x 13,15,16,21,22,23,25,29,30,31,36,40,42,55,60,62,6...

最小二乘擬合詳解

最小二乘法多項式曲線擬合,根據給定的m個點,並不要求這條曲線精確地經過這些點,而是曲線y f x 的近似曲線y x 原理部分由個人根據網際網路上的資料進行總結,希望對大家能有用 給定資料點pi xi,yi 其中i 1,2,m。求近似曲線y x 並且使得近似曲線與y f x 的偏差最小。近似曲線在點p...