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()

輸出:

logarithmic curve in python

在上面的程式中,我們首先匯入必要的庫並建立兩個 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()

輸出:

exponential curve in python

遵循與我們在對數曲線擬合中所做的相同的過程,鏡像地進行:在那裡我們變換了輸入 (log(x)),在這裡我們變換輸出 (log(b)),然後在評估擬合模型時用 exp() 撤銷該變換。與對數範例一樣,範例資料是線性的,因此這演示的是指數擬合的機制,而不是指數模型是自然選擇的情形。