Simple Linear Regression (簡單線性迴歸)

Keyo
7 min readJun 26, 2019

--

簡單線性迴歸是一種常見的統計方法,用來探尋兩個連續變數之間的關係。簡單線性迴歸的使用和証明,在機器學習和人工智慧的資料中能見度非常高,本篇文章會依下列順序來介紹。

  1. 基本原理介紹、公式推導。
  2. 使用 Python 和 scikit-learn 計算簡單線性迴歸。(程式碼範例

簡單線性迴歸基本原理介紹與討論

簡單線性迴歸探討兩個連續變數之間的關係,這兩個變數分別被命名為 independent variable(自變數)dependent variable (應變數),各自以 xy 來表示。

  • 自變數 x,有時又稱做 predictor variable 或是 explanatory variable
  • 應變數 y,有時又稱做 response variable 或是 outcome variable。其值會隨著 x 的改變而變化。

而這兩變數的關係,又可以分為下列兩種;Deterministic / Functional relationships (定性關係/函數關係)Statistical relationships(統計關係)。

定性/函數關係中,若(xᵢ , yᵢ) 數對完全落在直線上,我們可以用(圖一)來表示:

(圖一)Deterministic / Functional relationship

但某些資料組的(xᵢ , yᵢ) 數對,乍看之下似乎有某種線性關係,但是其對應又不完全落在直線上,這類的關係則稱為統計關係(圖二)。

(圖二)Statistical relationship

如果能找到這組資料的 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 組資料,而 xy 的平均值分別如下 ,

接著對 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

😃 如果大家覺得這篇文章的內容,對你有幫助的話,請幫我拍個手!

如果有什麼其他關於人工智慧/機器學習的內容想了解的話,也歡迎留言讓我知道。大家的鼓勵都是我寫作的動力!💪🏽

--

--

Keyo

偶爾寫點東西;資料科學;曾是 iOS 和後端工程師,做過的事雜到無法歸類,但本質是個科學家。