簡單線性迴歸基本原理介紹與討論
簡單線性迴歸探討兩個連續變數之間的關係,這兩個變數分別被命名為 independent variable(自變數)及 dependent variable (應變數),各自以 x 和 y 來表示。
- 自變數 x,有時又稱做 predictor variable 或是 explanatory variable。
- 應變數 y,有時又稱做 response variable 或是 outcome variable。其值會隨著 x 的改變而變化。
而這兩變數的關係,又可以分為下列兩種;Deterministic / Functional relationships (定性關係/函數關係)及 Statistical relationships(統計關係)。
在定性/函數關係中,若(xᵢ , yᵢ) 數對完全落在直線上,我們可以用(圖一)來表示:
但某些資料組的(xᵢ , yᵢ) 數對,乍看之下似乎有某種線性關係,但是其對應又不完全落在直線上,這類的關係則稱為統計關係(圖二)。
如果能找到這組資料的 best fitting line(最佳配適線),就能在已知自變數 x 的情形下,預測應變數 y 的對應值,也能從最佳配適線的斜率和截距,看出資料的走向。Best fitting line 可用數學式表示為
每一個自變數 xᵢ,都可以利用這個數學式來計算要預測的 ŷᵢ。
我們要怎麼找到資料的最佳配適線呢?這條線是用來預測給定自變數 xᵢ 時,所對應的應變數 yᵢ,因此,我們期望預測出的 ŷᵢ 和真實 yᵢ 值愈接近愈好。先利用下列公式來計算 prediction error(預測誤差,或又稱 residual error 殘餘誤差):
並將所有資料點的預測誤差各自平方後做加總,取得 sum of squared residuals (SSR,殘差平方和):
藉由調整 b₀ 和 b₁ 這兩個參數,讓 SSR 的值達到最小後,就能得到最佳適配線。
直接調整 b₀ 和 b₁ 值不符合效益,因此我們可以利用微積分的觀念,將 SSR 分別對 b₀ 和 b₁ 做偏微分,當一階微分等於零時,便可以得到函數的極值。而因為 SSR 永遠為正,所以做偏微分後的極值為其最小值。
首先假設共有 n 組資料,而 x 和 y 的平均值分別如下 ,
接著對 b₀ 做偏微分
得到
再對 b₁ 做偏微分,並將 b₀ 代入做計算:
經過上述計算之後得到如下結果:
- b₁ 是最佳配適線的斜率。當 b₁ > 0 時,ŷᵢ 會隨著 xᵢ 增加而增加,反之若 b₁ < 0 時,ŷᵢ 會隨著 xᵢ 增加而減少。
- b₀ 則是最佳配適線的截距。若資料中的自變數 xᵢ 有時會等於 0,則當 x = 0 時,b₀ 便相當於所預測變數 y 的平均值;若在資料中, xᵢ 並不會等於 0 ,表示 xᵢ = 0 超過資料可討論的範圍,則 b₀ 沒有實值的意義。
使用 Python 及 scikit-learn 來計算簡單線性迴歸
這個範例使用了 scikit-learn 本身所提供的 Boston house-prices 資料組 來實作(完整程式碼連結)。
首先使用 pandas 將資料轉成 Dataframe 格式,再使用 numpy 取出 LSTAT 及 MEDV 兩個欄位的資料,分別存入自變數 x 及應變數 y 的陣列中。接著,再使用下列的函式來計算 b₀ 和 b₁。
def simple_linear_regression(raw_x, raw_y):
n = np.size(raw_x)
x = np.array(raw_x)
y = np.array(raw_y)
x_mean = np.mean(x)
y_mean = np.mean(y)
num1 = np.sum(y*x) - n*y_mean*x_mean
num2 = np.sum(x*x) - n*x_mean*x_mean
b_1 = num1 / num2
b_0 = y_mean - b_1 * x_mean
return (b_0, b_1)
得到結果如下:
為了驗証上面函數的正確性,另外寫了一段使用 scikit-learn 中的 LinearRegression() 模組來比對,亦得到近似的結果:
The intercept of the best fitting line is 34.5538408793831
The slope of the best fitting line is -0.9500493537579906
😃 如果大家覺得這篇文章的內容,對你有幫助的話,請幫我拍個手!
如果有什麼其他關於人工智慧/機器學習的內容想了解的話,也歡迎留言讓我知道。大家的鼓勵都是我寫作的動力!💪🏽
參考資料: