scipy庫中的leastsq函式

2021-10-04 15:02:32 字數 3948 閱讀 3273

只需要輸入一系列樣本點,給出待求函式的基本形狀(如二元二次函式就是一種形狀

f(x,y)

=w0x^2 + w1y^2 + w2xy + w3x + w4y + w5

在形狀給定後,我們只需要求解相應的係數w0~w5),即可得到相應的引數。至於中間到底是怎麼求的,這一部分內容就像乙個黑箱一樣。

則使用leastsq函式求解其擬合直線的**如下:

###最小二乘法試驗###

import numpy as np

from scipy.optimize import leastsq

###取樣點(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])

###需要擬合的函式func及誤差error###

deffunc

(p,x)

: k,b=p

return k*x+b

deferror

(p,x,y,s)

:print

(s)#看列印多少條s,就是leastsq呼叫了多少次error函式

return func(p,x)

-y #x、y都是列表,故返回值也是個列表

#p0存放k、b的初始值,這個值可以隨意指定

p0=[

100,2]

#print( error(p0,xi,yi) )

###主函式從此開始###

s="test the number of iteration"

#試驗最小二乘法函式leastsq得呼叫幾次error函式才能找到使得均方誤差之和最小的k、b

para = leastsq(error,p0,args=

(xi,yi,s)

)#把error函式中除了p以外的引數打包到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 plt

plt.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的初始值,這個值可以隨意指定。往後隨著迭代次數增加,k、b將會不斷變化,使得error函式的值越來越小。

2、func函式裡指出了待擬合函式的函式形狀。

3、error函式為誤差函式,我們的目標就是不斷調整k和b使得error不斷減小。這裡的error函式和神經網路中常說的cost函式實際上是一回事,只不過這裡更簡單些而已。

4、必須注意一點,傳入leastsq函式的引數可以有多個,但必須把引數的初始值p0和其它引數分開放。其它引數應打包到args中。

5、leastsq的返回值是乙個tuple,它裡面有兩個元素,第乙個元素是k、b的求解結果,第二個元素暫時不知道是什麼意思,先留下來。

以上參考:

python閒談(二)聊聊最小二乘法以及leastsq函式

使用p次多項式擬合,疫情以來,武漢累積確診病例的資料

檔案:武漢累積資料.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'

]# 用來正常顯示中文標籤

plt.rcparams[

'axes.unicode_minus']=

false

# 用來正常顯示負號

deferror

(p, x, y)

: fun = np.poly1d(p)

# poly1d()函式可以按照輸入的列表p返回乙個多項式函式

# 這裡設計了乙個poly1d()函式,關於這個函式,簡單理解下就是輸入乙個列表,返回以這個列表中的值為引數的多項式,例如:

# 輸入:p=[1,2,3]

# 返回:x^2 + 2x + 3

return y - fun(x)

# 擬合函式

deffitting

(p):

pars = np.random.rand(p+1)

# 生成p+1個隨機數的列表,這樣poly1d函式返回的多項式次數就是p,作為初值

r = leastsq(error, pars, args=

(xi,yi)

)# 三個引數:誤差函式、函式引數列表、資料點

return r

data = pd.read_excel(

'武漢累積資料.xlsx'

)yi = data[

'confirmed'

].values[:30

]#獲取前30行的confirmed確診資料

xi = data.index.values[:30

]fit_pars = fitting(5)

[0]#這裡使用5次多項式去擬合實際資料,取返回值r的第乙個元素,該元素就是多項式的係數

print

(fit_pars)

#得出多項式 [-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=

'擬合多項式曲線'

)plt.scatter(xi,yi,edgecolors=

'red'

,marker=

'*',label=

'實際資料點'

scipy庫中的odeint函式

scipy.integrate.odeint func,y0,t,args dfun none,col deriv 0,full output 0,ml none,mu none,rtol none,atol none,tcrit none,h0 0.0,hmax 0.0,hmin 0.0,ixpr...

SciPy中的統計模組

numpy 替我們搞定了向量和矩陣的相關操作,基本上算是乙個高階的科學計算器。scipy 基於 numpy 提供了更為豐富和高階的功能擴充套件,在統計 優化 插值 數值積分 時頻轉換等方面提供了大量的可用函式,接下來我們就學習一下 scipy 中的統計和優化模組。import numpy as np...

scipy 中的whiten函式

呼叫kmeans函式,kmeans中呼叫了whited函式。查後,發現whiten是對輸入資料按標準差做歸一化處理。e 經過whiten後 x i xis tand dev atio nx frac xi s tand dev atio nxi 與標準化不同的是,白化處理沒有減去均值。下面是按步驟實...