线性回归及实现
一年多前,《修真聊天群》更新看完了,在书荒引发的无聊情绪推动下学习了 Keras,用 LSTM 生成了大段无法看的《伪*修真聊天群》,没有耐心好好炼丹就没有再接触过深度学习的知识点,偶尔无聊看看聚宽上的文章也都是随机森林
和隐马尔科夫模型
等传统机器学习算法。
近期 gayhub 上榜了一个《TensorFlow 2.0深度学习开源书》,正巧之后的新工作也与 TensorFlow 有些许关联,就趁机学习一下。
看了教程打算手撸下公式推导及函数实现。( <– 抄袭狗 )
1.线性回归
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w’x+e,e为误差服从均值为0的正态分布。 —- 百度百科
1.1 二元一次方程
当我们有个函数为 $y=wx+b$ 并且知道本函数穿过的两个点时我们可以轻易的算出函数中的常数$w$和$b$。
假设有两点: $$ x_1=3,y_1=7 \ x_2=4,y_2=6 \ $$
则其解为: $$ 7=3w+b \ 6=4w+b \ w=-1,b=10 $$
其曲线为:
import matplotlib.pyplot as plt
plt.plot([3,4],[7,6])
plt.show() # show figure
1.2 观测误差
但是当我们的观测点存在误差时,公式变为了 $y=wx+b+\epsilon,\epsilon\in\mathcal{N}(\mu,\sigma^2)$. 此时我们无法用过之前的解法解出$w$和$b$的值。代码中采用random.random()-0.5
模拟$\epsilon$,我们会发现无论取哪两点去计算$w$和$b$都会导致函数存在巨大的偏离。我们只能通过回归分析去计算最佳的$w$和$b$。
import matplotlib.pyplot as plt
import random
x=range(0, 10)
plt.plot(x,[-1*i+10+random.random()-0.5 for i in x], 'o')
plt.plot(x,[-1*i+10 for i in x])
plt.show() # show figure
1.3 损失函数(loss)
此时我们引入了损失函数来计算$w$和$b$的好坏,在此例中采用均方误差(MSE)来评判: $$ \mathscr{L}=\frac{\sum_{i=1}^{n}(wx_i+b-y_i)^2}n $$
我们接下来的工作就是找到使$\mathscr{L}$最小的$w$和$b$。
1.4 梯度下降及优化函数
我们通过寻找$\mathscr{L}$最小值来确定最佳的$w$和$b$,此时可通过求极值的方式来寻找损失函数的极小值。损失函数为三元方程,其偏导数即为梯度,我们用学习率(lr)
来缩放梯度,通过不断的减去梯度来计算$w$和$b$,将其优化到最佳。
$$
w’=w-\eta\frac{\partial \mathscr{L}}{\partial w} \
b’=b-\eta\frac{\partial \mathscr{L}}{\partial b} \
\eta\text{为学习率 lr}
$$
解开偏导数以备后用: $$ \begin{align} \frac{\partial \mathscr{L}}{\partial w} & = \frac{\partial \frac{\sum_{i=1}^{n}(wx_i+b-y_i)^2}n}{\partial w} \ & = \frac{2}{n}\sum_{i=1}^{n} (wx_i+b-y_i)\frac{\partial (wx_i+b-y_i)}{\partial w} \ & = \frac{2}{n}\sum_{i=1}^{n} (wx_i+b-y_i)x_i \end{align} $$ $$ \begin{align} \frac{\partial \mathscr{L}}{\partial b} & = \frac{\partial \frac{\sum_{i=1}^{n}(bx_i+b-y_i)^2}n}{\partial b} \ & = \frac{2}{n}\sum_{i=1}^{n} (bx_i+b-y_i)\frac{\partial (bx_i+b-y_i)}{\partial b} \ & = \frac{2}{n}\sum_{i=1}^{n} (bx_i+b-y_i) \end{align} $$