机器学习笔记——线性回归
学习资源:斯坦福机器学习公开课 by Andrew Ng
0 符号说明
- m m :训练样本个数
- n n :样本的特征个数(特征的维度),这里先取 n=1 n = 1
- hθ(x) h θ ( x ) :假设函数, hθ(x)=θ0+θ1x h θ ( x ) = θ 0 + θ 1 x
- J(θ0,θ1) J ( θ 0 , θ 1 ) :损失函数, J(θ0,θ1)=12m∑i=1m(hθ(x(i))−y(i))2 J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2
故, x(i)j x j ( i ) 表示第 i i 个样本的第个特征值, (x(i),y(i)) ( x ( i ) , y ( i ) ) 为第 i i 个训练样例。
1 初识线性回归
这里使用 andrew Ng 老师的课件示例,先从单一特征开始
通过房子的面积和已知的售出价格,找到对应面积的最佳出售价格,训练样本见下表:
Size in feet2 (x) | Price ($) in 1000’s (y) |
---|---|
2104 | 460 |
1416 | 232 |
1534 | 315 |
852 | 178 |
… | … |
这个训练样本描出来结果如下图所示
我们希望通过这些样本,回归出一条预测曲线,如下图所示。如何保证这条线是我们需要的预测函数,引出损失函数。
损失函数:
损失函数其目的:保证假设函数对应的预测值和实际值差值平方和最小。这样就能找到满足需求的 hθ(x) h θ ( x ) ,也就是我们的预测函数(预测直线)。
2 将样本特征扩展到多维
泛化考虑,给定数据集为
D=(x1,y1),(x2,y2),(x3,y3),⋯,(xn,yn)
D
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
(
x
3
,
y
3
)
,
⋯
,
(
x
n
,
y
n
)
,其中每一个样本
x(i)
x
(
i
)
都有n个特征(n维特征)。考虑用线性回归建立一个线性模型,针对每一个样本
x(i)
x
(
i
)
,假设
x(i)0=1
x
0
(
i
)
=
1
,则
损失函数同之前 Jθ(x) J θ ( x ) 的一样。
令 X=⎡⎣⎢⎢⎢⎢⎢⎢11⋮1x(1)1x(2)1⋮x(m)1⋯⋯⋯⋯x(1)nx(2)n⋮x(m)n⎤⎦⎥⎥⎥⎥⎥⎥ X = [ 1 x 1 ( 1 ) ⋯ x n ( 1 ) 1 x 1 ( 2 ) ⋯ x n ( 2 ) ⋮ ⋮ ⋯ ⋮ 1 x 1 ( m ) ⋯ x n ( m ) ] , θ=⎡⎣⎢⎢⎢⎢θ0θ1⋮θn⎤⎦⎥⎥⎥⎥ θ = [ θ 0 θ 1 ⋮ θ n ] , y⃗ =⎡⎣⎢⎢⎢⎢y0y1⋮yn⎤⎦⎥⎥⎥⎥ y → = [ y 0 y 1 ⋮ y n ] 。
则,损失函数可以表示为:
3 如何最小化 Jθ(x) J θ ( x ) -梯度下降法
简述:利用求导数的思想,寻找斜率方向(梯度反方向)的极值点,每迭代一次找到一个极值点(极小值),直到损失函数不在继续变小(变小的范围在可接受的阈值范围内)。
如下图所示,下图为只有一个特征的情况,损失函数应用梯度下降算法后J的变化
回忆之前的单一特征的线性回归模型
hθ(x)=θ0+θ1x h θ ( x ) = θ 0 + θ 1 x
Jθ(x)=12m∑i=1m(hθ(x(i))−y(i))2 J θ ( x ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2
对 J(θ) J ( θ ) 进行求导,可得
∂∂θ0J(θ0,θ1)=1m∑i=1m(hθ(x(i))−y(i)) ∂ ∂ θ 0 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) )
∂∂θ1J(θ0,θ1)=1m∑i=1m(hθ(x(i))−y(i))x(i) ∂ ∂ θ 1 J ( θ 0 , θ 1 ) = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i )
则可以开始迭代了,直到 θ θ 变化极小为止
θ0:=θ0−1m∑i=1m(hθ(x(i))−y(i)) θ 0 := θ 0 − 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) )
θ1:=θ1−1m∑i=1m(hθ(x(i))−y(i))x(i) θ 1 := θ 1 − 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i )
设学习率为 α α ,则算法描述为:
temp0:=θ0−α∂∂θ0J(θ0,θ1)temp1:=θ1−α∂∂θ1J(θ0,θ1)θ0:=temp0θ1:=temp1 t e m p 0 := θ 0 − α ∂ ∂ θ 0 J ( θ 0 , θ 1 ) t e m p 1 := θ 1 − α ∂ ∂ θ 1 J ( θ 0 , θ 1 ) θ 0 := t e m p 0 θ 1 := t e m p 1
MATLAB代码如下:
m = length(y);
J = zeros(m, 1);
for iter = 1 : num_iters
J = X * theta - y;
temp1 = theta(1) - alpha * (1/m) * sum(J .* X(:, 1));
temp2 = theta(2) - alpha * (1/m) * sum(J .* X(:, 2));
theta(1) = temp1;
theta(2) = temp2;
end
将其泛化:
θj:=θj−αm∑i=1m(hθ(x(i)j)−y(i))x(i)jθj:=θj−αm∑i=1mx(i)j(hθ(x(i)j)−y(i)) θ j := θ j − α m ∑ i = 1 m ( h θ ( x j ( i ) ) − y ( i ) ) x j ( i ) θ j := θ j − α m ∑ i = 1 m x j ( i ) ( h θ ( x j ( i ) ) − y ( i ) )
由前面X的定义,对上式进行向量化:
θ:=θ−αmXT(Xθ−y⃗ ) θ := θ − α m X T ( X θ − y → )
则前面的代码可以简化,同时多维特征下面这种方法也适用:
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1 : num_iters
theta = theta - alpha / m * X' * (X * theta - y);
end
4 Normal Equation
对于特征维数不多的情况下,用正规方程求解更迅速。推导如下:
损失函数:
Jθ(x)=12m∑i=1m(hθ(x(i))−y(i))2
J
θ
(
x
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
向量化化简: Jθ(x)=12m(Xθ−y⃗ )T(Xθ−y⃗ ) J θ ( x ) = 1 2 m ( X θ − y → ) T ( X θ − y → )
由于是求导取极值,则系数可以省去,故上式可继续化简:
则, ∂∂θJ(θ) ∂ ∂ θ J ( θ ) 化简为
参考该图:
则找到对应最小值的J: θ=(XTX)−1XTy θ = ( X T X ) − 1 X T y
matlab代码见下:
theta = pinv( X' * X ) * X' * y;
5 特征归一化
Idea: Make sure features are on a similar scale.
如何实现,对于某一个特征: xi=xi−uiδi x i = x i − u i δ i
其中, u u 为均值,为标准差。一般保证范围在 −1≤xi≤1 − 1 ≤ x i ≤ 1 附近。
除了这些,分母也可以用最值差。
6 学习率和多项式回归
学习率 α α 一般保证合理的范围。下面给出了一个设定的参考范围。
⋯,0.001,⋯,0.01,⋯,0.1,⋯,1,⋯ ⋯ , 0.001 , ⋯ , 0.01 , ⋯ , 0.1 , ⋯ , 1 , ⋯
一般先扫面几个段的效果,然后以三倍的倍数进行递增。
多项式回归如下式所示
hθ(x)=θ0+θ1x+θ2x2 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2
如果无法收敛,需要注意形式,如上式可以改成下式
hθ(x)=θ0+θ1x+θ2x−−√ h θ ( x ) = θ 0 + θ 1 x + θ 2 x