文章目录
房价预测案例
我们有一些关于房屋尺寸(
f
e
e
t
2
feet^2
feet2)和房屋价格(
p
r
i
c
e
price
price,单位是“千美元”)的数据,假设一位客户问你她的房子能卖多少钱?该如何回答。
我们可以基于现有数据拟合出一条直线(图下蓝色),这条直线就是模型,只要知道客户的房屋尺寸(
f
e
e
t
2
feet^2
feet2),根据模型就能预测一个售卖价格(如房屋尺寸=2104,对应预测价格大概350,与真实售卖价格400略有误差)。
一些术语与标记符号
- 训练集(Training set):为了得到模型需要一些数据对模型进行训练,这部分数据就是训练集;
- 测试集(Testing set):为了评估训练出来的模型好坏,需要一部分未参与训练的数据进行测试,这部分数据称为测试集。
以下是一些常用的数据标记符号
符号 | 解释 |
---|---|
x x x | 输入变量(特征) |
y y y | 输出变量(目标变量) |
m m m | 数据的条数 |
x ( 1 ) = 2104 , y ( 1 ) = 400 x^{(1)}=2104, y^{(1)}=400 x(1)=2104,y(1)=400 | 第1条数据的x为2104,第1条数据的y为400 |
( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)) | 第 i i i条数据 |
y ^ \hat{y} y^ | 模型预测输出的值 |
w w w | 模型参数(权重系数) |
b b b | 模型参数(截距) |
f f f | 模型(函数) |
线性回归(Linear Regression)
模型学习过程:
算法从训练数据集中学习到一个函数
f
f
f(或叫假设),
f
f
f的作用是只要给它一个
x
x
x,它就输出一个
y
^
\hat{y}
y^(又叫估计值或预测值)。比如给
f
f
f输入一个房屋尺寸,它就能输出一个房屋价格(预测价格)。
f
f
f可以写成:
f
w
,
b
(
x
)
=
w
x
+
b
f_{w,b}(x)=wx+b
fw,b(x)=wx+b
f
f
f为图中蓝色线,这个函数(模型)又叫线性回归,当
x
x
x只有一个特征时(这里只有房屋尺寸)称为单变量线性回归。
我们知道了
f
f
f的作用和生成它的过程,但是这个公式中的
w
w
w和
b
b
b到底是如何计算出来的呢?
代价函数 (Cost Function)
上面可知
f
f
f(蓝色线)是通过许多条训练数据
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i))计算得到,而整个计算可转化为一个优化问题:
假设我们有未知参数
w
w
w和
b
b
b,一个
x
(
i
)
x^{(i)}
x(i)代入
f
w
,
b
f_{w,b}
fw,b中就可以得到一个
y
^
(
i
)
\hat{y}^{(i)}
y^(i),所以我们自然会想到要使原来的
y
(
i
)
{y}^{(i)}
y(i)和估计值
y
^
(
i
)
\hat{y}^{(i)}
y^(i)越接近越好(因为
y
^
(
i
)
\hat{y}^{(i)}
y^(i)由
f
w
,
b
(
x
(
i
)
)
f_{w,b}(x^{(i)})
fw,b(x(i))生成,与
y
(
i
)
{y}^{(i)}
y(i)越接近说明模型越准确)。因此我们定义一个函数叫损失函数(loss function)代表
y
(
i
)
{y}^{(i)}
y(i)和估计值
y
^
(
i
)
\hat{y}^{(i)}
y^(i)的接近程度(误差):
L
(
w
,
b
)
=
(
y
^
(
i
)
−
y
(
i
)
)
2
L(w,b) =(\hat{y}^{(i)}-{y}^{(i)})^2
L(w,b)=(y^(i)−y(i))2
平方是防止出现负数(因为接近程度是距离的概念,最小值为0),损失函数是衡量一条数据的误差,若要衡量所有训练集数据的误差,则进一步我们定义代价函数:
J
(
w
,
b
)
=
1
2
m
∑
i
=
1
m
(
y
^
(
i
)
−
y
(
i
)
)
2
J(w,b) = \frac{1}{2m}\sum_{i=1}^{m} (\hat{y}^{(i)}-{y}^{(i)})^2
J(w,b)=2m1i=1∑m(y^(i)−y(i))2
一些解释:
- 求和符号代表所有点接近程度的衡量;
- 除以m是计算平均误差(防止随着m的增大距离总和变大);
- 除以1/2是方便后续求导运算,不改变函数的本来性质,因为代价函数的目的是求当取最小值时对应的 w w w和 b b b,而不是求最小值多少。
优化问题最后变成了求解 m i n i m i z e J ( w , b ) minimizeJ(w,b) minimizeJ(w,b)时对应的 w w w和 b b b。
直观理解(令
b
=
0
,
f
w
(
x
)
=
w
x
b=0,f_{w}(x) = wx
b=0,fw(x)=wx,方便在二维图像展示
w
w
w和
J
J
J的关系):
从下图可以看出原数据给定三个点(1,1),(2,2),(3,3),w取不同值时J对应的取值,当w=1时J达到最小值,也就是此时模型与原数据完美拟合(J=0)
w w w | J J J |
---|---|
-0.5 | J ( − 0.5 ) = 1 2 ∗ 3 ( 1. 5 2 + 3 2 + 4. 5 2 ) ≈ 5.25 J(-0.5)=\frac{1}{2*3} (1.5^2+3^2+4.5^2)\approx 5.25 J(−0.5)=2∗31(1.52+32+4.52)≈5.25 |
0 | J ( 0 ) = 1 2 ∗ 3 ( 1 2 + 2 2 + 3 2 ) ≈ 2.3 J(0)=\frac{1}{2*3} (1^2+2^2+3^2)\approx 2.3 J(0)=2∗31(12+22+32)≈2.3 |
0.5 | J ( 0.5 ) = 1 2 ∗ 3 ( 0. 5 2 + 1 2 + 1. 5 2 ) ≈ 0.58 J(0.5)=\frac{1}{2*3} (0.5^2+1^2+1.5^2)\approx 0.58 J(0.5)=2∗31(0.52+12+1.52)≈0.58 |
1 | J ( 1 ) = 1 2 ∗ 3 ( 0 2 + 0 2 + 0 2 ) = 0 J(1)=\frac{1}{2*3} (0^2+0^2+0^2)= 0 J(1)=2∗31(02+02+02)=0 |
当加入参数b后可以在三维空间可视化代价函数 J J J 和参数 w , b w,b w,b的关系
同样给定一批数据可以观察到不同
w
,
b
w,b
w,b变化时对应的
J
J
J的变化。右图为从上往下看三维图的视角(等高线图),每一个圆圈代表J的值,圆圈越小J越小。
梯度下降算法(Gradient Descent Algorithm)
梯度下降算法是解决优化问题的最常用算法,具体的算法步骤为:
- 随机设置 w w w和 b b b的值;
- 持续改变 w w w和 b b b的值以减少 J J J的值 ;
- 直到到达 J J J的最小值时,此时的 w w w和 b b b就是最优模型参数。
数学公式:
重复以下步骤直到收敛(
J
J
J固定在某个数值附近),其中
α
\alpha
α为学习率(learning rate),
∂
J
(
w
,
b
)
∂
w
\frac{\partial J(w,b)}{\partial w}
∂w∂J(w,b)称为
w
w
w的偏导数(Derivative)。
w
=
w
−
α
∂
J
(
w
,
b
)
∂
w
,
b
=
b
−
α
∂
J
(
w
,
b
)
∂
b
w = w-\alpha \frac{\partial J(w,b)}{\partial w},b = b-\alpha \frac{\partial J(w,b)}{\partial b}
w=w−α∂w∂J(w,b),b=b−α∂b∂J(w,b)
需要注意的是每次迭代
w
w
w和
b
b
b必须同时更新,而不是先后更新,详细写法:
t
m
p
w
=
w
−
α
∂
J
(
w
,
b
)
∂
w
,
t
m
p
b
=
b
−
α
∂
J
(
w
,
b
)
∂
b
tmpw = w-\alpha \frac{\partial J(w,b)}{\partial w},tmpb = b-\alpha \frac{\partial J(w,b)}{\partial b}
tmpw=w−α∂w∂J(w,b),tmpb=b−α∂b∂J(w,b)
update:
w
=
t
m
p
w
,
b
=
t
m
p
b
{\color{red} w=tmpw,b=tmpb}
w=tmpw,b=tmpb
直观理解:你站在山坡的任意一点,沿着坡度的方向一步一步往山下走,直到走到山底位置。这里的 w , b w,b w,b就是你在山坡的位置,偏导数定义了坡度的方向, α \alpha α就是每一步迈的多大,山底位置就是 m i n J ( w , b ) minJ(w,b) minJ(w,b)。收敛(Convergence)就是判断已经走到了山底。
注意:为什么每次迭代需要减去梯度(偏导数)?
因为对于凸函数Convex(碗状)
当
w
w
w在曲线右边时,梯度是正的,减去梯度后的
w
w
w变小,对应的
J
J
J也更小
当
w
w
w在曲线左边时,梯度是负的,减去梯度后的
w
w
w增加,对应的
J
J
J同样变小
所以不管初始化的
w
w
w在什么位置,每次迭代减去梯度都会使
J
J
J变小(如下图):
学习率(learning rate) α \alpha α
- 当学习率 α \alpha α设置过小时,梯度下降算法会跑的很慢
- 当学习率 α \alpha α设置过大时,梯度下降可能不会收敛(反复横跳)
最优的方法是随着算法的不断迭代,动态调整
α
\alpha
α的值(后续文章讨论)。
运用梯度下降算法求解单变量线性回归参数( w , b w,b w,b)
综合上述讨论求解线性回归的参数 w w w和 b b b:
- 构造代价函数 J ( w , b ) = 1 2 m ∑ i = 1 m ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(w,b)=\frac{1}{2m}\sum_{i=1}^{m}({\color{red} f_{w,b}(x^{(i)})} -y^{(i)})^{2} J(w,b)=2m1∑i=1m(fw,b(x(i))−y(i))2,其中 y ^ ( i ) = f w , b ( x ( i ) ) = w x ( i ) + b \hat{y}^{(i)}={\color{red} f_{w,b}(x^{(i)})}=wx^{(i)}+b y^(i)=fw,b(x(i))=wx(i)+b
- 求 w w w和 b b b对应的偏导数(梯度) ∂ J ( w , b ) ∂ w = 1 m ∑ i = 1 m ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) , ∂ J ( w , b ) ∂ b = 1 m ∑ i = 1 m ( f w , b ( x ( i ) ) − y ( i ) ) \frac{\partial J(w,b)}{\partial w}=\frac{1}{m}\sum_{i=1}^{m}({\color{red} f_{w,b}(x^{(i)})} -y^{(i)})x^{(i)},\frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum_{i=1}^{m}({\color{red} f_{w,b}(x^{(i)})} -y^{(i)}) ∂w∂J(w,b)=m1i=1∑m(fw,b(x(i))−y(i))x(i),∂b∂J(w,b)=m1i=1∑m(fw,b(x(i))−y(i))
- 运用梯度下降算法迭代求解,先随机设置 w w w和 b b b的值,然后 t m p w = w − α 1 m ∑ i = 1 m ( f w , b ( x ( i ) ) − y ( i ) ) x ( i ) tmpw = w-\alpha \frac{1}{m}\sum_{i=1}^{m}({\color{red} f_{w,b}(x^{(i)})} -y^{(i)})x^{(i)} tmpw=w−αm1i=1∑m(fw,b(x(i))−y(i))x(i) t m p b = b − α 1 m ∑ i = 1 m ( f w , b ( x ( i ) ) − y ( i ) ) tmpb = b-\alpha\frac{1}{m}\sum_{i=1}^{m}({\color{red} f_{w,b}(x^{(i)})} -y^{(i)}) tmpb=b−αm1i=1∑m(fw,b(x(i))−y(i))update w = t m p w , b = t m p b {\color{red} w=tmpw,b=tmpb} w=tmpw,b=tmpb
- 每次迭代后观察
J
J
J是否收敛,如果达到收敛,则此时对应的
w
w
w和
b
b
b的值就是线性回归方程的最优参数,随着迭代次数的增加,Cost
J
J
J逐渐收敛到一个固定值(如下图)
可视化迭代步骤