多变量线性回归的求解方法

多变量线性回归是一种统计方法,用于预测因变量 yyy 与多个自变量 x1,x2,…,xkx_1, x_2, \ldots, x_kx1,x2,,xk 之间关系。目标是找到一组参数 w1,w2,…,wkw_1, w_2, \ldots, w_kw1,w2,,wkbbb,使得模型 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=x11x21xn1x12x22xn2x1kx2kxnk,y=y1y2yn

其中 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]Tbbb 通常通过在模型中添加截距项来处理。

解正规方程得到:

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=1n(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αwJ,b:=bαbJ

其中 α\alphaα 是学习率,∂J∂w\frac{\partial J}{\partial \mathbf{w}}wJ∂J∂b\frac{\partial J}{\partial b}bJ 分别是成本函数相对于 w\mathbf{w}wbbb 的偏导数。

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^⊤XXX 的逆矩阵存在需要确定学习率
复杂度O(n3)O(n^3)O(n3)O(n2)O(n^2)O(n2)
适用样本数m<10000m<10000m<10000m≥10000m≥10000m10000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值