Scipy庫在numpy庫基礎上增加了眾多數學,科學及工程計算中常用庫函數。如線性代數,常微分方程數值求解,信號處理,圖像處理,稀疏矩陣等。
如下理解通過Scipy進行最小二乘法擬合運算
最小二乘擬合(optimize子函數)
from scipy.optimize import leastsq
optimize函數含有實現最小二乘法的函數 leastsq,
如下通過對正弦函數的擬合,求得最小二乘擬合參數。func三參數A,k,theta分別表示對應振幅,頻率,相角。
import numpy as np from scipy.optimize import leastsq import pylab as pl from pylab import mpl mpl.rcParams['font.sans-serif'] = ['KaiTi'] # 解決中文亂碼 mpl.rcParams['axes.unicode_minus'] = False # 解決負號顯示為方框的問題 def func(x,p): # 數據擬合所用函數: A*sin(2*pi*k*x + theta) A,k,theta = p return A*np.sin(2*np.pi*k*x + theta) def residuals(p,y,x): # 實驗數據x,y和擬合函數之間的差,p為擬合需要找到的系數 return y - func(x,p) x = np.linspace(0, -2*np.pi, 100) # 創建等差數列,100表示數據點個數 A,k,theta = 10, 0.34 , np.pi/6 # 真實數據的函數參數 y0 = func(x, [A,k,theta]) # 真實數據 y1 = y0 + 2* np.random.randn(len(x)) # 加入噪聲后的實驗數據 p0 = [7,0.2,0] # 第一次猜測的函數擬合參數 """ 1、調用leastsq進行數據擬合 2、residuals為計算誤差的函數 3、p0為擬合參數的初始值 4、args為需要擬合的實驗數據 """ plsq = leastsq(residuals,p0,args = (y1,x)) print(u"真實參數:", [A,k,theta]) print(u"擬合參數:", plsq[0]) #實驗數據擬合后的參數 # 作圖 pl.plot(x, y0, label = u'真實數據') pl.plot(x, y1, label = u'帶噪聲的實驗數據') pl.plot(x, func(x,plsq[0]) , label = u"擬合數據") pl.legend() pl.show()
圖形展示:
以上可以看出由於正弦函數的周期性,擬合參數規律走勢和和真實數據實際上是一致的。