生活随笔
收集整理的這篇文章主要介紹了
scipy库中的leastsq函数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
只需要輸入一系列樣本點(diǎn),給出待求函數(shù)的基本形狀(如二元二次函數(shù)就是一種形狀
f
(x,y
)=w0x^2 + w1y^2 + w2xy + w3x + w4y + w5
在形狀給定后,我們只需要求解相應(yīng)的系數(shù)w0~w5),即可得到相應(yīng)的參數(shù)。至于中間到底是怎么求的,這一部分內(nèi)容就像一個黑箱一樣。
則使用leastsq函數(shù)求解其擬合直線的代碼如下:
import numpy
as np
from scipy
.optimize
import leastsq
Xi
=np
.array
([8.19,2.72,6.39,8.71,4.7,2.66,3.78])
Yi
=np
.array
([7.01,2.78,6.47,6.71,4.1,4.23,4.05])
def func(p
,x
):k
,b
=p
return k
*x
+b
def error(p
,x
,y
,s
):print (s
) return func
(p
,x
)-y
p0
=[100,2]
s
="Test the number of iteration"
Para
= leastsq
(error
,p0
,args
=(Xi
,Yi
,s
))
print(Para
)
k
,b
= Para
[0]
print("k=",k
,'\n',"b=",b
)
import matplotlib
.pyplot
as pltplt
.figure
(figsize
=(8,6))
plt
.scatter
(Xi
,Yi
,color
="red",label
="Sample Point",linewidth
=3)
x
=np
.linspace
(0,10,1000)
y
=k
*x
+b
plt
.plot
(x
,y
,color
="orange",label
="Fitting Line",linewidth
=2)
plt
.legend
()
plt
.show
()
1、p0里放的是k、b的初始值,這個值可以隨意指定。往后隨著迭代次數(shù)增加,k、b將會不斷變化,使得error函數(shù)的值越來越小。
2、func函數(shù)里指出了待擬合函數(shù)的函數(shù)形狀。
3、error函數(shù)為誤差函數(shù),我們的目標(biāo)就是不斷調(diào)整k和b使得error不斷減小。這里的error函數(shù)和神經(jīng)網(wǎng)絡(luò)中常說的cost函數(shù)實(shí)際上是一回事,只不過這里更簡單些而已。
4、必須注意一點(diǎn),傳入leastsq函數(shù)的參數(shù)可以有多個,但必須把參數(shù)的初始值p0和其它參數(shù)分開放。其它參數(shù)應(yīng)打包到args中。
5、leastsq的返回值是一個tuple,它里面有兩個元素,第一個元素是k、b的求解結(jié)果,第二個元素暫時不知道是什么意思,先留下來。
以上參考:
Python閑談(二)聊聊最小二乘法以及l(fā)eastsq函數(shù)
https://www.cnblogs.com/NanShan2016/p/5493429.html
使用p次多項(xiàng)式擬合,疫情以來,武漢累積確診病例的數(shù)據(jù)
文件:武漢累積數(shù)據(jù).xlsx
日期 累積確診 累積死亡 累積出院
from scipy
.optimize
import leastsq
import pandas
as pd
import numpy
as np
import matplotlib
.pyplot
as plt
plt
.rcParams
['font.sans-serif'] = ['SimHei']
plt
.rcParams
['axes.unicode_minus'] = False def error(p
, x
, y
):fun
= np
.poly1d
(p
)return y
- fun
(x
)
def fitting(p
):pars
= np
.random
.rand
(p
+1) r
= leastsq
(error
, pars
, args
=(Xi
,Yi
)) return rdata
= pd
.read_excel
('武漢累積數(shù)據(jù).xlsx')
Yi
= data
['confirmed'].values
[:30]
Xi
= data
.index
.values
[:30]fit_pars
= fitting
(5)[0]
print(fit_pars
)
plt
.plot
(Xi
, np
.poly1d
(fit_pars
)(Xi
),color
='blue', label
='擬合多項(xiàng)式曲線')
plt
.scatter
(Xi
,Yi
,edgecolors
='red',marker
='*',label
='實(shí)際數(shù)據(jù)點(diǎn)')
plt
.legend
()
plt
.show
()
總結(jié)
以上是生活随笔為你收集整理的scipy库中的leastsq函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。