日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

scipy库中的leastsq函数

發(fā)布時間:2024/8/1 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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ù)求解其擬合直線的代碼如下:

###最小二乘法試驗(yàn)### import numpy as np from scipy.optimize import leastsq###采樣點(diǎn)(Xi,Yi)### 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])###需要擬合的函數(shù)func及誤差error### def func(p,x):k,b=preturn k*x+bdef error(p,x,y,s):print (s) #看打印多少條s,就是leastsq調(diào)用了多少次error函數(shù)return func(p,x)-y #x、y都是列表,故返回值也是個列表#p0存放k、b的初始值,這個值可以隨意指定 p0=[100,2] #print( error(p0,Xi,Yi) )###主函數(shù)從此開始### s="Test the number of iteration" #試驗(yàn)最小二乘法函數(shù)leastsq得調(diào)用幾次error函數(shù)才能找到使得均方誤差之和最小的k、b Para = leastsq(error,p0,args=(Xi,Yi,s)) #把error函數(shù)中除了p以外的參數(shù)打包到args中 print(Para) # (array([0.61349535, 1.79409255]), 3) k,b = Para[0] print("k=",k,'\n',"b=",b) # k= 0.6134953462154726 b= 1.7940925542913093###繪圖,看擬合效果### import matplotlib.pyplot as pltplt.figure(figsize=(8,6)) plt.scatter(Xi,Yi,color="red",label="Sample Point",linewidth=3) #畫樣本點(diǎn) 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 # % matplotlib # inline plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號def error(p, x, y):fun = np.poly1d(p)# poly1d()函數(shù)可以按照輸入的列表p返回一個多項(xiàng)式函數(shù)# 這里設(shè)計(jì)了一個poly1d()函數(shù),關(guān)于這個函數(shù),簡單理解下就是輸入一個列表,返回以這個列表中的值為參數(shù)的多項(xiàng)式,例如:# 輸入:p=[1,2,3]# 返回:x^2 + 2x + 3return y - fun(x)# 擬合函數(shù) def fitting(p):pars = np.random.rand(p+1) # 生成p+1個隨機(jī)數(shù)的列表,這樣poly1d函數(shù)返回的多項(xiàng)式次數(shù)就是p,作為初值r = leastsq(error, pars, args=(Xi,Yi)) # 三個參數(shù):誤差函數(shù)、函數(shù)參數(shù)列表、數(shù)據(jù)點(diǎn)return rdata = pd.read_excel('武漢累積數(shù)據(jù).xlsx') Yi = data['confirmed'].values[:30] #獲取前30行的confirmed確診數(shù)據(jù) Xi = data.index.values[:30]fit_pars = fitting(5)[0] #這里使用5次多項(xiàng)式去擬合實(shí)際數(shù)據(jù),取返回值r的第一個元素,該元素就是多項(xiàng)式的系數(shù) print(fit_pars) #得出多項(xiàng)式 [-1.74500210e-02 1.15126287e+00 -2.68322791e+01 3.58227740e+02 -1.42370074e+03 1.30423560e+03] 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)容還不錯,歡迎將生活随笔推薦給好友。