线性回归
本文Github仓库已经同步文章与代码https://github.com/Gary-code/Machine-Learning-Park/tree/main/Part1%20Machine%20Learning%20Basics
代码说明:
文件名 | 说明 |
---|---|
numpy_version | numpy实现使用data.txt数据集 |
pytorch_version | 包括使用pytorch从零开始实现和调用包实现 |
线性代数
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⎦⎥⎥⎤
矩阵乘法的特征
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 AA−1=A−1A=IAI=IA=A
矩阵的逆:
矩阵的转置:
∣ 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| ∣∣∣∣∣∣acebdf∣∣∣∣∣∣T=∣∣∣∣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
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=1∑m(yi−y)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=2m1∑i=1m(h(x(i))−y(i))2
Goal: minimize b , W J \quad \operatorname{minimize}_{b, W} J minimizeb,WJ
在梯度下降算法中,还有一个更微妙的问题,梯度下降中,我们要更新 θ 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
如果太小了,即我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
如果太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来
θ 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=1∑m(hθ(x(i))−y(i))xj(i)
对比随机梯度下降
θ 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 max−min)。
学习率 α \alpha α
正规方程
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=1∑mθj2J原=2m1i=1∑m(h(x(i))−y(i))2
为了防止过拟合。