电脑基础 · 2023年4月19日

跟着AI学AI(1): 线性回归模型

跟着AI学AI-1: 线性回归模型

    • 提问:请使用numpy实现一个线性回归模型代码
    • 提问:请使用unittest生成测试用例
    • 提问:请描述下线性回归模型的梯度下降
    • 提问:请描述下线性回归模型的数学推导
    • 提问:线性回归模型的损失函数是什么?
    • 提问:请给出线性回归模型的损失函数的偏导数:
    • 提问:请给出线性回归模型损失函数偏导数使用链式求导的推导过程

提问:请使用numpy实现一个线性回归模型代码

回答:

import numpy as np
class LinearRegression:
    def __init__(self, lr=0.01, n_iters=1000):
        # 初始化函数,设置学习率和迭代次数
        self.lr = lr
        self.n_iters = n_iters
        self.weights = None
        self.bias = None
    def fit(self, X, y):
        # 训练函数,输入X和y,更新权重和偏置
        n_samples, n_features = X.shape
        self.weights = np.zeros(n_features)
        self.bias = 0
        for _ in range(self.n_iters):
            y_predicted = np.dot(X, self.weights) + self.bias
            # 计算梯度
            dw = (1 / n_samples) * np.dot(X.T, (y_predicted - y))
            db = (1 / n_samples) * np.sum(y_predicted - y)
            # 更新权重和偏置
            self.weights -= self.lr * dw
            self.bias -= self.lr * db
            self.weights -= self.lr * dw
            self.bias -= self.lr * db
    def predict(self, X):
        # 预测函数,输入X,输出预测值
        y_predicted = np.dot(X, self.weights) + self.bias
        return y_predicted

提问:请使用unittest生成测试用例

import unittest
class TestLinearRegression(unittest.TestCase):
    def test_fit(self):
        X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
        y = np.array([6, 15, 24])
        lr = LinearRegression()
        lr.fit(X, y)
        self.assertEqual(lr.weights.tolist(), [3, 3, 3])
        self.assertEqual(lr.bias, 0)
    def test_predict(self):
        X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
        y = np.array([6, 15, 24])
        lr = LinearRegression()
        lr.fit(X, y)
        y_pred = lr.predict(X)
        self.assertEqual(y_pred.tolist(), [6, 15, 24])
if __name__ == '__main__':
    unittest.main()

提问:请描述下线性回归模型的梯度下降

回答:
梯度下降是一种优化算法,用于最小化损失函数。在线性回归模型中,我们使用梯度下降来找到最小化平方误差的最佳拟合直线。具体来说,我们计算损失函数对每个参数的偏导数,然后将其乘以学习率并从当前参数值中减去。这个过程重复进行,直到损失函数收敛或达到预定的迭代次数。这样,我们就可以找到最小化平方误差的最佳拟合直线。

提问:请描述下线性回归模型的数学推导

回答:
在线性回归中,我们的目标是找到一条直线,使得所有数据点到该直线的距离之和最小。这个距离可以用平方误差来表示。因此,我们的目标是最小化平方误差。假设我们的模型为y = wx + b,其中w是斜率,b是截距。我们可以使用梯度下降来找到最小化平方误差的最佳拟合直线。具体来说,我们计算损失函数对w和b的偏导数,然后将其乘以学习率并从当前w和b的值中减去。这个过程重复进行,直到损失函数收敛或达到预定的迭代次数。最终,我们就可以找到最小化平方误差的最佳拟合直线。

提问:线性回归模型的损失函数是什么?

回答:
平方误差损失函数

提问:请写出线性回归模型的损失函数

J(w,b) = 1/2m * sum((y_pred - y)^2)

提问:请给出线性回归模型的损失函数的偏导数:

回答:

∂J(w,b)/∂w = 1/m * sum((y_pred - y) * x)
∂J(w,b)/∂b = 1/m * sum(y_pred - y)

提问:请给出线性回归模型损失函数偏导数使用链式求导的推导过程

回答:
我们可以使用链式求导法来推导线性回归模型损失函数的偏导数计算过程。首先,我们计算损失函数对预测值y_pred的偏导数:

∂J/∂y_pred = 1/m * sum(y_pred - y)

然后,我们计算y_pred对w和b的偏导数:

∂y_pred/∂w = x
∂y_pred/∂b = 1

接下来,我们可以使用链式求导法来计算损失函数对w和b的偏导数:

∂J/∂w = ∂J/∂y_pred * ∂y_pred/∂w = 1/m * sum((y_pred - y) * x)
∂J/∂b = ∂J/∂y_pred * ∂y_pred/∂b = 1/m * sum(y_pred - y)

这样,我们就得到了线性回归模型损失函数的偏导数计算公式。我们可以使用这些公式来实现梯度下降算法,找到最小化平方误差的最佳拟合直线。

–end–