多变量线性回归是一种统计方法,用于预测因变量 yyy 与多个自变量 x1,x2,…,xkx_1, x_2, \ldots, x_kx1,x2,…,xk 之间关系。目标是找到一组参数 w1,w2,…,wkw_1, w_2, \ldots, w_kw1,w2,…,wk和 bbb,使得模型 z=x1w1+x2w2+⋯+xkwk+bz = x_1 w_1 + x_2 w_2 + \cdots + x_k w_k + bz=x1w1+x2w2+⋯+xkwk+b 能够最好地拟合数据。例如,在房价预测中,影响因素可能包括居住面积、地理位置、朝向、学区房、周边设施、建筑年份等。
在建立多元线性回归模型时,为了确保模型具有良好的解释能力和预测效果,自变量的选择应遵循以下准则:
- 自变量必须对因变量有显著影响,并呈现紧密的线性相关性;
- 自变量与因变量之间的相关性应为真实的,而非形式上的;
- 自变量之间应具有适度的互斥性,其相关性不应超过自变量与因变量之间的相关性;
- 自变量应具备完整的统计数据,以便预测值容易确定;
接下来,将讨论两种求解多变量线性回归参数的方法:正规方程解法和梯度下降解法。
正规方程解法
正规方程解法是通过解一个线性方程组来找到参数的精确解。这种方法基于最小二乘法,即最小化预测值和实际值之间的平方误差之和。
给定数据集 x1,x2,…,xk,yx_1, x_2, \ldots, x_k, yx1,x2,…,xk,y,假设我们有 nnn 个样本,我们可以将数据写成矩阵形式:
X=[x11x12⋯x1kx21x22⋯x2k⋮⋮⋱⋮xn1xn2⋯xnk],y=[y1y2⋮yn]X = \begin{bmatrix} x_{11} & x_{12} & \cdots & x_{1k} \\ x_{21} & x_{22} & \cdots & x_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n1} & x_{n2} & \cdots & x_{nk} \end{bmatrix}, \quad \mathbf{y} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{bmatrix}X=x11x21⋮xn1x12x22⋮xn2⋯⋯⋱⋯x1kx2k⋮xnk,y=y1y2⋮yn
其中 XXX 是设计矩阵,y\mathbf{y}y 是目标向量。
正规方程为:
(XTX)w=XTy(X^T X) \mathbf{w} = X^T \mathbf{y}(XTX)w=XTy
其中 $\mathbf{w} $ 是参数向量 [w1,w2,…,wk]T[w_1, w_2, \ldots, w_k]^T[w1,w2,…,wk]T,bbb 通常通过在模型中添加截距项来处理。
解正规方程得到:
w=(XTX)−1XTy \mathbf{w} = (X^T X)^{-1} X^T \mathbf{y}w=(XTX)−1XTy
Python代码实现:
import numpy as np
class LinearRegression:
def __init__(self):
self.w = None
self.b = None
def fit(self, X, y):
# 添加截距项
X = np.concatenate([np.ones((X.shape[0], 1)), X], axis=1)
# 计算参数
self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
self.b = self.w[0]
def predict(self, X):
# 添加截距项
X = np.concatenate([np.ones((X.shape[0], 1)), X], axis=1)
return X.dot(self.w)
# 示例数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])
y = np.array([1, 2.5, 3.5, 5])
model = LinearRegression()
model.fit(X, y)
print("Weights:", model.w)
print("Bias:", model.b)
梯度下降解法
梯度下降解法是一种迭代优化算法,用于找到最小化成本函数的参数。在多变量线性回归中,成本函数通常是平方误差之和:
J(w,b)=12n∑i=1n(yi−(xi1w1+xi2w2+⋯+xikwk+b))2 J(\mathbf{w}, b) = \frac{1}{2n} \sum_{i=1}^n (y_i - (x_{i1} w_1 + x_{i2} w_2 + \cdots + x_{ik} w_k + b))^2J(w,b)=2n1i=1∑n(yi−(xi1w1+xi2w2+⋯+xikwk+b))2
梯度下降通过迭代更新参数来最小化这个成本函数:
w:=w−α∂J∂w,b:=b−α∂J∂b \mathbf{w} := \mathbf{w} - \alpha \frac{\partial J}{\partial \mathbf{w}}, \quad b := b - \alpha \frac{\partial J}{\partial b}w:=w−α∂w∂J,b:=b−α∂b∂J
其中 α\alphaα 是学习率,∂J∂w\frac{\partial J}{\partial \mathbf{w}}∂w∂J 和 ∂J∂b\frac{\partial J}{\partial b}∂b∂J 分别是成本函数相对于 w\mathbf{w}w 和 bbb 的偏导数。
Python代码实现:
class LinearRegressionSGD:
def __init__(self, learning_rate=0.01, max_iter=1000):
self.learning_rate = learning_rate
self.max_iter = max_iter
self.w = None
self.b = None
def fit(self, X, y):
# 添加截距项
X = np.concatenate([np.ones((X.shape[0], 1)), X], axis=1)
# 初始化参数
self.w = np.zeros(X.shape[1])
for _ in range(self.max_iter):
gradients = 2/X.shape[0] * X.T.dot(X.dot(self.w) - y)
self.w -= self.learning_rate * gradients
if _ % 100 == 0:
loss = np.mean((y - X.dot(self.w)) ** 2)
print(f"Iteration {_}, Loss: {loss}")
def predict(self, X):
# 添加截距项
X = np.concatenate([np.ones((X.shape[0], 1)), X], axis=1)
return X.dot(self.w)
# 示例数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])
y = np.array([1, 2.5, 3.5, 5])
model = LinearRegressionSGD(learning_rate=0.01, max_iter=1000)
model.fit(X, y)
print("Weights:", model.w)
print("Bias:", model.w[0])
总结
- 正规方程解法:提供了参数的精确解,计算复杂度为 $ O(k^3) $,适用于较小的数据集。
- 梯度下降解法:是一种迭代方法,可以处理更大的数据集,但需要选择合适的学习率和迭代次数。
在实际应用中,选择哪种方法取决于数据集的大小、特征的数量以及计算资源。对于大规模数据集,通常更倾向于使用梯度下降或其变体(如随机梯度下降)。
| 方法 | 正规方程 | 梯度下降 |
|---|---|---|
| 原理 | 几次矩阵运算 | 多次迭代 |
| 特殊要求 | X⊤XX^⊤XX⊤X 的逆矩阵存在 | 需要确定学习率 |
| 复杂度 | O(n3)O(n^3)O(n3) | O(n2)O(n^2)O(n2) |
| 适用样本数 | m<10000m<10000m<10000 | m≥10000m≥10000m≥10000 |
5229

被折叠的 条评论
为什么被折叠?



