溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python曲線擬合怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2023-05-06 14:32:54 來(lái)源:億速云 閱讀:113 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Python曲線擬合怎么實(shí)現(xiàn)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

入門

scipy.optimize中,curve_fit函數(shù)可調(diào)用非線性最小二乘法進(jìn)行函數(shù)擬合,例如,現(xiàn)在有一個(gè)高斯函數(shù)想要被擬合

Python曲線擬合怎么實(shí)現(xiàn)

則調(diào)用方法如下

import numpy as np
from scipy.optimize import curve_fit
def gauss(x, a, b, c):
    return a*np.exp(-(x-b)**2/c**2)

x = np.arange(100)/10
y = gauss(x, 2, 5, 3) + np.random.rand(100)/10

# 非線性擬合 abc為參數(shù);para為擬合評(píng)價(jià)
abc, para = curve_fit(gauss, x, y)
print(abc)
# [2.03042233 5.01182397 3.10994351]

其中,curve_fit在調(diào)用時(shí)輸入了三個(gè)參數(shù),分別是擬合函數(shù)、自變量、因變量。返回值abcpara分別為擬合參數(shù)和擬合的協(xié)方差,最終得到abc的值與預(yù)設(shè)的2,0.5, 3是比較接近的,其擬合效果可以畫圖查看一下

import matplotlib.pyplot as plt
plt.scatter(x, y, marker='.')

Y = gauss(x, *abc)
plt.plot(x, Y, lw=1)
plt.show()

效果如下

Python曲線擬合怎么實(shí)現(xiàn)

參數(shù)

curve_fit的裝形式如下

curve_fit(f, xdata, ydata, p0=None, sigma=None, absolute_sigma=False, check_finite=True, bounds=(-inf, inf), method=None, jac=None, *, full_output=False, **kwargs)

除了f, xdata, ydata已經(jīng)用過(guò)之外,其他參數(shù)的含義為

  • p0 擬合參數(shù)初始值

  • sigma 相對(duì)精度要求

  • absolute_sigma絕對(duì)精度要求

  • check_finite有限性檢測(cè)開(kāi)關(guān)

  • bounds擬合范圍

  • method擬合方法,可選‘lm’, ‘trf’, ‘dogbox’,與least_squares函數(shù)中定義相同

  • jac雅可比矩陣,與least_squares中定義相同

 最小二乘函數(shù):least_squares

多元擬合

盡管curve_fit的參數(shù)列表中,只給出了xdata, ydata作為擬合參數(shù),而xdata只有一組,但curve_fit是具備多元擬合潛力的。

唯一需要注意的是,當(dāng)多元擬合函數(shù)的返回值必須為一維數(shù)組,示例如下

# 創(chuàng)建一個(gè)函數(shù)模型用來(lái)生成數(shù)據(jù)
def func1(x, a, b, c, d):
    r = a * np.exp(-((x[0] - b) ** 2 + (x[1] - d) ** 2) / (2 * c ** 2))
    return r.ravel()
 
# 生成原始數(shù)據(jù)
xx = np.indices([10, 10])
z = func1(xx, 10, 5, 2, 5) + np.random.normal(size=100)/100
abcd, para = curve_fit(func1, xx, z)
print(abcd)
# [10.00258587  5.00146314  1.99952885  5.00138184]

可以發(fā)現(xiàn)擬合結(jié)果與預(yù)設(shè)的abcd還是比較接近的,下面繪制三維圖像來(lái)更加直觀地查看一下

z = z.reshape(10, 10)
Z = func1(xx, *abcd).reshape(10,10)

ax = plt.subplot(projection='3d')
ax.scatter3D(xx[0], xx[1], z, color='red')
ax.plot_surface(xx[0], xx[1], Z, cmap='rainbow')
plt.show()

結(jié)果如下

Python曲線擬合怎么實(shí)現(xiàn)

以上就是“Python曲線擬合怎么實(shí)現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI