线性回归模型
线性回归
概述
- 一种被广泛应用的回归技术
- 机器学习里面最简单的一个模型
- 本质是一系列特征的线性组合
- 可以视为
(1)二维空间中的一条直线
(2)三维空间中的一个平面
线性回归最普通的形式是:
f
(
x
)
=
w
′
x
+
b
f(x)=w'x+b
f(x)=w′x+b
其中,向量x即{
x
1
,
x
2
,
x
3
,
.
.
.
,
x
n
x_1,x_2,x_3,...,x_n
x1,x2,x3,...,xn},其中,
x
1
,
x
2
,
x
3
x_1,x_2,x_3
x1,x2,x3代表样本的各个特征,
w
w
w是向量
x
x
x所占的权重,b是一个标量代表特征都为0时的预测值,可以视为模型的basis或者bias。
这里的
W
W
W乘以
x
x
x在线性代数中称作两个向量的内积(也称向量的点乘或者向量的数量积),假设
w
w
w和
x
x
x均为列向量,即代表了代表了
w
w
w和
x
x
x向量的内积
w
′
x
w'x
w′x。这里的
x
x
x也可以是一个矩阵
X
X
X,
w
w
w与
X
X
X也可以写成
w
′
X
w'X
w′X,但是
b
b
b也要相应的写为向量的形式。
线性回归示例
# w是列向量,矩阵是由一个个列向量构成,y=dot(w_t,X)+b
import numpy as np
w_t,b=np.array([1,2,3,4,5]),1
X=np.array([[1,1,1,1,1],[1,2,3,4,5],[1,4,5,6,6]]).T
y_hat=np.dot(w_t,X)+b
w_t
array([1, 2, 3, 4, 5])
X
array([[1, 1, 1],
[1, 2, 4],
[1, 3, 5],
[1, 4, 6],
[1, 5, 6]])
y_hat
array([16, 56, 79])
损失函数
线性回归模型的困难之处在于
w
w
w和
b
b
b的求解。
李航老师的《统计学习方法》中把一个学习过程分为了三部分:模型、策略、算法,为了求解
w
w
w和
b
b
b,我们需要指定一定的策略,而这个策略在机器学习的领域中,往往描述为真实值与回归值得偏差。
l
o
s
s
=
(
f
(
x
)
−
y
)
2
loss=(f(x)-y)^2
loss=(f(x)−y)2
我们追求的是能够减少在测试集上的预测值
f
(
x
)
f(x)
f(x)与真实值
y
y
y的差别,从而获得一个最佳的权重参数
w
w
w。这里采用最小二乘估计。
注意:最小方差无偏估计和最小二乘估计是不一样的,最直观的区别是最小二乘估计表示的是估计点与真实点的区别,而最小方差无偏估计表示的是估计点与真实数据期望的差别。
损失函数示例
y=np.array([1.5,3,6])
loss=(y_hat-y)**2
y
array([1.5, 3. , 6. ])
loss
array([ 210.25, 2809. , 5329. ])
优化方法
怎样调整
w
w
w才能使估计值与真实值的差别尽可能小呢?
常用的两种凸优化方法
+ 最小二乘优化
+ 梯度下降优化
最小二乘
最小二乘优化的思路是线性代数中的矩阵求导(复习一下导数:导数为0的点就是极值点,也就是使loss最大或最小的点(实际上是最小的点,因为loss一般是一个往下凸的函数, w w w无限大的时候,随便带进去一个值估计出来的loss都很大))
所以,任务转化为,求解
d
(
w
′
X
+
b
−
y
)
2
d
w
=
0
\frac{d(w'X+b-y)^2}{dw}=0
dwd(w′X+b−y)2=0 的数学问题
–>
2
(
w
′
X
−
y
)
X
T
=
0
2(w'X-y)X^T=0
2(w′X−y)XT=0
–>
w
′
X
X
T
=
y
X
T
w'XX^T=yX^T
w′XXT=yXT
–>
w
′
=
(
y
X
T
)
(
X
X
T
)
−
1
w'=(yX^T)(XX^T)^{-1}
w′=(yXT)(XXT)−1(如果
X
X
T
XX^T
XXT可逆)
w_t=np.dot(np.dot(y,X.T),np.linalg.inv(np.dot(X,X.T)))
w_t
array([-1.75 , -1.25 , 20.25 , 7.5 , 11.4375])
梯度下降
梯度下降的策略与最小二乘优化不同,它采用的不是用数据方法一步求出解析解,而是一步一步的往让loss变到最小值的方向走,直到走到那个点。
为了说明方向的确定,我们引入梯度的概念。
The gradient points in the direction of the greatest rate of increse of the function,and its magnitude is the slope of the graph in that direction.—Wikipedia
梯度方向就是增长最快的方向,如果我们想要函数值减小,只需要沿着负梯度方向走就行了。具体求这个梯度(grad)的方法以一言以蔽之:对loss求偏导(参考《数学优化方法》)
具体来说,
g r a d = 2 ( w ′ X − y ) X T grad=2(w'X-y)X^T grad=2(w′X−y)XT
之后沿着这个方向走一小步
w < − − w + 0.1 ∗ g r a d w<--w+0.1*grad w<−−w+0.1∗grad
然后再重复求偏导–>走–>求偏导–>走,就可以得到最终的权重向量 w w w。
注意:对于一个连续可导的函数而言,越靠近我们想要的那个极值点的地方,它的梯度就越小。类比场景:蚁人在浴缸里走的时候,浴缸边缘陡峭,中间平缓,故在实现的时候,只需要在走的很慢的时候(梯度小)停下。
while True:
grad=np.dot((np.dot(w_t,X)-y),X.T)
w_t-=0.1*grad
if np.linalg.norm(w_t,ord=2)<1e-3:
break
备注
linalg = linear(线性) + algebra(代数);
norm 表示范数
+1e-3表示1*10^-3,即0.001
注:阶码标志’E’或’e’之前必须有数字。