Machine Learning Park -- 线性回归

1 Linear Regression

线性回归
本文Github仓库已经同步文章与代码https://github.com/Gary-code/Machine-Learning-Park/tree/main/Part1%20Machine%20Learning%20Basics

代码说明:

文件名 说明
numpy_version numpy实现使用data.txt数据集
pytorch_version 包括使用pytorch从零开始实现和调用包实现

1.1 Linear Algebra

线性代数

矩阵与向量

X = [ 1402 191 1371 821 949 1437 147 1448 ] X = \left[\begin{array}{cc} 1402 & 191 \\ 1371 & 821 \\ 949 & 1437 \\ 147 & 1448 \end{array}\right] X=1402137194914719182114371448

一般默认都以列向量为研究对象

  • n × 1 n \times 1 n×1的矩阵

y = [ 460 232 315 178 ] y=\left[\begin{array}{l} 460 \\ 232 \\ 315 \\ 178 \end{array}\right] y=460232315178

运算
  • 矩阵乘法

Machine Learning Park -- 线性回归_第1张图片

  • 矩阵乘法的特征

    • 不满足交换律
    • 满足结合律

    A × B ≠ B × A A × B × C = A × ( B × C ) A \times B \neq B \times A \\ A \times B \times C = A \times (B \times C) A×B=B×AA×B×C=A×(B×C)

  • 单位矩阵: Identity Matrix

I 4 × 4 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] I_{4 \times 4} = \left[\begin{array}{llll} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right] I4×4=1000010000100001

A A − 1 = A − 1 A = I A I = I A = A AA^{-1} = A{-1}A = I \\ AI = IA = A AA1=A1A=IAI=IA=A

逆与转置
  • 矩阵的逆:

    • 如矩阵是一个 × 矩阵(方阵),如果有逆矩阵,则: − 1 ^{-1} AA1 = − 1 ^{−1} A1A =
  • 矩阵的转置:

    • ∣ a b c d e f ∣ T = ∣ a c e b d f ∣ \left|\begin{array}{ll} a & b \\ c & d \\ e & f \end{array}\right|^{T}=\left|\begin{array}{lll} a & c & e \\ b & d & f \end{array}\right| acebdfT=abcdef

    • 基本性质
      ( A ± B ) T = A T ± B T ( A × B ) T = B T × A T ( A T ) T = A ( K A ) T = K A T \begin{aligned} &(A \pm B)^{T}=A^{T} \pm B^{T} \\ &(A \times B)^{T}=B^{T} \times A^{T} \\ &\left(A^{T}\right)^{T}=A \\ &(K A)^{T}=K A^{T} \end{aligned} (A±B)T=AT±BT(A×B)T=BT×AT(AT)T=A(KA)T=KAT

1.2 线性回归模型

表达式

Y = W X + b Y = WX + b Y=WX+b

w w w为变量 X X X的系数, b b b为偏置项。

损失函数

Loss Function – MSE

J = 1 2 m ∑ i = 1 m ( y i − y ) 2 J =\frac{1}{2m}\sum_{i=1}^{m}(y^i - y)^2 J=2m1i=1m(yiy)2

m m m为样本的个数

模型

Hypothesis: h ( X ) = b + W X \quad h(X)=b+WX h(X)=b+WX

Parameters: W , b W, b W,b

Cost Function: J = 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 \quad J=\frac{1}{2 m} \sum_{i=1}^{m}\left(h\left(x^{(i)}\right)-y^{(i)}\right)^{2} J=2m1i=1m(h(x(i))y(i))2

Goal: minimize ⁡ b , W J \quad \operatorname{minimize}_{b, W} J minimizeb,WJ

求解
  • 梯度下降算法

Machine Learning Park -- 线性回归_第2张图片

在梯度下降算法中,还有一个更微妙的问题,梯度下降中,我们要更新 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 ,当 = 0 和 = 1时,会产生更新,所以你将更新 ( θ 0 ) (\theta_0) J(θ0) ( θ 1 ) (\theta_1) J(θ1)。实现梯度下降算法的微妙之处是,在这个表达式中,如果你要更新这个等式,你需要同时更新 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1,我的意思是在这个等式中,我们要这样更新: θ 0 : = θ 0 \theta_0:= \theta_0 θ0:=θ0 ,并更新 θ 1 : = θ 1 \theta_1:= \theta_1 θ1:=θ1。实现方法是:你应该计算公式右边的部分,通过那一部分计算出 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1的值,然后同时更新 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1

  • α \alpha α是学习率,用来控制下降你要迈出多大的步子

  • 完成一轮之后,更新两个系数 θ 0 : = θ 0 \theta_0:= \theta_0 θ0:=θ0 θ 1 : = θ 1 \theta_1:= \theta_1 θ1:=θ1

    • 记住做完一轮才更新,不要一个一个系数轮着来更新
  • 如果太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。

  • 如果太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来

Machine Learning Park -- 线性回归_第3张图片

  • 批量梯度下降
    • 指的是在梯度下降的每一步中,它是指在每一次迭代时使用所有样本来进行梯度的更新。

θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} θj:=θjαm1i=1m(hθ(x(i))y(i))xj(i)

对比随机梯度下降

  • 每次迭代使用一个样本来对参数进行更新。使得训练速度加快。
  • r e p e a t repeat repeat{
       for i = 1 , . . . , m i=1,...,m i=1,...,m{

θ j : = θ j − α ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ( f o r j = 0 , 1 ) \theta_j := \theta_j -\alpha (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} (for j =0,1) θj:=θjα(hθ(x(i))y(i))xj(i)(forj=0,1)
}

}

进阶
  • 尺度缩放

在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度(范围类似),这将帮助梯度下降算法更快地收敛。
X = X n − μ n s n X_ = \frac{X_n-\mu_n}{s_n} Xn=snXnμn
其中 Font metrics not found for font: .是平均值, _ sn是标准差(即 m a x − m i n max - min maxmin)。

  • 学习率 α \alpha α

    • 通常可以考虑尝试些学习率: α = 0.01 , 0.03 , 0.1 , 0.3 , 1 , 3 , 10 \alpha = 0.01, 0.03 ,0.1, 0.3 ,1, 3, 10 α=0.01,0.03,0.1,0.3,1,3,10
  • 正规方程

normal Equation

θ = ( ) − 1 \theta = (^)^{-1}^ θ=(XTX)1XTy

使用python实现如下:

import numpy as np
def normalEqn(X, y):
    theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X 等价于 X.T.dot(X)
    return theta

注意!!:对于那些不可逆的矩阵,正规方程方法是不能用的。

在大规模的数据时候优先使用梯度下降而非正规方程

  • 正则项

J = J 原 + λ ∑ j = 1 m θ j 2 J 原 = 1 2 m ∑ i = 1 m ( h ( x ( i ) ) − y ( i ) ) 2 J = J_{原} + \lambda \sum_{j=1}^{m}\theta_j^2\\ J_{原} = \frac{1}{2 m} \sum_{i=1}^{m}\left(h\left(x^{(i)}\right)-y^{(i)}\right)^{2} J=J+λj=1mθj2J=2m1i=1m(h(x(i))y(i))2

为了防止过拟合。

你可能感兴趣的:(Machine,Learning,Park,ML)