📜  门| GATE-CS-2016(套装2)|第 45 题(1)

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

GATE-CS-2016 (套装2) | 第 45 题

本题是关于编写程序实现机器学习中的线性回归问题。

问题描述

给定一个包含 $N$ 个观测值的数据集 $D = {(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)}$,其中 $x_i \in \mathbb{R}^d$ 为 $d$ 维特征向量,$y_i \in \mathbb{R}$ 为目标值。则线性回归的任务是寻找一个在给定数据集上拟合最佳的线性模型 $f(x) = w^\top x + b$,其中 $w \in \mathbb{R}^d$ 为权重向量,$b \in \mathbb{R}$ 为截距项。

具体来说,线性回归要求在给定数据集 $D$ 上最小化平方损失函数 $L(w, b) = \sum_{i=1}^{N}(y_i - f(x_i))^2$,即使得预测值 $(w^\top x_i + b)$ 与实际值 $y_i$ 的差距最小化。

实现要求

请实现一个函数 linear_regression(train_features: List[List[float]], train_targets: List[float]) -> Tuple[List[float], float],该函数接收两个参数:

  • train_features 为一个大小为 $n \times d$ 的矩阵,其中第 $i$ 行为第 $i$ 个样本的特征向量 $x_i$;
  • train_targets 为一个长度为 $n$ 的向量,其中第 $i$ 个元素为第 $i$ 个样本的目标值 $y_i$。

该函数需要返回一个包含两个元素的元组 (w, b)

  • w 为一个长度为 $d$ 的向量,其中第 $i$ 个元素为 $\hat{w}_i$,即线性回归模型在训练集上学习得到的权重;
  • b 为一个标量,即线性回归模型在训练集上学习得到的截距项。

**注意:**为了方便起见,你可以在训练数据上加上一个全为 $1$ 的特征,即将原来 $d$ 维的特征向量 $x_i$ 变为 $(d+1)$ 维的向量 $\tilde{x}_i = [1, x_i^\top]^\top$,并将权重向量 $w$ 和截距项 $b$ 同时加到 $\tilde{x}_i$ 中。这样做的主要目的是方便模型求解。

示例

以下是一个简单的示例,展示了如何使用你的程序完成线性回归任务:

>>> train_features = [[0, 0], [1, 1], [2, 2], [3, 3], [4, 4]]
>>> train_targets = [0.1, 1.1, 2.1, 3.1, 4.1]
>>> linear_regression(train_features, train_targets)
([0.1, 0.9999999999999998], -0.049999999999998934)

上述示例中,train_featurestrain_targets 分别为输入的训练数据。函数 linear_regression() 返回一个二元组 (w, b),其中 wb 分别为线性回归模型在训练集上学习到的权重和截距项。

解答

请参考以下 Python3 代码,其中 linear_regression() 函数使用了最小二乘法的方法求解线性回归的闭式解。代码中使用了 NumPy 库实现矩阵计算。

from typing import List, Tuple
import numpy as np

def linear_regression(train_features: List[List[float]], train_targets: List[float]) -> Tuple[List[float], float]:
    # 将训练特征加上全为1的特征,并转换为NumPy矩阵
    X = np.hstack((np.ones((len(train_features), 1)), np.array(train_features)))
    y = np.array(train_targets).reshape(-1, 1)

    # 使用最小二乘法求解闭式解
    w = np.linalg.inv(X.T @ X) @ X.T @ y
    b = w[0, 0]
    w = w[1:].flatten().tolist()

    return w, b

上述代码中,我们使用了最小二乘法的方法求解了线性回归的闭式解(也称作正规方程解)。值得注意的是,为了方便起见,我们在训练数据上加上了一个全为1的特征,并将权重向量 $w$ 和截距项 $b$ 同时加到特征向量中。这样做不会影响模型预测结果,而且能够使求解过程更加简单。

使用上述代码实现的线性回归模型已经能够完成大部分线性回归任务。当然,如果你希望更加灵活地控制模型的学习过程,并且能够应对更加复杂的模型和数据,你还需要学习更加高级的机器学习算法。