一元二次曲線擬合的最小二乘python實現

2021-08-13 04:59:51 字數 2186 閱讀 4719

1、首先定義乙個誤差函式,t為需要擬合的引數

def 

residual(t, x

, y):

return

y - (t[0] *

x **

2 +

t[1] *

x +

t[2])

2、接著設定真實值

x = np.linspace(-2, 

2, 50)a, b, c = 2,

3, -1 #為真實值

y = (a * x **

2 + b * x + c) + np.random.rand(len(x))*

0.75

#np.random.rand(len

(x))

*0.75

加入雜訊,len(x)為50,

3、使

用python裡

scipy.optimize.leastsq()函式

p = leastsq(residual, [0, 0

, 0],

args=(x, y))

#leastsq(func, x0, args=())  func 

是我們自己定義的乙個計算誤差的函式即

residual,args

是指定func

的其他引數,

呼叫leastsq

進行資料擬合

, residual

為計算誤差的函式

,

x0

為擬合引數的初始值

,# args

為需要擬合的實驗資料

這裡將(x,y)

傳遞給args

引數。leastsq()

會將這兩個

額外的引數傳遞給

residual()。因此

residual()

有三個引數,

t是擬合函式的引數,y和

x是表示實驗資料的

陣列

theta = p[0] #將擬合出來的引數賦值給theta

print('

真實值:

', a, b, c)

print('

**值:

', theta)

y_hat = theta[0] * x **

2 + theta[1] * x + theta[2]

plt.plot(x, y,

'r-'

, linewidth=2,

label=

u'actual')

plt.plot(x, y_hat,

'g-'

, linewidth=2,

label=

u'predict')

plt.legend(loc=

'upper left')

plt.grid()

plt.show()

最後生成結果真實值: 2 3 -1**值: [ 1.99181411  2.97673496 -0.60163036]

關於theta = p[0] #將擬合出來的引數賦值給theta
本人開始有乙個小疑問,就是p[0]不應該輸出的是第乙個引數嗎,為什麼是同時輸出了三個引數,因此

輸出了具體形式

print(p)
結果為(array([ 1.98688109,  2.99088257, -0.64934811]), 3),3代表有三個引數
print(theta),呼叫了第乙個陣列,即三個引數的列表
結果為[ 1.98688109  2.99088257 -0.64934811]

影象為

最小二乘曲線擬合matlab實現

對如下圖所示的加雜訊曲線,如何進行曲線擬合呢?我們可以採用 階多項式去逼近它 係數隨機資料的產生如下 function y truth,y observed unknown model1 x y truth 0.001 x.4 x.3 5 x.2 0.5 x 4階的資料 y observed y t...

最小二乘法擬合二次曲線 C語言

題目x 21 y 21 利用最小二乘法將上面資料所標示的曲線擬合為二次曲線,使用c語言程式設計求解函式係數 最小二乘法原理 原理不再贅述,主要是解法採用偏微分求出來的係數公式a,b,c 就是這個公式,對應了二次方程的a,b,c include include define n 1e 13 int m...

最小二乘擬合二次曲線在STM32中的實現筆記

感測器使用前要進行標定,標定時必定需要進行曲線擬合。若用計算機處理很簡單,但實際中用微控制器中標定時,只能進行一般的代數運算,無矩陣運算,處理就顯得非常不方便。最小二乘法推導了二次多項式曲線擬合待定係數的代數計算公式,應用這些公式來處理資料非常方便。設有一組實測資料 x i yi i 1 2 n 其...