文章目录
当你迷茫的时候,请回头看看 目录大纲,也许有你意想不到的收获
前言
入门 AI 不容易,先掌握 机器学习 中的一些理论,再是 深度学习,一堆算法,数学公式,矩阵概率论等理论。我也看了一些机器学习的书籍,可谓是五花八门,什么牛鬼蛇神都有,大多我都不太满意。
专业人写的书 晦涩难懂,理论推导一闪而过,他们会觉得这很易证;业余人写的书 漏洞百出,推导不严谨反而写错,这就给想入门的人雪上加霜。求人不如求己,想了解原理,亲自推算一遍!自己的才是最好的!
一元线性回归
先从我们熟悉的地方开始,这是一条 直线 的函数表达式,我们初中学过:
y = w x + b y=wx+b y=wx+b
函数也是有生活气息的,比如这个 线性函数,y 表示体重,x 表示饭量,那这条直线可以这样说:假如有只小猪重 1 斤(b=1),根据我的观察,它大概吃一碗饭就长一斤肉(w=1)。
那么当它吃完 3 碗饭时(x=3),小猪重 y=x+1=3+1= 4 斤,来做个统计:
| 饭量 x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 理论重量 y ^ \hat{y} y^ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 实际重量 y | 1 | 2.11 | 2.98 | 4.32 | 5.21 | 6.01 | 7.33 | 7.99 | 9.12 | 10.44 |
| 偏差 ∣ y ^ − y ∣ |\hat{y}-y | ∣y^−y∣ | 0 | 0.11 | 0.02 | 0.32 | 0.21 | 0.01 | 0.33 | 0.01 | 0.12 | 0.44 |
理想很丰满,现实很骨感,理论值总是非常完美的,但实际上是 有零有整 的,会出现一些 偏差,这都是正常的,比如今天吃一碗饭不够份量,小猪吃的洒了一些......
偏差
怎么验证理论与实际的符合度呢?也就是小猪成长的重量是否就是 y = x + 1 y=x+1 y=x+1 这个规律呢?会不会是其他的函数呢?
那么这里就引入了 残差平方和 RSS,假如总共有 m 个样本,在第 i 个样本中, y i ^ \hat{y_i} yi^ 为第 i 个样本数据预测值 ( y i ^ = w x i + b \hat{y_i}=wx_i+b yi^=wxi+b), y i y_i yi 为第 i 个样本数据真实值,RSS 计算公式为:
R S S = ∑ i = 1 m ( y i ^ − y i ) 2 RSS=\sum\limits_{i=1}^{m}{(\hat{y_i}-y_i)^2}\\[10pt] RSS=i=1∑m(yi^−yi)2
以上面例子来说,我观察了 10 次,共有 10 个样本(m=10),第 i 个样本观测值可以用 ( x i , y i ) (x_i , y_i) (xi,yi) 表示:
P 1 ( 0 , 1 ) , P 2 ( 1 , 2.11 ) , P 3 ( 2 , 2.98 ) , P 4 ( 3 , 4.32 ) , ... ... , P 10 ( 9 , 10.44 ) P_1(0,1),P_2(1,2.11),P_3(2,2.98),P_4(3,4.32),......,P_{10}(9,10.44) P1(0,1),P2(1,2.11),P3(2,2.98),P4(3,4.32),......,P10(9,10.44)
R S S = ∑ i = 1 m ( y i ^ − y i ) 2 = ∑ i = 1 m ( w x i + b − y i ) 2 RSS=\sum\limits_{i=1}^{m}{(\hat{y_i}-y_i)^2} =\sum\limits_{i=1}^{m}{(wx_i+b-y_i)^2} RSS=i=1∑m(yi^−yi)2=i=1∑m(wxi+b−yi)2
只要找到一条直线,也就是确定w和b的值,令残差平方和 RSS 达到最小,那么就可以说这条直线非常拟合现实情况了。
最小二乘法
求解 RSS 最小 就是 最小二乘法,也就是 最小残差平方和。
这里解释一下:
二乘:二次方,平方,这里也就是残差平方和
我还特意查了一下,京师大学堂(后来的北京大学)数学系的 顾澄 老前辈1910 年翻译的,这就属于世纪互动了!
y i ^ = w x i + b R S S = ∑ i = 1 m ( y i ^ − y i ) 2 \hat{y_i}=wx_i+b \\[10pt] RSS=\sum\limits_{i=1}^{m}{(\hat{y_i}-y_i)^2}\\[10pt] yi^=wxi+bRSS=i=1∑m(yi^−yi)2
为了求导方便少带系数,令:
E = 1 2 R S S = 1 2 ∑ i = 1 m ( y i ^ − y i ) 2 u i = y i ^ − y i = w x i + b − y i E = 1 2 ∑ i = 1 m u i 2 E=\frac{1}{2}{RSS}=\frac{1}{2}\sum\limits_{i=1}^{m}{(\hat{y_i}-y_i)^2}\\[10pt] u_i={\hat{y_i}-y_i}=wx_i+b-y_i\\[10pt] E=\frac{1}{2}\sum\limits_{i=1}^{m}{u_i}^2\\[10pt] E=21RSS=21i=1∑m(yi^−yi)2ui=yi^−yi=wxi+b−yiE=21i=1∑mui2
提前准备一下求导,后面会用到:
∂ E ∂ u i = u i ∂ u i ∂ w = x i ∂ u i ∂ b = 1 \frac{\partial E}{\partial u_i}=u_i \\[10pt] \frac{\partial u_i}{\partial w}=x_i \\[10pt] \frac{\partial u_i}{\partial b}=1 \\[10pt] ∂ui∂E=ui∂w∂ui=xi∂b∂ui=1
对于 w,b 变量来说,当 E 取到最小值时,也就是处于抛物面的谷底:

此时:
∂ E ∂ w = 0 ∂ E ∂ b = 0 \frac{\partial E}{\partial w}=0\\[10pt] \frac{\partial E}{\partial b}=0\\[10pt] ∂w∂E=0∂b∂E=0
说明什么?人生低谷就是彻底躺平
好了,下面我们就用 偏导 为 0 的条件来求解 w 和 b
偏导
它们有如下的传递关系:
w → y i ^ → u i → E b → y i ^ → u i → E w \rightarrow \hat{y_i} \rightarrow u_i \rightarrow E\\[10pt] b \rightarrow \hat{y_i} \rightarrow u_i \rightarrow E\\[10pt] w→yi^→ui→Eb→yi^→ui→E
当 w 或 b 增加一点点(eg. Δ w \Delta w Δw),最终就会引起 E 的变化( Δ E \Delta E ΔE),偏导就是保持其他变量不变,针对某个变量变化,看它结果变化,比值就是偏导,类似杠杆效应:
∂ E ∂ w = lim Δ x → 0 Δ E Δ w ∂ E ∂ b = lim Δ x → 0 Δ E Δ b \frac{\partial E}{\partial w}=\lim_{\Delta x \to 0} \frac{\Delta E}{\Delta w}\\[10pt] \frac{\partial E}{\partial b}=\lim_{\Delta x \to 0} \frac{\Delta E}{\Delta b}\\[10pt] ∂w∂E=Δx→0limΔwΔE∂b∂E=Δx→0limΔbΔE
根据链式求导法则:
∂ E ∂ w = ∑ i = 1 m ∂ E ∂ u i ⋅ ∂ u i ∂ w = ∑ i = 1 m u i ⋅ x i = ∑ i = 1 m ( w x i + b − y i ) ⋅ x i = w ∑ i = 1 m x i 2 + b ∑ i = 1 m x i − ∑ i = 1 m x i y i ∂ E ∂ b = ∑ i = 1 m ∂ E ∂ u i ⋅ ∂ u i ∂ b = ∑ i = 1 m u i = ∑ i = 1 m ( w x i + b − y i ) = w ∑ i = 1 m x i + b m − ∑ i = 1 m y i \frac{\partial E}{\partial w} =\sum\limits_{i=1}^{m}{\frac{\partial E}{\partial u_i}} \cdot {\frac{\partial u_i}{\partial w}} =\sum\limits_{i=1}^{m}{u_i\cdot x_i}\\[10pt] =\sum\limits_{i=1}^{m}{(wx_i+b-y_i)\cdot x_i}\\[10pt] =w\sum\limits_{i=1}^{m}{x_i}^2 +b\sum\limits_{i=1}^{m}{x_i} -\sum\limits_{i=1}^{m}{x_i y_i}\\[10pt] \frac{\partial E}{\partial b} =\sum\limits_{i=1}^{m}{\frac{\partial E}{\partial u_i}} \cdot {\frac{\partial u_i}{\partial b}} =\sum\limits_{i=1}^{m}{u_i}\\[10pt] =\sum\limits_{i=1}^{m}{(wx_i+b-y_i)}\\[10pt] =w\sum\limits_{i=1}^{m}{x_i}+bm-\sum\limits_{i=1}^{m}y_i\\[10pt] ∂w∂E=i=1∑m∂ui∂E⋅∂w∂ui=i=1∑mui⋅xi=i=1∑m(wxi+b−yi)⋅xi=wi=1∑mxi2+bi=1∑mxi−i=1∑mxiyi∂b∂E=i=1∑m∂ui∂E⋅∂b∂ui=i=1∑mui=i=1∑m(wxi+b−yi)=wi=1∑mxi+bm−i=1∑myi
偏导为 0 得:
∵ ∂ E ∂ w = 0 ∴ w ∑ i = 1 m x i 2 + b ∑ i = 1 m x i = ∑ i = 1 m x i y i ∵ ∂ E ∂ b = 0 ∴ w ∑ i = 1 m x i + b m = ∑ i = 1 m y i \because \frac{\partial E}{\partial w}=0\\[10pt] \therefore w\sum\limits_{i=1}^{m}{x_i}^2 +b\sum\limits_{i=1}^{m}{x_i} =\sum\limits_{i=1}^{m}{x_i y_i}\\[10pt] \because \frac{\partial E}{\partial b}=0\\[10pt] \therefore w\sum\limits_{i=1}^{m}{x_i}+bm=\sum\limits_{i=1}^{m}y_i\\[10pt] ∵∂w∂E=0∴wi=1∑mxi2+bi=1∑mxi=i=1∑mxiyi∵∂b∂E=0∴wi=1∑mxi+bm=i=1∑myi
一切皆矩阵
上面结果式可以用一个矩阵来表示:
∑ i = 1 m x i 2 ∑ i = 1 m x i ∑ i = 1 m x i m \] \[ w b \] = \[ ∑ i = 1 m x i y i ∑ i = 1 m y i \] % 方括号 \\begin{bmatrix} \\sum\\limits_{i=1}\^{m}{x_i}\^2 \& \\sum\\limits_{i=1}\^{m}{x_i} \\\\\[10pt\] \\sum\\limits_{i=1}\^{m}{x_i} \& m \\end{bmatrix} \\begin{bmatrix} w\\\\\[10pt\] b \\end{bmatrix} =\\begin{bmatrix} \\sum\\limits_{i=1}\^{m}{x_i y_i}\\\\\[10pt\] \\sum\\limits_{i=1}\^{m}y_i \\end{bmatrix} i=1∑mxi2i=1∑mxii=1∑mxim wb = i=1∑mxiyii=1∑myi 令: A = \[ ∑ i = 1 m x i 2 ∑ i = 1 m x i ∑ i = 1 m x i m \] A=\\begin{bmatrix} \\sum\\limits_{i=1}\^{m}{x_i}\^2 \& \\sum\\limits_{i=1}\^{m}{x_i} \\\\\[10pt\] \\sum\\limits_{i=1}\^{m}{x_i} \& m \\end{bmatrix}\\\\\[10pt\] A= i=1∑mxi2i=1∑mxii=1∑mxim 如果 A 可逆, 可以直接求出 w,b ∵ A \[ w b \] = \[ ∑ i = 1 m x i y i ∑ i = 1 m y i \] ∴ \[ w b \] = A − 1 \[ ∑ i = 1 m x i y i ∑ i = 1 m y i \] \\because A \\begin{bmatrix} w\\\\\[10pt\] b \\end{bmatrix} =\\begin{bmatrix} \\sum\\limits_{i=1}\^{m}{x_i y_i}\\\\\[10pt\] \\sum\\limits_{i=1}\^{m}y_i \\end{bmatrix}\\\\\[10pt\] \\therefore \\begin{bmatrix} w\\\\\[10pt\] b \\end{bmatrix} =A\^{-1} \\begin{bmatrix} \\sum\\limits_{i=1}\^{m}{x_i y_i}\\\\\[10pt\] \\sum\\limits_{i=1}\^{m}y_i \\end{bmatrix} ∵A wb = i=1∑mxiyii=1∑myi ∴ wb =A−1 i=1∑mxiyii=1∑myi 厉害吧? 线性回归的问题求解通过 `矩阵运算` 就可以求出,而矩阵又可以通过 `样本数据观察` 得出,啊,瞪眼法,太美妙了! ### 最小二乘法实战 #### 准备数据 准备生成一些随机数据,大致呈线性回归 ```python import numpy as np import matplotlib.pyplot as plt # 生成一些随机数据 np.random.seed(0) x = 2 * np.random.rand(100, 1) # 理论上 w=3, b=4, 但有随机变量的作用, w,b 只能是约等于 y = 4 + 3 * x + np.random.randn(100, 1) # 可视化数据 plt.scatter(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('Data') plt.show() ```  #### 计算求解 ```python # A 矩阵 [[a11,a12],[a21,a22]] a11=np.sum(x**2) a12=np.sum(x) a21=a12 a22=len(x) # Y 矩阵 y1=np.sum(x*y) y2=np.sum(y) A=np.asarray([[a11,a12],[a21,a22]]) IA=np.linalg.inv(A) Y=np.asarray([y1,y2]) W = np.dot(IA, Y) ``` #### 代入验证 ```python w=W[0] b=W[1] # 对应解示例: (2.968467510701019, 4.222151077447229) print(w,b) y_pred = w * x + b # 可视化数据 plt.scatter(x, y) plt.plot(x, y_pred, color='red') plt.xlabel('x') plt.ylabel('y') plt.title('Data') plt.show() ``` 