📜  线性回归中的梯度下降(1)

📅  最后修改于: 2023-12-03 15:11:37.516000             🧑  作者: Mango

线性回归中的梯度下降

线性回归是机器学习中最基础的算法之一,其目的是找到一个线性函数来描述输入变量和输出变量之间的关系。在实际中,常常使用梯度下降算法来求解优化问题。

线性回归模型

线性回归模型可以写为:

$$ y=\theta_0+\theta_1 x_1+\theta_2 x_2+\cdots+\theta_n x_n $$

其中,$y$是输出变量,$x_i$是输入变量,$\theta_i$是权重,也称为模型的参数。

损失函数

在机器学习中,模型的目标是最小化损失函数。对于线性回归模型,我们通常使用均方误差(Mean Squared Error)作为损失函数:

$$ J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 $$

其中,$m$是样本数量,$h_\theta(x)$是我们训练出来的模型,也就是线性回归模型中的$y$,$y^{(i)}$是第$i$个样本的真实输出值。

梯度下降

梯度下降是一种求解优化问题的方法,其基本思路是沿着负梯度方向进行迭代。对于线性回归来说,我们要求的是最小化损失函数$J(\theta)$,因此,我们需要求出其对于每个参数的偏导数,也就是梯度:

$$ \begin{aligned} \frac{\partial}{\partial\theta_j}J(\theta)&=\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\ \frac{\partial}{\partial\theta_0}J(\theta)&=\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)}) \end{aligned} $$

然后,我们使用梯度下降算法进行迭代:

$$ \begin{aligned} \theta_j&:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta)\ \theta_0&:=\theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta) \end{aligned} $$

其中,$\alpha$是学习率,表示每次迭代时参数更新的步长。

梯度下降的迭代过程如下:

repeat until convergence {
    // 每个参数更新
    for j = 0 to n {
        theta_j = theta_j - alpha * (1/m) * sum((h_theta(x_i) - y_i) * x_i(j) for i in 1 to m)
    }
}

这个算法可以保证每次迭代都能够减小损失函数,直到收敛到最优解。

代码实现

下面是使用Python实现线性回归模型和梯度下降算法的代码片段:

import numpy as np

class LinearRegression:
    def __init__(self, alpha=0.01, n_iter=1000):
        self.alpha = alpha
        self.n_iter = n_iter
        self.theta = None
        
    def fit(self, X, y):
        # 添加截距项
        X = np.c_[np.ones(X.shape[0]), X]
        
        # 初始化参数
        self.theta = np.zeros(X.shape[1])
        
        # 梯度下降迭代
        for i in range(self.n_iter):
            h = np.dot(X, self.theta)
            loss = h - y
            gradient = np.dot(X.T, loss) / y.size
            self.theta -= self.alpha * gradient
            
    def predict(self, X):
        X = np.c_[np.ones(X.shape[0]), X]
        return np.dot(X, self.theta)
```

这个类包含三个方法:

- `__init__`:初始化模型参数。
- `fit`:使用梯度下降算法拟合数据,更新模型参数。
- `predict`:使用训练好的模型进行预测。

### 总结

本文介绍了线性回归中的梯度下降算法,其基本思想是通过求解梯度来更新模型参数,使得损失函数可以在不断迭代中最小化。我们使用Python代码实现了线性回归模型和梯度下降算法。