线性回归是一种x和y之间的关系为线性关系的回归分析。
y
=
a
1
x
1
+
a
2
x
2
+
b
y=a_1x_1+a_2x_2+b
y=a1x1+a2x2+b,这个叫线性关系。如果这里出现了
x
2
x^2
x2,
l
o
g
(
x
)
log(x)
log(x),
s
i
n
(
x
)
sin(x)
sin(x)之类的,那就不是线性关系了。
y 为应变量 dependent variable x 为自变量 independent variable a 为斜率 coeffient b 为截距 intercept ε (读作epsilon)为误差,正态分布 线性回归的目标是,找到一组a和b,使得ε最小
y
^
=
a
x
+
b
\hat{y}=ax+b
y^=ax+b
ε
=
y
−
y
^
ε=y-\hat{y}
ε=y−y^
y
^
\hat{y}
y^ 读作y hat,也有人读作y帽子。这里的帽子一般表示估计值,用来区别真实值y。
∂
J
∂
a
=
∂
1
2
n
∑
i
=
0
n
(
y
i
−
y
^
i
)
2
∂
a
\frac{\partial J}{\partial a} = \frac{\partial \frac{1}{2n}\sum_{i=0}^{n}(y_i−\hat{y}_i )^2}{\partial a}
∂a∂J=∂a∂2n1∑i=0n(yi−y^i)2
=
1
n
∑
i
=
0
n
(
y
i
−
a
x
i
−
b
)
∂
(
y
i
−
a
x
i
−
b
)
∂
a
= \frac{1}{n}\sum_{i=0}^{n}(y_i-ax_i-b) \frac{\partial (y_i-ax_i-b)}{\partial a}
=n1∑i=0n(yi−axi−b)∂a∂(yi−axi−b)
=
1
n
∑
i
=
0
n
(
y
i
−
a
x
i
−
b
)
(
−
x
i
)
= \frac{1}{n}\sum_{i=0}^{n}(y_i-ax_i-b) (-x_i)
=n1∑i=0n(yi−axi−b)(−xi)
=
1
n
∑
i
=
0
n
x
(
y
^
i
−
y
i
)
= \frac{1}{n}\sum_{i=0}^{n}x(\hat{y}_i-y_i)
=n1∑i=0nx(y^i−yi)
∂
J
∂
b
=
∂
1
2
n
∑
i
=
0
n
(
y
i
−
y
^
i
)
2
∂
a
\frac{\partial J}{\partial b} = \frac{\partial \frac{1}{2n}\sum_{i=0}^{n}(y_i−\hat{y}_i )^2}{\partial a}
∂b∂J=∂a∂2n1∑i=0n(yi−y^i)2
=
1
n
∑
i
=
0
n
(
y
i
−
a
x
i
−
b
)
∂
(
y
i
−
a
x
i
−
b
)
∂
b
= \frac{1}{n}\sum_{i=0}^{n}(y_i-ax_i-b) \frac{\partial (y_i-ax_i-b)}{\partial b}
=n1∑i=0n(yi−axi−b)∂b∂(yi−axi−b)
=
1
n
∑
i
=
0
n
(
y
i
−
a
x
i
−
b
)
(
−
1
)
= \frac{1}{n}\sum_{i=0}^{n}(y_i-ax_i-b) (-1)
=n1∑i=0n(yi−axi−b)(−1)
=
1
n
∑
i
=
0
n
(
y
^
i
−
y
i
)
= \frac{1}{n}\sum_{i=0}^{n}(\hat{y}_i-y_i)
=n1∑i=0n(y^i−yi)
这时,我们就可以去更新a和b的值:
a
=
a
−
α
∂
J
∂
a
a = a - \alpha \frac{\partial J}{\partial a}
a=a−α∂a∂J
b
=
b
−
α
∂
J
∂
b
b = b - \alpha \frac{\partial J}{\partial b}
b=b−α∂b∂J
到这里,在你继续往下读之前,你先自己考虑一下,为什么这里是负号?
你考虑好了么,如果你考虑好了,我就公布答案了。
本身
∂
J
∂
a
\frac{\partial J}{\partial a}
∂a∂J 和
∂
J
∂
b
\frac{\partial J}{\partial b}
∂b∂J 是损失函数的变化量。如果损失函数随着a变大了,即
∂
J
∂
a
\frac{\partial J}{\partial a}
∂a∂J 为正。说明a的增大会导致损失函数的增大。那么是不是说,a的减小会使得损失函数减小呢?而我们的目标是使得J最小,所以,这个时候,我们的a要减小一点点。
(图片来自互联网)
算法步骤
a和b的起始值设置为零
通过模型
y
^
=
a
x
+
b
\hat{y}=ax+b
y^=ax+b,我们可以算出
y
^
\hat{y}
y^
有了
y
^
\hat{y}
y^,就可以用优化方法算去更新参数
重复2和3,直到找到J的最小值
流程图如下:
下图解释了模型,损失函数和优化方法之间的关系。
Python 实现
理论部分先告一段落,我们现在开始写代码,实现一元线性回归。
首先是模型,这个很简单:
defmodel(a, b, x):return a*x + b
接着,是损失函数:
defcost_function(a, b, x, y):
n =5return0.5/n *(np.square(y-a*x-b)).sum()
最后,是优化函数:
defoptimize(a,b,x,y):
n =5
alpha =1e-1
y_hat = model(a,b,x)
da =(1.0/n)*((y_hat-y)*x).sum()
db =(1.0/n)*((y_hat-y).sum())
a = a - alpha*da
b = b - alpha*db
return a, b
在机器学习中,模型的好坏是有标准的。在回归模型中,我们用
R
2
R^2
R2 来评价模型。公式:
R
2
=
S
S
R
/
S
S
T
R^2=SSR/SST
R2=SSR/SST 其中
S
S
R
=
∑
i
=
0
n
(
y
^
i
−
y
ˉ
)
SSR=\sum_{i=0}^{n}(\hat{y}_i-\bar{y})
SSR=∑i=0n(y^i−yˉ)
S
S
T
=
∑
i
=
0
n
(
y
i
−
y
ˉ
)
SST=\sum_{i=0}^{n}(y_i-\bar{y})
SST=∑i=0n(yi−yˉ)
y
ˉ
\bar{y}
yˉ 读作y bar,是y的平均值。 可以证明
S
S
T
=
S
S
R
+
S
S
E
SST=SSR+SSE
SST=SSR+SSE,证明过程又会涉及到期望等概念,我们这里不展开了。