HOWTO · Python
在 Python 中進行指數和對數曲線擬合
本教程演示了如何在 Python 中進行指數和對數曲線擬合。
本頁內容
曲線擬合是一種非常有效的工具,被廣泛用於分析。曲線擬合方法研究獨立變量(也稱為預測變量)和因變量(稱為響應變量)之間的關係。此方法旨在提供最合適的模型來擬合一定數量的資料點。
曲線擬合有兩種類型:
- 對數曲線擬合
- 指數曲線擬合
在本教程中,我們將向您展示如何在 Python 中進行對數曲線擬合和指數曲線擬合的方法。兩者都使用相同的技巧:對一個變量取對數,使模型變成一條直線,然後用最小平方多項式擬合來擬合這條直線。
Python 中用於對數和指數曲線擬合的庫和模組
讓我們討論您可以用來執行程式的庫和模組。
NumPy 庫
我們將使用的 NumPy 庫中的函數如下。
array()- 此函數用於建立一個NumPy陣列,它是相同類型的值的集合,並具有元組形式的索引值。log()- 此函數更像是一種數學運算,有助於計算數字的自然對數。該數字是輸入陣列元素的一部分。exp()- 此函數也是一種數學運算,用於計算輸入NumPy陣列中存在的元素的指數。polyfit()- 此函數有助於將任何資料擬合到多項式函數中。它進行最小平方多項式擬合。
Matplotlib 庫
Matplotlib 庫主要用於在 Python 中繪圖。此庫通常用於在 Python 中建立視覺化。本教程中使用了此庫中的一個稱為 pyplot 模組的模組。
Matplotlib 庫的 pyplot 模組是一個開源模組,有助於使 Matplotlib 庫像 MATLAB 一樣工作。此模組有許多函數,可幫助我們執行諸如建立繪圖區域、在繪圖上建立標籤等操作。
對數曲線擬合
對數模型的形式為 y = a * log(x) + b。由於該模型對 log(x) 是線性的,您可以透過將 y 對 log(x) 進行直線擬合來擬合它 — 次數為 1 的 polyfit 正是這樣做的,並返回 a 和 b:
import numpy as np
x = np.array([5, 10, 15, 20, 25])
y = np.array([3, 6, 9, 12, 15])
log_x = np.log(x)
coefficients = np.polyfit(log_x, y, 1)
print(coefficients)
輸出:
[ 7.2647162 -9.64806344]
因此,擬合的模型為 y = 7.2647 * log(x) - 9.6481。要繪圖,請將資料和擬合直線對 log(x) 繪製:
import numpy as np
import matplotlib.pyplot as plt
x = np.array([5, 10, 15, 20, 25])
y = np.array([3, 6, 9, 12, 15])
log_x = np.log(x)
slope, intercept = np.polyfit(log_x, y, 1)
fitted = slope * log_x + intercept
plt.plot(log_x, y, "o")
plt.plot(log_x, fitted)
plt.show()
輸出:
在上面的程式中,我們首先匯入必要的庫並建立兩個 NumPy 陣列作為我們的主要資料。我們只對 x 值取對數 — 該模型對 log(x) 是線性的,因此 y 本身不被變換。然後 polyfit() 函數將 y 對 log(x) 擬合成一條直線,它返回的兩個值就是對數方程式的係數。
請注意,上面的範例資料隨 x 線性增長,因此請將其視為對該過程的演示;對於真實資料,在依賴該模型之前,請檢查擬合曲線實際上有多吻合。
指數曲線擬合
指數模型的形式為 y = c * e^(d * x)。對兩邊取自然對數可得 log(y) = log(c) + d * x,這同樣是一條直線 — 這次是 log(y) 對 x 的直線。擬合這條直線,截距就給出了 log(c):
import numpy as np
a = np.array([6, 12, 18, 24, 30])
b = np.array([4, 8, 12, 16, 20])
log_b = np.log(b)
coefficients = np.polyfit(a, log_b, 1)
print(coefficients)
輸出:
[0.06520038 1.17018581]
斜率為 d = 0.0652,截距為 log(c) = 1.1702,因此擬合的模型為 b = e^1.1702 * e^(0.0652 * a)。要繪圖,請在資料點處對該模型求值:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([6, 12, 18, 24, 30])
b = np.array([4, 8, 12, 16, 20])
slope, intercept = np.polyfit(a, np.log(b), 1)
fitted = np.exp(intercept) * np.exp(slope * a)
plt.plot(a, b, "o")
plt.plot(a, fitted)
plt.show()
輸出:
遵循與我們在對數曲線擬合中所做的相同的過程,鏡像地進行:在那裡我們變換了輸入 (log(x)),在這裡我們變換輸出 (log(b)),然後在評估擬合模型時用 exp() 撤銷該變換。與對數範例一樣,範例資料是線性的,因此這演示的是指數擬合的機制,而不是指數模型是自然選擇的情形。