1、首先定義乙個誤差函式,t為需要擬合的引數
def2、接著設定真實值residual(t, x
, y):
return
y - (t[0] *
x **
2 +
t[1] *
x +
t[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(len3、使(x))
*0.75
加入雜訊,len(x)為50,
用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] #將擬合出來的引數賦值給thetaprint('
真實值:
', 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 其...