如何使用Python曲線擬合

华科云商小雪發表於2024-04-12

在Python中進行曲線擬合通常涉及使用科學計算庫(如NumPy、SciPy)和繪相簿(如Matplotlib)。下面是一個簡單的例子,演示如何使用多項式進行曲線擬合,在做專案前首先,確保你已經安裝了所需的庫。

1、問題背景

在Python中,使用者想要使用曲線擬合來處理一組資料點。這些點通常看起來像這樣:

藍色曲線表示輸入的資料(在本例中為4個點),綠色曲線是使用np.polyfit和polyfit1d進行曲線擬合的結果。使用者希望得到的曲線擬合結果與藍色曲線非常相似,但在點1和點2處具有更平滑的梯度變化(這意味著使用者不要求擬合曲線透過這些點)。

2、解決方案

2.1 曲線擬合

使用者可以使用Python中的numpy和scipy庫來進行曲線擬合。以下程式碼片段展示了一種曲線擬合的方法:


import 
numpy 
as 
np

import scipy as sp
from scipy. interpolate import interp1d

x = np. array([ 0, 5, 10, 15, 20, 30, 40, 50])
y = np. array([ 0, 0, 0, 12, 40, 40, 40, 40])

coeffs = np. polyfit( x, y, deg = 4) # 你可以根據需要改變階數
poly = np. poly1d( coeffs)
yp = np. polyval( poly, x)

interpLength = 10
new_x = np. linspace( x. min(), x. max(), new_length)
new_y = sp. interpolate. interp1d( x, y, kind = 'cubic')( new_x)

plt. plot( x, y, '.', x, yp, '-', new_x, new_y, '--')
plt. show()

在上面的程式碼中,使用者可以使用np.polyfit()函式來擬合資料點,並使用np.poly1d()來生成擬合曲線。使用者還可以使用scipy.interpolate.interp1d()函式來進行插值,從而得到更平滑的曲線。

2.2 插值

如果使用者想要得到一條不透過所有資料點的擬合曲線,可以使用插值方法。插值方法可以生成一條平滑的曲線,並使曲線儘量接近資料點。以下程式碼片段展示了一種插值的方法:


import 
numpy 
as 
np

import scipy as sp
from scipy. interpolate import interp1d

x = np. array([ 0, 5, 10, 15, 20, 30, 40, 50])
y = np. array([ 0, 0, 0, 12, 40, 40, 40, 40])

interpLength = 10
new_x = np. linspace( x. min(), x. max(), new_length)
new_y = sp. interpolate. interp1d( x, y, kind = 'cubic')( new_x)

plt. plot( x, y, '.', new_x, new_y, '-')
plt. show()

在上面的程式碼中,使用者可以使用scipy.interpolate.interp1d()函式來進行插值,並使用np.linspace()函式來生成新的x值。使用者可以使用不同的插值方法,例如'linear'、'quadratic'和'cubic'等,來得到不同的插值效果。

2.3 指定函式型別

如果使用者知道資料點的分佈情況,可以使用指定的函式型別來進行曲線擬合。例如,如果資料點分佈成一條直線,可以使用線性函式來擬合;如果資料點分佈成一條拋物線,可以使用拋物線函式來擬合。以下程式碼片段展示瞭如何使用指定函式型別進行曲線擬合:


import 
numpy 
as 
np

import scipy as sp
from scipy. optimize import curve_fit

def linear_func( x, a, b):
return a * x + b

def parabolic_func( x, a, b, c):
return a * x ** 2 + b * x + c

x = np. array([ 0, 5, 10, 15, 20, 30, 40, 50])
y = np. array([ 0, 0, 0, 12, 40, 40, 40, 40])

# 使用線性函式進行擬合

popt, pcov = curve_fit( linear_func, x, y)

# 使用拋物線函式進行擬合

popt, pcov = curve_fit( parabolic_func, x, y)

# 繪製擬合曲線

plt. plot( x, y, '.', x, linear_func( x, * popt), '-', x, parabolic_func( x, * popt), '--')
plt. show()

在上面的程式碼中,使用者可以使用scipy.optimize.curve_fit()函式來進行曲線擬合。使用者需要指定要擬合的函式型別,以及要擬合的資料。curve_fit()函式會自動計算擬合引數,並返回擬合引數和擬合協方差矩陣。

在這個例子中,我們首先生成了一些帶有噪聲的示例資料。然後,我們使用 numpy.polyfit 函式對這些資料進行多項式擬合, degree 變數指定了多項式的次數。最後,我們使用Matplotlib將原始資料和擬合曲線繪製在同一個圖中。

我們可以根據自己的需求調整多項式的次數( degree ),以及嘗試不同的擬合方法和引數來獲得的擬合效果。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3012289/,如需轉載,請註明出處,否則將追究法律責任。

相關文章