HOWTO · Python

在 Python 中計算斜率

本教程討論如何在 Python 中計算直線的斜率。

本頁內容

斜率表示直線的 y 座標每當 x 座標增加一個單位時會改變多少。給定兩個點,可用 m = (y2 - y1) / (x2 - x1) 計算斜率。在 Python 中,若要直接計算兩點間的斜率,可以使用簡單的函式;若要為成對資料擬合直線,則可使用 SciPy 或 NumPy。這些擬合函式也能處理兩個點,但主要用途是處理含有更多觀測值的資料集。

使用 Python 函式計算兩點間的斜率

對於點 (x1, y1) 和 (x2, y2),分子代表垂直方向的變化量,分母代表水平方向的變化量。將數值傳給函式時,請確保每個 x 座標都與對應的 y 座標配對。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

def slope(x1, y1, x2, y2):
    return (y2 - y1) / (x2 - x1)


print(slope(4, 5, 8, 10))
1.25

函式會回傳 y 的變化量除以 x 的變化量所得的商。以這組座標來說,垂直變化量為 5,水平變化量為 4,因此斜率是 5/4。結果為正,表示 x 增加時 y 也增加;結果為負,則表示 x 增加時 y 會減少。

使用 SciPy 計算迴歸斜率

scipy.stats.linregress 會依據成對的 x、y 數值擬合直線,並回傳迴歸統計資料。它的 slope 是擬合直線的斜率;其他回傳值包括截距、相關係數、p 值和標準誤。只有兩個點時,擬合直線會通過這兩點;有更多點時,它會為整個資料集進行線性擬合,而不是逐一計算每一對點的斜率。

此範例使用與直接計算函式相同的兩個點。若要處理資料集,請將清單替換為長度相同的觀測值序列。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

from scipy.stats import linregress

x = [4, 8]
y = [5, 10]
result = linregress(x, y)
print(result.slope)
1.25

此處匯入的特定函式是 linregress;它不是整個 SciPy 函式庫的方法。執行前,請先在 Python 環境中安裝 SciPy。

使用 NumPy 擬合直線

np.polyfit 會找出可擬合所提供資料的多項式係數。若要擬合直線,請將次數設為 1。回傳的係數順序是從最高次方到常數項,因此第一個值是斜率,第二個值是截距。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import numpy as np

x = [4, 8]
y = [5, 10]
slope, intercept = np.polyfit(x, y, 1)
print(slope)
1.2499999999999991

和迴歸相同,使用超過兩個觀測值時,會為整個資料集擬合一條直線。浮點運算可能使顯示的係數非常接近數學上的斜率,但未必是完全相同的十進位數值。執行前,請先在 Python 環境中安裝 NumPy。

處理垂直線並選擇合適的方法

直接套用公式時,會除以 x2 - x1。如果兩個點的 x 座標相同,這個差值就是零,因此垂直線沒有有限的斜率,函式也無法透過一般除法回傳斜率。請依照應用情境處理這種情況,例如指出斜率未定義,或另外表示這條線;不要將它當成數值斜率。

如果只有兩個點,而且要計算這兩點間的斜率,請使用直接計算函式。若要取得成對觀測值的迴歸斜率及相關統計資料,請使用 linregress。若需要次數為 1 的多項式擬合係數,請使用 np.polyfit(x, y, 1)。這兩種函式庫方法都能為較大的資料集描述最佳擬合直線,但無法消除以有限斜率表示直線時對垂直線的限制。