机器学习代码基础——ML1 使用正规方程的线性回归

发布于:2025-04-07 ⋅ 阅读:(70) ⋅ 点赞:(0)

ML1 使用正规方程的线性回归

牛客网链接

描述

编写一个使用正规方程执行线性回归的 Python 函数。
函数输入是一个矩阵 X(特征)和向量 y(目标),返回线性回归模型的系数。
最后的答案四舍五入保留小数点后四位。

输入描述:

第1行输入矩阵 X,第2行输入向量 y。

输出描述:

输出线性回归模型的系数。函数返回类型是列表类型,第一个是权重,第二个是偏置。

输入: 
[[1, 1], [1, 2], [1, 3]]
[2, 2, 3]

输出:

[1.3333, 0.5]
import numpy as np
def linear_regression_normal_equation(X: list[list[float]], y: list[float]) -> list[float]:
    # 实现代码
    theta = (np.linalg.inv(x.T@x)@x.T@y).T.round(4).reshape(-1).tolist()
    return theta


if __name__ == "__main__":
    import ast
    x = np.array(ast.literal_eval(input()))
    y = np.array(ast.literal_eval(input())).reshape(-1, 1)

    # Perform linear regression
    coefficients = linear_regression_normal_equation(x, y)

    # Print the coefficients
    print(coefficients)

正规方程法求解

将训练数据表示成矩阵形式
X = [ x 1 T x 2 T ⋮ x n T ] [ x 1 , 0 x 1 , 1 ⋯ x 1 , p x 2 , 0 x 2 , 1 ⋯ x 2 , p ⋮ ⋮ ⋱ ⋮ x n , 0 x n , 1 ⋯ x n , p ] Y = [ y 1 y 2 ⋮ y n ] \mathbf{X} = \begin{bmatrix} \mathbf{x}_1^T \\ \mathbf{x}_2^T \\ \vdots \\ \mathbf{x}_n^T \\ \end{bmatrix} \begin{bmatrix} x_{1,0} & x_{1,1} & \cdots & x_{1,p} \\ x_{2,0} & x_{2,1} & \cdots & x_{2,p} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n,0} & x_{n,1} & \cdots & x_{n,p} \\ \end{bmatrix} \quad \mathbf{Y} = \begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_n \\ \end{bmatrix} X= x1Tx2TxnT x1,0x2,0xn,0x1,1x2,1xn,1x1,px2,pxn,p Y= y1y2yn

x 1 T = [ 1 , x 1 , 1 , x 1 , 2 , . . . , x 1 , p ] \mathbf{x_1}^T=[1,x_{1,1},x_{1,2},...,x_{1,p}] x1T=[1,x1,1,x1,2,...,x1,p]

损失函数 J ( θ ) J(\theta) J(θ)可变为
J ( θ ) = 1 2 ∣ ∣ Y − Y ^ ∣ ∣ 2 = 1 2 ∣ ∣ Y − X θ ∣ ∣ 2 J(\theta)=\frac{1}{2}||Y-\hat Y||^2=\frac{1}{2}||Y-X\theta||^2 J(θ)=21∣∣YY^2=21∣∣Y2
使用矩阵表达形式转化损失函数
J ( θ ) = 1 2 ∣ ∣ Y − X θ ∣ ∣ 2 = 1 2 ( X θ − Y ) T ( X θ − Y ) = 1 2 ( θ T X T X θ − 2 Y T X θ + Y T Y ) ( 利用了 a T b = b T a 求导结果 ) \begin{equation} \begin{split} J(\theta)&=\frac{1}{2}||Y-X\theta||^2\\ &=\frac{1}{2}(X\theta-Y)^T(X\theta-Y)\\ &=\frac{1}{2}(\theta ^TX^TX\theta-2Y^TX\theta+Y^TY)(利用了a^Tb=b^Ta求导结果) \end{split} \end{equation} J(θ)=21∣∣Y2=21(Y)T(Y)=21(θTXT2YT+YTY)(利用了aTb=bTa求导结果)
最小化损失函数𝐽(𝜃),可通过令梯度= 𝟎(𝑝+1维的零向量)实现:

image-20220317095048551

利用公式
∂ x T B x ∂ x = ( B + B T ) x ∂ x T a ∂ x = ∂ a T x ∂ x = a \frac{\partial x^TBx}{\partial x}=(B+B^T)x\\ \frac{\partial x^Ta}{\partial x}=\frac{\partial a^Tx}{\partial x}=a xxTBx=(B+BT)xxxTa=xaTx=a
可得到
∇ θ J ( θ ) = X T X θ − ( Y T X ) T = X T X θ − X T Y = 0 \nabla_\theta J(\theta)=X^TX\theta-(Y^TX)^T=X^TX\theta-X^TY=0 θJ(θ)=XT(YTX)T=XTXTY=0
🔍正规方程为: X T X θ = X T Y X^TX\theta=X^TY XT=XTY,得到解: θ ∗ = ( X T X ) − 1 X T Y \theta^*=(X^TX)^{-1}X^TY θ=(XTX)1XTY(假设 X T X X^TX XTX可逆)


网站公告

今日签到

点亮在社区的每一天
去签到