机器学习2--多元回归

60 阅读1分钟
original_x = [[10.0,4.0], [8.0,5.0], [13.0,4.0], [9.0,9.0], [11.0,14.0], [14.0,12.0], [6.0,13.0], [4.0,16.0], [12.0,18.0], [7.0,20.0], [5.0,24.0]]
original_y = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]

如果 original_x 的每一项有多个参数(即特征),那么问题就变成了 多元线性回归。多元线性回归的目标是找到一组参数 a1,a2,,ana_1, a_2, \dots, a_n 和截距 bb,使得以下线性方程能够最好地拟合数据: y=a1x1+a2x2++anxn+by = a_1 x_1 + a_2 x_2 + \cdots + a_n x_n + b 其中:

  • 输入特征x1,x2,,xnx_1, x_2, \dots, x_n 是各个特征变量;
  • 系数(斜率)a1,a2,,ana_1, a_2, \dots, a_n 是每个特征对应的权重,表示该特征对目标变量 yy 的影响程度;
  • 截距bb 是常数项,表示当所有特征 xix_i 均为 0 时,yy 的预测值。
  • 方程含义: - 多元线性回归通过线性组合多个特征 x1,x2,,xnx_1, x_2, \dots, x_n,加权求和后加上截距 bb,来预测目标变量 yy。 - 每个系数 aia_i 的大小反映了对应特征 xix_iyy 的重要性(正负号表示方向)。

若用矩阵表示,方程可以写成: y=Xθ+by = X \theta + b 其中:

  • XXn×mn \times m 的特征矩阵(mm 为样本数);
  • θ=[a1,a2,,an,b]\theta = [a_1, a_2, \dots, a_n,b] 是参数向量;
  • bb 可通过添加一列全 1 的特征合并到矩阵 XX 中,此时方程变为 y=Xθy = X \theta

对于多元线性回归,参数的求解通常通过矩阵运算来实现。最小二乘法的结果为:

θ=(XX)1Xy\theta = (X^\top X)^{-1} X^\top y

其中:

  • X:这是一个矩阵,通常表示特征矩阵,其中每一行代表一个样本,每一列代表一个特征。
  • Xᵀ:这是矩阵 X 的转置矩阵。转置操作是将矩阵的行和列互换。
  • XᵀX:这是矩阵 X 的转置与矩阵 X 的乘积。
  • (XᵀX)⁻¹:这是矩阵 XᵀX 的逆矩阵。逆矩阵的定义是,如果 A 是一个方阵,且存在矩阵 B 使得 AB = BA = I(其中 I 是单位矩阵),那么 B 就是 A 的逆矩阵,记作 A⁻¹
  • y:这是一个向量,通常表示目标变量或响应变量。

整个公式 θ = (XᵀX)⁻¹ Xᵀ y 是线性回归中用于计算参数向量 θ 的公式。这个公式通过最小化残差平方和来找到最佳的线性模型参数。

import numpy as np
original_x = [[10.0,4.0], [8.0,5.0], [13.0,4.0], [9.0,9.0], [11.0,14.0], [14.0,12.0], [6.0,13.0], [4.0,16.0], [12.0,18.0], [7.0,20.0], [5.0,24.0]]
original_y = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]


def calculate_theta(X, y):
    # 在 X 矩阵中添加一列全为 1 的列来表示截距项
    X = np.c_[np.ones(X.shape[0]), X]
    X_transpose = X.T  # 计算 X 的转置
    X_transpose_X = np.dot(X_transpose, X)  # 计算 X^T * X
    X_transpose_X_inv = np.linalg.inv(X_transpose_X)  # 计算 (X^T * X) 的逆
    X_transpose_y = np.dot(X_transpose, y)  # 计算 X^T * y

    theta = np.dot(X_transpose_X_inv, X_transpose_y)  # 计算 θ
    return theta


# 示例数据
X = np.array(original_x)  # 包含截距项的X矩阵
y = np.array(original_y)

theta = calculate_theta(X, y)
print("参数θ为:\n", theta)

输出结果 参数 θ\theta 为: θ=[2.47328396,0.5228141,0.02550562]\theta = [2.47328396, 0.5228141, 0.02550562] 分别对应 b=2.47328396b = 2.47328396, a1=0.5228141a_1 = 0.5228141, a2=0.02550562a_2 = 0.02550562

当然在一元回归中用矩阵运算也可以得到相同的结果