最小二乘擬合(scipy實現)


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()  

 圖形展示:

 

以上可以看出由於正弦函數的周期性,擬合參數規律走勢和和真實數據實際上是一致的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM