线性回归是一种流行的监督机器学习技术。当关系本身不完善时,需要确定因变量(也称为目标变量)和一个或多个自变量(也称为预测变量)之间的关系。

最小二乘近似方法可用于确定线性回归系数。线性代数用投影很优雅地解决了这个问题。

让我们深入研究线性代数如何解决这个问题

估计的多元线性回归方程可以写成

Y = b0 b1X1 b2X2 ... bnXn

矩阵形式

线性代数的核心分析(线性代数投影法在线性回归中的应用)(1)

而需要解决的方程是

线性代数的核心分析(线性代数投影法在线性回归中的应用)(2)

对于特征矩阵来说应该:m> n

方程组将有一个或零个解。只有当向量b位于由A表示的特征矩阵的列空间时,系统才有解。

通常,对于tall matrix,矩阵A的n列将跨越m维空间的一小部分。因此,大多数情况下的RHS将不在特征矩阵A的列空间中,因此没有解

线性代数的核心分析(线性代数投影法在线性回归中的应用)(3)

由上图可知,向量b不属于矩阵A的列张成的列空间[C(A)]

从b到A的列空间的最小距离将是从误差向量e表示的从b到C(A)的垂直向量,因此e将垂直于C(A)

误差向量将表示为

线性代数的核心分析(线性代数投影法在线性回归中的应用)(4)

所以我们的目标是让e尽可能小。

p是b在A [C(A)]的列空间上的投影。因为p在A的列空间中,它可以用它的基向量表示

线性代数的核心分析(线性代数投影法在线性回归中的应用)(5)

我们正在寻找C(A)中接近b的投影p,使e尽可能小,最近的点是从向量b到A的列空间的垂直向量

线性代数的核心分析(线性代数投影法在线性回归中的应用)(6)

任何x的平方长度

线性代数的核心分析(线性代数投影法在线性回归中的应用)(7)

最小意味着|| Ax - b ||的平方长度 最小化

最小二乘解x_hat使得||Ax - b ||的平方长度尽可能小。

因为误差e垂直于列空间,即A的所有列向量根据正交性,这两个垂直向量的点积是零。

线性代数的核心分析(线性代数投影法在线性回归中的应用)(8)

我们可以得到

线性代数的核心分析(线性代数投影法在线性回归中的应用)(9)

著名的线性方程和最小二乘解是

线性代数的核心分析(线性代数投影法在线性回归中的应用)(10)

示例:

找到最接近点(0,6)(1,0)和(2,0)的线。

解:

没有一条直线能通过这三个点。然而,我们可以近似一条最接近所有点的直线,使从所有三个点到直线的误差平方和最小。

设直线方程为Y = b0 b1 * X

矩阵形式

线性代数的核心分析(线性代数投影法在线性回归中的应用)(11)

因此,方程组没有解,因为不在A的列空间中

我们来解最小二乘方程

线性代数的核心分析(线性代数投影法在线性回归中的应用)(12)

这些数字是最好的C和D,所以5-3t是3个点的最佳直线

向量b的投影p到A的列空间

线性代数的核心分析(线性代数投影法在线性回归中的应用)(13)

让我们看看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_)

线性代数的核心分析(线性代数投影法在线性回归中的应用)(14)

输出 :

线性代数的核心分析(线性代数投影法在线性回归中的应用)(15)

结论:

该方法既适用于单线性回归,也适用于多元线性回归。与梯度下降法不同,该方法不需要迭代和微调学习参数。但是当特征数变大时,由于公式中出现的倒数项,计算速度变慢

,