文章目錄
相關文章:
監督學習 | 非線性迴歸 之多項式迴歸原理及Sklearn實現
監督學習 | 線性迴歸 之正則線性模型原理及Sklearn實現
監督學習 | 線性分類 之Logistic迴歸原理及Sklearn實現
1. 線性迴歸
線性迴歸
,又稱普通最小二乘法(Ordinary Least Squares, OLS),是迴歸問題最簡單也最經典的線性方法。線性迴歸需按照參數 w 和 b,使得對訓練集的預測值與真實的迴歸目標值 y 之間的均方誤差(MSE)最小。
均方誤差(Mean Squared Error)是預測值與真實值之差的平方和除以樣本數。
線性迴歸沒有參數,這是一個優點,但也因此無法控制模型的複雜度。
1.1 基本形式
線性迴歸預測模型:
-
是預測值
-
是特徵的數量
-
是第 個特徵值
-
偏置項 以及特徵權重
這可以用更爲簡介的向量化表示。
線性迴歸預測模型(向量化):
-
-
和 學習得到,模型就得以確定
-
1.2 成本函數
在線性迴歸中,我們選擇 MSE(均方誤差)作爲其成本函數
(Cost Function),其原因在與:首先它是一個凸函數
,其次是因爲它是可導的
,這兩個條件決定了可以利用梯度下降法來求得 的最小值。
2. w 的計算方式
關於 的計算,有兩種方法,一種是利用最小二乘法
最小化 MSE 導出 的計算公式(標準方程);另一種是利用梯度下降法
找出 MSE 的最小值。
首先來看最小利用最小二乘法計算 的公式。
利用最小二乘法
最小化成本函數 ,可以得出 的計算方程(標準方程
):[1]
-
是使成本函數 MSE 最小化的 值
-
是包含 到 的目標值向量
則最終學得的多元線性迴歸模型
爲:
其中:。
推導過程如下:
2.1 標準方程法
2.1.1 普通形式
標準方程法,又稱標準最小二乘法,即通過最小二乘法求出 和 或向量形式下的 ,由最小二乘法導出的 計算公式稱爲標準方程。
首先來推導普通形式下 和 的計算公式。
線性迴歸試圖學得:
如何確定 和 呢?關鍵在於如何衡量 與 之間的差別。
回想一下,訓練模型就是設置模型參數知道模型最適應訓練集的過程。要達到這個目的,我們首先需要知道怎麼衡量模型對訓練數據的擬合程度是好還是差,在 機器學習 | 迴歸評估指標 裏,我們瞭解到迴歸模型最常見的性能指標有均方誤差(MSE)。因此以 MSE 爲線性迴歸模型的成本函數,在訓練線性迴歸模型時,我們需要找到最小化 MSE 的 值 ,即:
均方誤差有非常好的幾何意義,它對應了常用的歐幾里得距離(或簡稱歐氏距離,Euclidean distance),基於均方誤差最小化來進行模型求解的方法稱爲“最小二乘法”
(least square method),在線性迴歸中,最小二乘法就是試圖找出一條直線,使得所有樣本到線上的歐氏距離之和最小。
求解 和 使得 最小化的過程,稱爲線性迴歸模型的最小二乘“參數估計”
(parameter estimation),我們可以將 分別對 和 求偏導,得到:[2]
然後令公式 (8)、(9) 爲零可以得到 和 最優解的閉式(closed-form)解:
2.1.2 向量形式
更一般的情形是對如有 個屬性的數據集 ,這時我們試圖學得:
這稱爲多元線性迴歸
(multivariate linear regression).
類似的,可利用最小二乘法對 和 進行估計。爲便於討論,我們吧 和 轉換爲向量形式
,即:
相應的,把數據集 表示爲一個 大小的矩陣 ,其中每行對應與一個示例,該行前 個元素對應與示例的 個屬性值,最後一個元素恆爲 1,即:
再把標記也寫成向量形式 ,類似於公式 (7) ,有:
令 ,對 求導得到:
令上式爲零可得 的最優解的閉式接,但由於涉及矩陣逆的計算,比單變量情形要複雜一些,下面我們做一個簡單的討論。
當 爲滿秩矩陣(full-rank matrix)或正定矩陣(positive definite matrix)時,令公式 (15) 爲零可得標準方程
:
其中 是矩陣 的逆矩陣,令 ,則最終學得的多元線性迴歸模型
爲:
KaTeX parse error: No such environment: align* at position 9: \begin{̲a̲l̲i̲g̲n̲*̲}̲ f(\bar{x}…
2.1.3 Python 實現
我們利用 Python 簡單實現一下 以及迴歸方程的計算,首先方程 生成 100 個數據點並可視化:
import numpy as np
import matplotlib.pyplot as plt
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.show()
<Figure size 640x480 with 1 Axes>
接着我們利用公式 (16) 來計算 :
X_b = np.c_[np.ones((100, 1)), X] # 向量形式下 x 的輸入爲 (x, 1)
theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
theta
array([[4.10499602],
[2.78527083]])
我們用區間的首尾兩個點(x=0 和 x=2)來畫出擬合直線。計算出 之後就可以利用公式 (17) 來計算兩個點的的預測數據 y_predict :
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # add x0 = 1 to each instance
y_predict = X_new_b.dot(theta)
y_predict
plt.plot(X_new, y_predict, "r-")
plt.plot(X, y, "b.")
plt.axis([0, 2, 0, 15])
plt.show()
2.1.4 計算複雜度
標準方程需對矩陣 求逆,這是一個 的矩陣( 是特徵數量)。對這種矩陣求逆計算複雜度通常爲 到 之間(取決於計算實現)。換句話說,如果將特徵數量翻倍,那麼計算時間將乘以大約 倍到 倍之間。[3]
特徵數量較大時(例如 100 000)時,標準方程的計算將極其緩慢
好的一面是,相對於訓練集中的實例數量 來說,方程式線性的,所以能夠有效的處理大量的訓練集,只要內存足夠。
同樣,線性迴歸模型一經訓練(不論是標準方程還是其他算法),預測就非常快速,因爲計算複雜度相對於想要預測的實例數量和特徵數量來說,都是線性的。換句話說,對兩倍的實例(或者是兩倍的特徵數)進行預測,大概需要兩倍的時間。因此,我們來看看其他的優化算法:梯度下降算法。
2.2 梯度下降法
2.2.1 梯度下降原理
關於梯度下降法的推導及 Python 實現,請參考我的另一片文章:機器學習 | 梯度下降原理及Python實現。
2.2.2 Python 實現
3. Sklearn 實現
我們將使用線性迴歸根據體質指數 (BMI) 預測預期壽命。
對於線性模型,我們將使用 sklearn.linear_model.LinearRegression 類(Sklearn 官方文檔)。
我們將使用線性迴歸模型對數據進行擬合併畫出擬合直線。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
bmi_life_data = pd.read_csv("data/bmi_and_life_expectancy.csv")
bmi_life_model = LinearRegression()
bmi_life_model.fit(bmi_life_data[['BMI']], bmi_life_data[['BMI']])
y_1 = bmi_life_model.predict(np.array(min(bmi_life_data['BMI'])).reshape(-1,1))
y_2 = bmi_life_model.predict(np.array(max(bmi_life_data['BMI'])).reshape(-1,1))
y_1 = y_1.tolist()
y_1 = [y for x in y_1 for y in x]
y_2 = y_2.tolist()
y_2 = [y for x in y_2 for y in x]
plt.plot(bmi_life_data['BMI'], bmi_life_data['BMI'], 'b.')
plt.plot([min(bmi_life_data['BMI']), max(bmi_life_data['BMI'])], [y_1, y_2], "r-")
plt.xlabel("BMI")
plt.ylabel('life_expectancy')
plt.show()
參考資料
[1] 周志華. 機器學習[M]. 北京: 清華大學出版社, 2016: 53-56
[2] Aurelien Geron, 王靜源, 賈瑋, 邊蕤, 邱俊濤. 機器學習實戰:基於 Scikit-Learn 和 TensorFlow[M]. 北京: 機械工業出版社, 2018: 103-106.
[3] Aurelien Geron, 王靜源, 賈瑋, 邊蕤, 邱俊濤. 機器學習實戰:基於 Scikit-Learn 和 TensorFlow[M]. 北京: 機械工業出版社, 2018: 106-107.