使用Python實(shí)現(xiàn)3D曲線擬合
曲線擬合是數(shù)據(jù)分析和數(shù)學(xué)建模領(lǐng)域中廣泛使用的技術(shù)。它涉及到尋找最接近一組數(shù)據(jù)點(diǎn)的數(shù)學(xué)函數(shù)的過程。在3D曲線擬合中,該過程被擴(kuò)展到三維空間,其中的目標(biāo)是找到最好地表示一組3D數(shù)據(jù)點(diǎn)的函數(shù)。
Python是一種用于科學(xué)計(jì)算的流行編程語言,它提供了幾個(gè)可用于3D曲線擬合的庫。在本文中,我們將討論如何使用SciPy庫在Python中執(zhí)行3D曲線擬合。
SciPy庫
SciPy庫是Python中用于科學(xué)計(jì)算的強(qiáng)大工具。它為優(yōu)化、積分、插值和曲線擬合提供了廣泛的功能。在本文中,我們將重點(diǎn)介紹該庫的曲線擬合功能。
SciPy提供了curve_fit函數(shù),可用于在Python中執(zhí)行曲線擬合。該函數(shù)將待擬合的數(shù)據(jù)點(diǎn)和待用于擬合的數(shù)學(xué)函數(shù)作為輸入。然后,該函數(shù)返回最接近輸入數(shù)據(jù)的數(shù)學(xué)函數(shù)的優(yōu)化參數(shù)。
讓我們來看看使用Python中的SciPy庫對100個(gè)隨機(jī)生成的點(diǎn)進(jìn)行3D曲線擬合的完整分步過程。
需要安裝庫:
pip install numpy pip install scipy pip install matplotlib
Python中的3D曲線擬合
現(xiàn)在讓我們看看如何使用SciPy庫在Python中執(zhí)行3D曲線擬合。我們將首先使用NumPy庫生成一些隨機(jī)的3D數(shù)據(jù)點(diǎn)。
import numpy as np # Generate random 3D data points x = np.random.random(100) y = np.random.random(100) z = np.sin(x * y) + np.random.normal(0, 0.1, size=100) data = np.array([x, y, z]).T
我們已經(jīng)在3D空間中生成了100個(gè)隨機(jī)數(shù)據(jù)點(diǎn),其中z坐標(biāo)被定義為具有一些添加的噪聲的x和y坐標(biāo)的函數(shù)。
接下來,我們將定義用于曲線擬合的數(shù)學(xué)函數(shù)。在這個(gè)例子中,我們將使用一個(gè)簡單的3次多項(xiàng)式函數(shù)。
def func(xy, a, b, c, d, e, f): x, y = xy return a + b*x + c*y + d*x**2 + e*y**2 + f*x*y
該函數(shù)將數(shù)據(jù)點(diǎn)的x和y坐標(biāo)以及六個(gè)參數(shù)a、b、c、d、e和f作為輸入。這些參數(shù)是在曲線擬合期間將被優(yōu)化的多項(xiàng)式函數(shù)的系數(shù)。
我們現(xiàn)在可以使用SciPy庫中的curve_fit函數(shù)執(zhí)行曲線擬合。
from scipy.optimize import curve_fit # Perform curve fitting popt, pcov = curve_fit(func, (x, y), z) # Print optimized parameters print(popt)
輸出
[ 0.04416919 -0.12960835 -0.11930051 0.16187097 0.1731539 0.85682108]
curve_fit函數(shù)將用于曲線擬合的數(shù)學(xué)函數(shù)和要擬合的數(shù)據(jù)點(diǎn)作為輸入。它返回兩個(gè)數(shù)組,popt和pcov。popt數(shù)組包含數(shù)學(xué)函數(shù)的參數(shù)的優(yōu)化值,pcov數(shù)組包含參數(shù)的協(xié)方差矩陣。
Python中的curve_fit()函數(shù)用于執(zhí)行非線性回歸曲線擬合。它使用最小二乘優(yōu)化方法來找到最適合給定數(shù)據(jù)集的用戶定義函數(shù)的優(yōu)化參數(shù)。
關(guān)于popt和pcov
popt和pcov是Python中curve_fit()函數(shù)的兩個(gè)輸出。popt是擬合函數(shù)的優(yōu)化參數(shù)的1-D陣列,而pcov是優(yōu)化參數(shù)的估計(jì)協(xié)方差矩陣。
通過使用最小二乘優(yōu)化算法最小化擬合函數(shù)和實(shí)際數(shù)據(jù)點(diǎn)之間的殘差平方和來計(jì)算Popt。curve_fit()函數(shù)使用Levenberg-Marquardt算法來執(zhí)行此優(yōu)化。該算法迭代地調(diào)整參數(shù)值,以最小化目標(biāo)函數(shù),直到收斂。
使用優(yōu)化參數(shù)值處的目標(biāo)函數(shù)的梯度的協(xié)方差矩陣來估計(jì)pcov。pcov的對角元素表示優(yōu)化參數(shù)的方差,非對角元素表示參數(shù)之間的協(xié)方差。pcov用于估計(jì)優(yōu)化參數(shù)值的不確定性。
我們現(xiàn)在可以使用優(yōu)化的參數(shù)在3D空間中繪制擬合曲線。
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # Create 3D plot of the data points and the fitted curve fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z, color='blue') x_range = np.linspace(0, 1, 50) y_range = np.linspace(0, 1, X, Y = np.meshgrid(x_range, y_range) Z = func(X, Y, *popt) ax.plot_surface(X, Y, Z, color='red', alpha=0.5) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
輸出
上面的代碼創(chuàng)建了數(shù)據(jù)點(diǎn)和擬合曲線的3D圖。藍(lán)點(diǎn)表示原始數(shù)據(jù)點(diǎn),紅色表面表示擬合曲線。
完整代碼
現(xiàn)在,下面是完整的代碼,展示了我們?nèi)绾问褂肧ciPy庫在Python中進(jìn)行3D曲線擬合。
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # Generate random 3D data points x = np.random.random(100) y = np.random.random(100) z = np.sin(x * y) + np.random.normal(0, 0.1, size=100) data = np.array([x, y, z]).T # Define mathematical function for curve fitting def func(xy, a, b, c, d, e, f): x, y = xy return a + b*x + c*y + d*x**2 + e*y**2 + f*x*y # Perform curve fitting popt, pcov = curve_fit(func, (x, y), z) # Print optimized parameters print(popt) # Create 3D plot of the data points and the fitted curve fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x, y, z, color='blue') x_range = np.linspace(0, 1, 50) y_range = np.linspace(0, 1, 50) X, Y = np.meshgrid(x_range, y_range) Z = func((X, Y), *popt) ax.plot_surface(X, Y, Z, color='red', alpha=0.5) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
輸出
樣條插值
樣條插值是一種使用分段多項(xiàng)式函數(shù)擬合一組數(shù)據(jù)點(diǎn)的插值方法。插值函數(shù)是通過將數(shù)據(jù)劃分為更小的子集或“段”,并將低次多項(xiàng)式擬合到每個(gè)段來構(gòu)造的。然后,這些多項(xiàng)式段在稱為節(jié)點(diǎn)的點(diǎn)處連接在一起,形成連續(xù)且平滑的插值。
scipy庫提供了幾個(gè)樣條插值函數(shù),例如interp2d和Rbf。
import numpy as np from scipy.interpolate import Rbf import matplotlib.pyplot as plt # Generate random 3D data points x = np.linspace(-5, 5, 100) y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z = np.cos(np.sqrt(X**2 + Y**2)) # Fit a radial basis function model rbf = Rbf(X, Y, Z, function="quintic") Z_pred = rbf(X, Y) # Plot the original data and the fitted function fig = plt.figure() ax = fig.add_subplot(projection="3d") ax.plot_surface(X, Y, Z) ax.plot_surface(X, Y, Z_pred) plt.show()
輸出
在本文中,我們討論了如何使用SciPy庫在Python中執(zhí)行3D曲線擬合。我們生成了一些隨機(jī)的3D數(shù)據(jù)點(diǎn),定義了一個(gè)多項(xiàng)式函數(shù)用于曲線擬合,并使用曲線擬合函數(shù)來找到函數(shù)的優(yōu)化參數(shù)。然后,我們使用這些參數(shù)在3D空間中繪制擬合曲線。
曲線擬合是數(shù)據(jù)分析和數(shù)學(xué)建模的強(qiáng)大技術(shù),Python提供了幾個(gè)庫,可以輕松執(zhí)行曲線擬合。SciPy庫是Python中曲線擬合的熱門選擇,它提供了幾個(gè)可用于1D,2D和3D空間中曲線擬合的函數(shù)。
以上就是使用Python實(shí)現(xiàn)3D曲線擬合的詳細(xì)內(nèi)容,更多關(guān)于Python曲線擬合的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python編程對列表中字典元素進(jìn)行排序的方法詳解
這篇文章主要介紹了Python編程對列表中字典元素進(jìn)行排序的方法,涉及Python針對列表及字典元素的遍歷、讀取、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-05-05關(guān)于Theano和Tensorflow多GPU使用問題
這篇文章主要介紹了關(guān)于Theano和Tensorflow多GPU使用問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python中用pycurl監(jiān)控http響應(yīng)時(shí)間腳本分享
這篇文章主要介紹了Python中用pycurl監(jiān)控http響應(yīng)時(shí)間腳本分享,本文腳本實(shí)現(xiàn)監(jiān)控http相應(yīng)碼,響應(yīng)大小,建立連接時(shí)間,準(zhǔn)備傳輸時(shí)間,傳輸?shù)谝粋€(gè)字節(jié)時(shí)間,完成時(shí)間,需要的朋友可以參考下2015-02-02Python機(jī)器學(xué)習(xí)庫之Scikit-learn基本用法詳解
Scikit-learn?是?Python?中最著名的機(jī)器學(xué)習(xí)庫之一,它提供了大量實(shí)用的機(jī)器學(xué)習(xí)算法以及相關(guān)的工具,可以方便我們進(jìn)行數(shù)據(jù)挖掘和數(shù)據(jù)分析,在這篇文章中,我們將介紹?Scikit-learn?的基本使用,包括如何導(dǎo)入數(shù)據(jù)、預(yù)處理數(shù)據(jù)、選擇和訓(xùn)練模型,以及評估模型的性能2023-07-07python 使用socket傳輸圖片視頻等文件的實(shí)現(xiàn)方式
這篇文章主要介紹了python 使用socket傳輸圖片視頻等文件的實(shí)現(xiàn)方式,本文給出了實(shí)例代碼,需要的朋友可以參考下2019-08-08vue防止用戶連續(xù)點(diǎn)擊造成多次提交的三種解決方法
本文主要介紹了vue防止用戶連續(xù)點(diǎn)擊造成多次提交的三種解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03Python?pyecharts?Boxplot箱線圖的實(shí)現(xiàn)
本文主要介紹了Python?pyecharts?Boxplot箱線圖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼
這篇文章主要介紹了純用NumPy實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10