使用Python實現(xiàn)3D曲線擬合
曲線擬合是數(shù)據(jù)分析和數(shù)學(xué)建模領(lǐng)域中廣泛使用的技術(shù)。它涉及到尋找最接近一組數(shù)據(jù)點的數(shù)學(xué)函數(shù)的過程。在3D曲線擬合中,該過程被擴展到三維空間,其中的目標是找到最好地表示一組3D數(shù)據(jù)點的函數(shù)。
Python是一種用于科學(xué)計算的流行編程語言,它提供了幾個可用于3D曲線擬合的庫。在本文中,我們將討論如何使用SciPy庫在Python中執(zhí)行3D曲線擬合。
SciPy庫
SciPy庫是Python中用于科學(xué)計算的強大工具。它為優(yōu)化、積分、插值和曲線擬合提供了廣泛的功能。在本文中,我們將重點介紹該庫的曲線擬合功能。
SciPy提供了curve_fit函數(shù),可用于在Python中執(zhí)行曲線擬合。該函數(shù)將待擬合的數(shù)據(jù)點和待用于擬合的數(shù)學(xué)函數(shù)作為輸入。然后,該函數(shù)返回最接近輸入數(shù)據(jù)的數(shù)學(xué)函數(shù)的優(yōu)化參數(shù)。
讓我們來看看使用Python中的SciPy庫對100個隨機生成的點進行3D曲線擬合的完整分步過程。
需要安裝庫:
pip install numpy pip install scipy pip install matplotlib
Python中的3D曲線擬合
現(xiàn)在讓我們看看如何使用SciPy庫在Python中執(zhí)行3D曲線擬合。我們將首先使用NumPy庫生成一些隨機的3D數(shù)據(jù)點。
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個隨機數(shù)據(jù)點,其中z坐標被定義為具有一些添加的噪聲的x和y坐標的函數(shù)。
接下來,我們將定義用于曲線擬合的數(shù)學(xué)函數(shù)。在這個例子中,我們將使用一個簡單的3次多項式函數(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ù)點的x和y坐標以及六個參數(shù)a、b、c、d、e和f作為輸入。這些參數(shù)是在曲線擬合期間將被優(yōu)化的多項式函數(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ù)點作為輸入。它返回兩個數(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ù)的兩個輸出。popt是擬合函數(shù)的優(yōu)化參數(shù)的1-D陣列,而pcov是優(yōu)化參數(shù)的估計協(xié)方差矩陣。
通過使用最小二乘優(yōu)化算法最小化擬合函數(shù)和實際數(shù)據(jù)點之間的殘差平方和來計算Popt。curve_fit()函數(shù)使用Levenberg-Marquardt算法來執(zhí)行此優(yōu)化。該算法迭代地調(diào)整參數(shù)值,以最小化目標函數(shù),直到收斂。
使用優(yōu)化參數(shù)值處的目標函數(shù)的梯度的協(xié)方差矩陣來估計pcov。pcov的對角元素表示優(yōu)化參數(shù)的方差,非對角元素表示參數(shù)之間的協(xié)方差。pcov用于估計優(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ù)點和擬合曲線的3D圖。藍點表示原始數(shù)據(jù)點,紅色表面表示擬合曲線。
完整代碼
現(xiàn)在,下面是完整的代碼,展示了我們?nèi)绾问褂肧ciPy庫在Python中進行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()
輸出
樣條插值
樣條插值是一種使用分段多項式函數(shù)擬合一組數(shù)據(jù)點的插值方法。插值函數(shù)是通過將數(shù)據(jù)劃分為更小的子集或“段”,并將低次多項式擬合到每個段來構(gòu)造的。然后,這些多項式段在稱為節(jié)點的點處連接在一起,形成連續(xù)且平滑的插值。
scipy庫提供了幾個樣條插值函數(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曲線擬合。我們生成了一些隨機的3D數(shù)據(jù)點,定義了一個多項式函數(shù)用于曲線擬合,并使用曲線擬合函數(shù)來找到函數(shù)的優(yōu)化參數(shù)。然后,我們使用這些參數(shù)在3D空間中繪制擬合曲線。
曲線擬合是數(shù)據(jù)分析和數(shù)學(xué)建模的強大技術(shù),Python提供了幾個庫,可以輕松執(zhí)行曲線擬合。SciPy庫是Python中曲線擬合的熱門選擇,它提供了幾個可用于1D,2D和3D空間中曲線擬合的函數(shù)。
以上就是使用Python實現(xiàn)3D曲線擬合的詳細內(nèi)容,更多關(guān)于Python曲線擬合的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于Theano和Tensorflow多GPU使用問題
這篇文章主要介紹了關(guān)于Theano和Tensorflow多GPU使用問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python中用pycurl監(jiān)控http響應(yīng)時間腳本分享
這篇文章主要介紹了Python中用pycurl監(jiān)控http響應(yīng)時間腳本分享,本文腳本實現(xiàn)監(jiān)控http相應(yīng)碼,響應(yīng)大小,建立連接時間,準備傳輸時間,傳輸?shù)谝粋€字節(jié)時間,完成時間,需要的朋友可以參考下2015-02-02Python機器學(xué)習(xí)庫之Scikit-learn基本用法詳解
Scikit-learn?是?Python?中最著名的機器學(xué)習(xí)庫之一,它提供了大量實用的機器學(xué)習(xí)算法以及相關(guān)的工具,可以方便我們進行數(shù)據(jù)挖掘和數(shù)據(jù)分析,在這篇文章中,我們將介紹?Scikit-learn?的基本使用,包括如何導(dǎo)入數(shù)據(jù)、預(yù)處理數(shù)據(jù)、選擇和訓(xùn)練模型,以及評估模型的性能2023-07-07python 使用socket傳輸圖片視頻等文件的實現(xiàn)方式
這篇文章主要介紹了python 使用socket傳輸圖片視頻等文件的實現(xiàn)方式,本文給出了實例代碼,需要的朋友可以參考下2019-08-08Python?pyecharts?Boxplot箱線圖的實現(xiàn)
本文主要介紹了Python?pyecharts?Boxplot箱線圖的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05純用NumPy實現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼
這篇文章主要介紹了純用NumPy實現(xiàn)神經(jīng)網(wǎng)絡(luò)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10