摘要:在統計學中,線性回歸是利用稱為線性回歸方程的最小二乘函數對一個或多個自變量和因變量之間關系進行建模的一種回歸分析維基百科。對當前示例作圖表示衡量線性回歸法的指標誤差一個訓練后的模型通常都會使用測試數據集測試該模型的準確性。
在統計學中,線性回歸(Linear regression)是利用稱為線性回歸方程的最小二乘函數對一個或多個自變量和因變量之間關系進行建模的一種回歸分析維基百科。
簡單線性回歸當只有一個自變量的時候,成為簡單線性回歸。
簡單線性回歸模型的思路為了得到一個簡單線性回歸模型,假設存在以房屋面積為特征,以價格為樣本輸出,包含四個樣本的樣本集,如圖:
尋找一條直線,最大程度上擬合樣本特征與樣本輸出之間的關系。
假設最佳擬合的直線方程為:$y = ax + b$,則對于樣本特征 $x$ 的每一個取值 $x^{(i)}$ 的預測值為:$hat{y}^{(i)} = ax^{(i)} +b$。而我們希望的就是真值 $y^{(i)}$ 和預測值 $hat{y}^{(i)}$ 之間的差距盡量小。
可以用 $|y^{(i)} - hat{y}^{(i)}|$ 表示兩者之間的差距,對于所有的樣本,使用求和公式求和處理:
$$ sum_{i=1}^{m}|y^{(i)} - hat{y}^{(i)}| $$
但是這個公式有一個問題,不容易求導,為了解決這個問題,可先對 $|y^{(i)} - hat{y}^{(i)}|$ 進行平方,如此最后的公式就變成了:
$$ sum_{i=1}^{m}(y^{(i)} - hat{y}^{(i)})^2 $$
最后,替換掉 $hat{y}^{(i)}$ ,即為:
$$ sum_{i=1}^{m}(y^{(i)} - ax^{(i)}-b)^2 $$
因此,找到的一個簡單線性回歸模型就是找到合適的 a 和 b,使得該函數的值盡可能的小,該函數也稱為損失函數(loss function)。
最小二乘法找到合適的 a 和 b,使得 $sum_{i=1}^{m}(y^{(i)} - ax^{(i)}-b)^2$ 的值盡可能的小,這樣的方法稱為最小二乘法。
如何求 a 和 b 呢?令該函數為 $J(a, b)$,分別使對 a 和 b 求導的結果為0。
對 b 求導:$frac{partial{J(a, b)}}{partial{b}} = sum_{i=1}^{m}2(y^{(i)} - ax^{(i)}-b)(-1) = 0$,得:
$$ b = overline{y}-aoverline{x} $$
對 a 求導:$frac{partial{J(a, b)}}{partial{a}} = sum_{i=1}^{m}2(y^{(i)} - ax^{(i)}-b)(-x^{(i)}) = 0$,得:
$$ a = frac{sum_{i=1}^{m}(x^{(i)}-overline{x})(y^{(i)}-overline{y})}{sum_{i=1}^{m}(x^{(i)}-overline{x})^2} $$
注:這里略去了公式的推導過程。
簡單線性回歸的實現有了數學的幫助,實現簡單線性回歸就比較方便了。
首先聲明一個樣本集:
import numpy as np x = np.array([1., 2., 3., 4., 5.]) y = np.array([1., 3., 2., 3., 5.])
公式中用到了 x 和 y 的均值:
x_mean = np.mean(x) y_mean = np.mean(y)
求 a 和 b 的值有兩種方法。第一種是使用 for 循環:
# 分子 num = 0.0 # 分母 d = 0.0 for x_i, y_i in zip(x, y): num += (x_i - x_mean) * (y_i - y_mean) d += (x_i - x_mean) ** 2 a = num / d b = y_mean - a * x_mean
第二種是使用矩陣乘:
num = (x - x_mean).dot(y - y_mean) d = (x - x_mean).dot(x - x_mean) a = num / d b = y_mean - a * x_mean
注:使用矩陣乘效率更高。
求出了 a 和 b,簡單線性模型就有了:$hat{y} = a*x + b$。對當前示例作圖表示:?
衡量線性回歸法的指標 誤差一個訓練后的模型通常都會使用測試數據集測試該模型的準確性。對于簡單線性歸回模型當然可以使用 $sum_{i=1}^{m}(y_{test}^{(i)} - hat{y}_{test}^{(i)})^2$ 來衡量,但是它的取值和測試樣本個數 m 存在聯系,改進方法很簡單,只需除以 m 即可,即均方誤差(Mean Squared Error):
$$ MSE:frac{1}{m}sum_{i=1}^{m}(y_{test}^{(i)} - hat{y}_{test}^{(i)})^2 $$
np.sum((y_predict - y_true) ** 2) / len(y_true)
值得一提的是 MSE 的量綱是樣本單位的平方,有時在某些情況下這種平方并不是很好,為了消除量綱的不同,會對 MSE 進行開方操作,就得到了均方根誤差(Root Mean Squared Error):
$$ RMSE:sqrt{frac{1}{m}sum_{i=1}^{m}(y_{test}^{(i)} - hat{y}\_{test}^{(i)})^2} = sqrt{MSE_{test}} $$
import math math.sqrt(np.sum((y_predict - y_true) ** 2) / len(y_true))
還有一種衡量方法是平均絕對誤差(Mean Absolute Error),對測試數據集中預測值與真值的差的絕對值取和,再取一個平均值:
$$ MAE:frac{1}{m}sum_{i=1}^{m}|y_{test}^{(i)} - hat{y}_{test}^{(i)}| $$
np.sum(np.absolute(y_predict - y_true)) / len(y_true)
注:Scikit Learn 的 metrics 模塊中的 mean_squared_error() 方法表示 MSE,mean_absolute_error() 方法表示 MAE,沒有表示 RMSE 的方法。
R Squared更近一步,MSE、RMSE 和 MAE 的局限性在于對模型的衡量只能做到數值越小表示模型越好,而通常對模型的衡量使用1表示最好,0表示最差,因此引入了新的指標:R Squared,計算公式為:
$$ R^2 = 1 - frac{SS_{residual}}{SS_{total}} $$
$SS_{residual} = sum_{i=1}^{m}(hat{y}^{(i)} - y^{(i)})^2$,表示使用模型產生的錯誤;$SS_{total} = sum_{i=1}^{m}(overline{y} - y^{(i)})^2$,表示使用 $y = overline{y}$ 預測產生的錯誤。
更深入的講,對于每一個預測樣本的 x 的預測值都為樣本的均值 $overline{y}$ ,這樣的模型稱為基準模型;當我們的模型等于基準模型時,$R^2$ 的值為0,當我們的模型不犯任何錯誤時 $R^2$ 得到最大值1。
$R^2$ 還可以進行轉換,轉換結果為:
$$ R^2 = 1 - frac{MSE(hat{y}, y)}{Var(y)} $$
實現也很簡單:
1 - np.sum((y_predict - y_true) ** 2) / len(y_true) / np.var(y_true)
注:Scikit Learn 的 metrics 模塊中的 r2_score() 方法表示 R Squared。
多元線性回歸 多元線性回歸模型的思路當有不只一個自變量時,即為多元線性回歸,如圖:
對于有 n 個自變量來說,我們想獲得的線性模型為:
$$ y = heta_{0} + heta_{1}x_{1} + heta_{2}x_{2} + ... + heta_{n}x_{n} $$
根據簡單線性回歸的思路,我們的目標即為:
找到 $ heta_{0}$,$ heta_{1}$,$ heta_{2}$,...,$ heta_{n}$,使得 $sum_{i=1}^{m}(y^{(i)} - hat{y}^2)^2$ 盡可能的小,其中 $hat{y}^{(i)} = heta_{0} + heta_{1}X_{1}^{(i)} + heta_{2}X_{2}^{(i)} + ... + heta_{n}X_{n}^{(i)}$ 。
$hat{y}^{(i)}$:訓練數據中第 i 個樣本的預測值;$X_{j}^{(i)}$:訓練數據中第 i 個樣本的第 j 個自變量。
如果用矩陣表示即為:
$$ hat{y}^{(i)} = X^{(i)}· heta $$
其中:${X^{(i)} = (X_{0}^{(i)},X_{1}^{(i)},X_{2}^{(i)},...,X_{n}^{(i)}), X_{0}^{(i)}equiv1}$;$ heta = ( heta_{0}, heta_{1}, heta_{2},..., heta_{n})^T$。
更進一步,將 $hat{y}^{(i)}$ 也使用矩陣表示,即為:
$$ hat{y} = X_b· heta $$
其中:$X_b = egin{pmatrix} 1 & X_1^{(1)} & X_2^{(1)} & cdots & X_n^{(1)} 1 & X_1^{(2)} & X_2^{(2)} & cdots & X_n^{(2)} cdots & & & & cdots 1 & X_1^{(m)} & X_2^{(m)} & cdots & X_n^{(m)} end{pmatrix}$,$ heta = egin{pmatrix} heta_0 heta_1 heta_2 cdots heta_n end{pmatrix} $
因此,我們目標就成了:使 $(y-X_b· heta)^T(y-X_b· heta)$ 盡可能小。而對于這個公式的解,稱為多元線性回歸的正規方程解(Nomal Equation):
$$ heta = (X_b^TXb)^{-1}(X_b^Ty) $$
實現多元線性回歸將多元線性回歸實現在 LinearRegression 類中,且使用 Scikit Learn 的風格。
_init_() 方法首先初始化線性回歸模型,_theta 表示 $ heta$,interception_ 表示截距,chef_ 表示回歸模型中自變量的系數:
class LinearRegression: def __init__(self): self.coef_ = None self.interceiption_ = None self._theta = None
fit_normal() 方法根據訓練數據集訓練模型,X_b 表示添加了 $X_{0}^{(i)}equiv1$ 的樣本特征數據,并且使用多元線性回歸的正規方程解求出 $ heta$:
def fit_normal(self, X_train, y_train): X_b = np.hstack([np.ones((len(X_train), 1)), X_train]) self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train) self.interception_ = self._theta[0] self.coef_ = self._theta[1:] return self
predict() 方法為預測方法,同樣使用了矩陣乘:
def predict(self, X_predict): X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict]) return X_b.dot(self._theta)
score() 根據給定的測試數據集使用 R Squared 指標計算模型的準確度:
def score(self, X_test, y_test): y_predict = self.predict(X_test) return r2_score(y_test, y_predict)
Scikit Learn 中的線性回歸實現放在 linear_model 模塊中,使用方法如下:線性回歸的特點from sklearn.linear_model import LinearRegression
線性回歸算法是典型的參數學習的算法,只能解決回歸問題,其對數據具有強解釋性。
缺點是多元線性回歸的正規方程解 $ heta = (X_b^TXb)^{-1}(X_b^Ty)$ 的時間復雜度高,為 $O(n^3)$,可優化為 $O(n^{2.4})$。
源碼地址Github | ML-Algorithms-Action
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/44925.html
摘要:表示學習率,是梯度下降法的一個超參數,其取值影響最優解的速度。因此在使用梯度下降法之前,最好進行數據歸一化。同時在隨機梯度下降法中學習率的取值是逐漸遞減的,為了防止固定取值的學習率使得梯度下降到達最優解附近時繼續跳出這個范圍。 梯度下降法不是一個機器學習算法,而是一種基于搜索的最優化方法,用于最小化一個效用函數。 簡單理解梯度下降法 假設存在一個只有一個參數 $ heta$ 的損失函數...
摘要:不能用于機器學習太慢幻覺矩陣操作太難有函數庫啊,比如只能用于前端開發開發者笑了機器學習庫都是開發者機器學習庫神經網絡神經網絡自然語言處理卷積神經網絡一系列庫神經網絡深度學習我們將使用來實現線性回歸,源代碼在倉庫。 譯者按: AI時代,不會機器學習的JavaScript開發者不是好的前端工程師。 原文: Machine Learning with JavaScript : Part 1 ...
閱讀 1516·2021-08-09 13:47
閱讀 2776·2019-08-30 15:55
閱讀 3500·2019-08-29 15:42
閱讀 1122·2019-08-29 13:45
閱讀 3015·2019-08-29 12:33
閱讀 1748·2019-08-26 11:58
閱讀 991·2019-08-26 10:19
閱讀 2416·2019-08-23 18:00