線性回歸是一種流行的監督機器學習技術。當關系本身不完善時,需要确定因變量(也稱為目标變量)和一個或多個自變量(也稱為預測變量)之間的關系。
最小二乘近似方法可用于确定線性回歸系數。線性代數用投影很優雅地解決了這個問題。
讓我們深入研究線性代數如何解決這個問題
估計的多元線性回歸方程可以寫成
Y = b0 b1X1 b2X2 ... bnXn
矩陣形式
而需要解決的方程是
對于特征矩陣來說應該:m> n
方程組将有一個或零個解。隻有當向量b位于由A表示的特征矩陣的列空間時,系統才有解。
通常,對于tall matrix,矩陣A的n列将跨越m維空間的一小部分。因此,大多數情況下的RHS将不在特征矩陣A的列空間中,因此沒有解
由上圖可知,向量b不屬于矩陣A的列張成的列空間[C(A)]
從b到A的列空間的最小距離将是從誤差向量e表示的從b到C(A)的垂直向量,因此e将垂直于C(A)
誤差向量将表示為
所以我們的目标是讓e盡可能小。
p是b在A [C(A)]的列空間上的投影。因為p在A的列空間中,它可以用它的基向量表示
我們正在尋找C(A)中接近b的投影p,使e盡可能小,最近的點是從向量b到A的列空間的垂直向量
任何x的平方長度
最小意味着|| Ax - b ||的平方長度 最小化
最小二乘解x_hat使得||Ax - b ||的平方長度盡可能小。
因為誤差e垂直于列空間,即A的所有列向量根據正交性,這兩個垂直向量的點積是零。
我們可以得到
著名的線性方程和最小二乘解是
示例:
找到最接近點(0,6)(1,0)和(2,0)的線。
解:
沒有一條直線能通過這三個點。然而,我們可以近似一條最接近所有點的直線,使從所有三個點到直線的誤差平方和最小。
設直線方程為Y = b0 b1 * X
矩陣形式
因此,方程組沒有解,因為不在A的列空間中
我們來解最小二乘方程
這些數字是最好的C和D,所以5-3t是3個點的最佳直線
向量b的投影p到A的列空間
讓我們看看python的實現
from sklearn.linear_model import LinearRegression import numpy as np def compute_multiple_regression_coeffs1 (X , Y): r,c = X.shape K = np.ones (shape = (r,1)) # concatenate feature matrix with Intercept A = np.concatenate ((K , X), axis = 1) AT_A = (A.transpose()).dot(A) AT_A_INV = np.linalg.inv (AT_A) AT_B = (A.transpose()).dot (Y) coeffs = AT_A_INV.dot (AT_B) intercept , slope = coeffs[0][0] , coeffs[1: , 0:] return (slope , intercept) def compute_multiple_regression_coeffs2 (X , Y): r,c = X.shape K = np.ones (shape = (r,1)) # concatenate feature matrix with intercept A = np.concatenate ((K , X), axis = 1) AT_A = (A.transpose()).dot(A) AT_A_INV = np.linalg.inv (AT_A) AT_B = (A.transpose()).dot (Y) coeffs = np.linalg.solve (AT_A , AT_B) intercept , slope = coeffs[0][0] , coeffs[1: , 0:] return (slope , intercept) X1 = np.array ([89,66,78,111,44,77,80,66,109,76]) X2 = np.array ([4,1,3,6,1,3,3,2,5,3]) X3 = np.array ([3.84,3.19,3.78,3.89,3.57,3.57,3.03,3.51,3.54,3.25]) Y = np.array ([7,5.4,6.6,7.4,4.8,6.4,7,5.6,7.3,6.4]) X1 = X1[:,np.newaxis] X2 = X2[:,np.newaxis] X3 = X3[:,np.newaxis] Y = Y [:,np.newaxis] print (“computing via method 1 \n”) X123 = np.hstack ([X1 ,X2, X3]) slope,intercept = compute_multiple_regression_coeffs1 (X123 , Y) print (“Slope : {} “.format(slope)) print (“Intercept : {} \n”.format(intercept)) print (“computing via method 2 \n”) slope,intercept = compute_multiple_regression_coeffs2 (X123 , Y) print (“Slope : {} “.format(slope)) print (“Intercept : {} \n”.format(intercept)) print (“Computing coeff via sklearn library \n”) regressor = LinearRegression() regressor.fit(X123, Y) print(regressor.intercept_) print(regressor.coef_)
輸出 :
結論:
該方法既适用于單線性回歸,也适用于多元線性回歸。與梯度下降法不同,該方法不需要叠代和微調學習參數。但是當特征數變大時,由于公式中出現的倒數項,計算速度變慢
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!