python代码实现:https://blog.csdn.net/jk_chen_acmer/article/details/102990950
线性回归
预测的答案值可以用各个特征值的线性表达式表示。
假设单个变量
x
x
x,实际答案为
y
y
y,线性预测值为
h
θ
(
x
)
h_\theta(x)
hθ(x),
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta(x)=\theta_0+\theta_1x
hθ(x)=θ0+θ1x。
数据集的数据个数为
m
m
m,称
x
(
i
)
x^{(i)}
x(i)为第
i
i
i个数据的
x
x
x值,
y
(
i
)
y^{(i)}
y(i)同理。
对于一组 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1,我们可以得到其代价函数为 J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 J(θ0,θ1)=2m1∑i=1m(hθ(x(i))−y(i))2,也就是类似方差的东西,反应了预测值与实际答案的差距。
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
θ
0
+
θ
1
x
(
i
)
−
y
(
i
)
)
2
J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^m(\theta_0+\theta_1x^{(i)}-y^{(i)})^2
J(θ0,θ1)=2m1∑i=1m(θ0+θ1x(i)−y(i))2,显然当
θ
0
\theta_0
θ0固定时,
θ
1
\theta_1
θ1与
J
(
θ
0
,
θ
1
)
J(\theta_0,\theta_1)
J(θ0,θ1)的关系如图:
当
θ
0
\theta_0
θ0不固定时,
θ
0
,
θ
1
\theta_0,\theta_1
θ0,θ1与
J
(
θ
0
,
θ
1
)
J(\theta_0,\theta_1)
J(θ0,θ1)的关系如图(碗装图):
误差当然是越小越好,所以我们就是想办法在上述图像中找到一个最低点。
一般采用梯度下降法来得到最低点。
梯度下降算法
α
\alpha
α表示学习速率
ϑ
ϑ
θ
j
J
(
θ
0
,
θ
1
)
\dfrac{\vartheta}{\vartheta\theta_j}J(\theta_0,\theta_1)
ϑθjϑJ(θ0,θ1)表示当前点的导数,也就是与图像相切的线的斜率。
对于一个n个特征值的问题,我们的代价函数和导数为:
J ( θ 0 , θ 1 . . . θ n ) = 1 2 m ∑ i = 1 m ( θ 0 + θ 1 x 1 ( i ) + . . . + θ n x n ( i ) − y ( i ) ) 2 ϑ ϑ θ j J ( θ 0 , θ 1 . . . θ n ) = 1 m ∑ i = 1 m ( θ 0 + θ 1 x 1 ( i ) + . . . + θ n x n ( i ) − y ( i ) ) ∗ x j ( i ) J(\theta_0,\theta_1...\theta_n)=\frac{1}{2m}\sum_{i=1}^m(\theta_0+\theta_1x_1^{(i)}+...+\theta_nx_n^{(i)}-y^{(i)})^2 \\ \dfrac{\vartheta}{\vartheta\theta_j}J(\theta_0,\theta_1...\theta_n)=\frac{1}{m}\sum_{i=1}^m(\theta_0+\theta_1x_1^{(i)}+...+\theta_nx_n^{(i)}-y^{(i)})*x_j^{(i)} J(θ0,θ1...θn)=2m1i=1∑m(θ0+θ1x1(i)+...+θnxn(i)−y(i))2ϑθjϑJ(θ0,θ1...θn)=m1i=1∑m(θ0+θ1x1(i)+...+θnxn(i)−y(i))∗xj(i)
梯度下降算法……α
每次另
θ
j
=
θ
j
−
α
ϑ
ϑ
θ
j
J
(
θ
0
,
θ
1
)
\theta_j=\theta_j-\alpha\dfrac{\vartheta}{\vartheta\theta_j}J(\theta_0,\theta_1)
θj=θj−αϑθjϑJ(θ0,θ1),相当于往最低点走一步,这一步的长度与
α
\alpha
α直接相关。
梯度下降算法……特征缩放
当多个特征值的范围差异较大时,例如 x 1 ∈ [ 0 , 1 ] , x 2 ∈ [ 0 , 1000 ] x_1\in[0,1],x_2\in[0,1000] x1∈[0,1],x2∈[0,1000](在3D图像中的表现为扁平图像),每一步的斜率可能非常小,却又离最低点很远,需要非常大的迭代次数。这个时候我们可以对特征值进行缩放。
一般另
x
=
x
−
a
v
e
r
a
g
e
r
a
n
g
e
x=\dfrac{x-average}{range}
x=rangex−average
例如
x
∈
[
0
,
1000
]
x\in[0,1000]
x∈[0,1000],那么
600
:
=
(
600
−
500
)
/
1000
=
0.1
600:=(600-500)/1000=0.1
600:=(600−500)/1000=0.1,显然最后的范围为
[
−
0.5
,
0.5
]
[-0.5,0.5]
[−0.5,0.5]
梯度下降算法……构造新的特征
我们可以用已有的特征值通过方程式,构造出新的式子。例如我现在有 x 1 , x 2 x_1,x_2 x1,x2,可能最优预测函数 h θ ( θ 0 , θ 1 ) = θ 0 + θ 1 x 1 x 2 h_\theta(\theta_0,\theta_1)=\theta_0+\theta_1x_1x_2 hθ(θ0,θ1)=θ0+θ1x1x2,此时我们原来按照 θ 0 + θ 1 x 1 + θ 2 x 2 \theta_0+\theta_1x_1+\theta_2x_2 θ0+θ1x1+θ2x2构造就不太行了,但是如果我们令 x ′ = x 1 x 2 x'=x_1x_2 x′=x1x2, h θ ( θ 0 , θ 1 ) = θ 0 + θ 1 x ′ h_\theta(\theta_0,\theta_1)=\theta_0+\theta_1x' hθ(θ0,θ1)=θ0+θ1x′,就解决问题了。
以此方法,我们可以用线性回归处理非线性问题。
例如,最优预测函数为 h θ ( θ 0 , θ 1 , θ 2 , θ 3 ) = θ 0 + θ 1 x + θ 2 x 2 + θ 3 x 3 h_\theta(\theta_0,\theta_1,\theta_2,\theta_3)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3 hθ(θ0,θ1,θ2,θ3)=θ0+θ1x+θ2x2+θ3x3,我们另 x 1 = x , x 2 = x 2 , x 3 = x 3 x_1=x,x_2=x^2,x_3=x^3 x1=x,x2=x2,x3=x3,则可以将预测函数写成 h θ ( θ 0 , θ 1 , θ 2 , θ 3 ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 h_\theta(\theta_0,\theta_1,\theta_2,\theta_3)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3 hθ(θ0,θ1,θ2,θ3)=θ0+θ1x1+θ2x2+θ3x3。
注意,此时的 x i x_i xi的范围显然差距很大,那么特征缩放就更加重要了。
梯度下降算法……向量化计算
一般的编程语言带有或易获取线性代数库,实现速度快,所以一些计算我们可以使用矩阵运算来代替。
h θ ( θ 0 , θ 1 , θ 2 , θ 3 ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 ⇒ [ θ 0 , θ 1 , θ 2 , θ 3 ] ∗ [ 1 , x 1 , x 2 , x 3 ] T h_\theta(\theta_0,\theta_1,\theta_2,\theta_3)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3 \\ \Rightarrow[\theta_0,\theta_1,\theta_2,\theta_3]*[1,x_1,x_2,x_3]^T hθ(θ0,θ1,θ2,θ3)=θ0+θ1x1+θ2x2+θ3x3⇒[θ0,θ1,θ2,θ3]∗[1,x1,x2,x3]T
θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( θ 0 + θ 1 x 1 ( i ) + . . . + θ n x n ( i ) − y ( i ) ) ∗ x 0 ( i ) θ 1 : = θ 1 − α 1 m ∑ i = 1 m ( θ 0 + θ 1 x 1 ( i ) + . . . + θ n x n ( i ) − y ( i ) ) ∗ x 1 ( i ) θ n : = θ n − α 1 m ∑ i = 1 m ( θ 0 + θ 1 x 1 ( i ) + . . . + θ n x n ( i ) − y ( i ) ) ∗ x n ( i ) ⇒ [ θ 0 θ 1 . . . θ n ] − α 1 m ( θ 0 + θ 1 x 1 ( 1 ) + . . . + θ n x n ( 1 ) − y ( 1 ) ) [ x 0 ( 1 ) x 1 ( 1 ) . . . x n ( 1 ) ] . . . − α 1 m ( θ 0 + θ 1 x 1 ( m ) + . . . + θ n x n ( m ) − y ( m ) ) [ x 0 ( m ) x 1 ( m ) . . . x n ( m ) ] \theta_0:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m(\theta_0+\theta_1x_1^{(i)}+...+\theta_nx_n^{(i)}-y^{(i)})*x_0^{(i)}\\ \theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m(\theta_0+\theta_1x_1^{(i)}+...+\theta_nx_n^{(i)}-y^{(i)})*x_1^{(i)}\\ \theta_n:=\theta_n-\alpha\frac{1}{m}\sum_{i=1}^m(\theta_0+\theta_1x_1^{(i)}+...+\theta_nx_n^{(i)}-y^{(i)})*x_n^{(i)}\\ \\ \Rightarrow \begin{bmatrix}\theta_0\\\theta_1\\...\\\theta_n\end{bmatrix}-\alpha\frac{1}{m}(\theta_0+\theta_1x_1^{(1)}+...+\theta_nx_n^{(1)}-y^{(1)})\begin{bmatrix}x^{(1)}_0\\x^{(1)}_1\\...\\x^{(1)}_n\end{bmatrix}...-\alpha\frac{1}{m}(\theta_0+\theta_1x_1^{(m)}+...+\theta_nx_n^{(m)}-y^{(m)})\begin{bmatrix}x^{(m)}_0\\x^{(m)}_1\\...\\x^{(m)}_n\end{bmatrix} θ0:=θ0−αm1i=1∑m(θ0+θ1x1(i)+...+θnxn(i)−y(i))∗x0(i)θ1:=θ1−αm1i=1∑m(θ0+θ1x1(i)+...+θnxn(i)−y(i))∗x1(i)θn:=θn−αm1i=1∑m(θ0+θ1x1(i)+...+θnxn(i)−y(i))∗xn(i)⇒⎣⎢⎢⎡θ0θ1...θn⎦⎥⎥⎤−αm1(θ0+θ1x1(1)+...+θnxn(1)−y(1))⎣⎢⎢⎢⎡x0(1)x1(1)...xn(1)⎦⎥⎥⎥⎤...−αm1(θ0+θ1x1(m)+...+θnxn(m)−y(m))⎣⎢⎢⎢⎡x0(m)x1(m)...xn(m)⎦⎥⎥⎥⎤
正规方程
将第
i
i
i个数据的特征值写成行向量的形式(额外加上一个
x
0
x_0
x0):
x
(
i
)
=
(
x
0
=
1
,
x
1
.
.
.
x
n
)
x^{(i)}=(x_0=1,x_1...x_n)
x(i)=(x0=1,x1...xn)
令矩阵
X
X
X的第
i
i
i行为第
i
i
i组数据的行向量:
[
x
0
(
1
)
,
x
1
(
1
)
.
.
.
x
n
(
1
)
x
0
(
2
)
,
x
1
(
2
)
.
.
.
x
n
(
2
)
.
.
x
0
(
m
)
,
x
1
(
m
)
.
.
.
x
n
(
m
)
]
\begin{bmatrix}x^{(1)}_0 ,x^{(1)}_1...x^{(1)}_n\\x^{(2)}_0 ,x^{(2)}_1...x^{(2)}_n\\..\\x^{(m)}_0 ,x^{(m)}_1...x^{(m)}_n\end{bmatrix}
⎣⎢⎢⎢⎡x0(1),x1(1)...xn(1)x0(2),x1(2)...xn(2)..x0(m),x1(m)...xn(m)⎦⎥⎥⎥⎤
令
m
∗
1
m*1
m∗1的矩阵
Y
Y
Y的第
i
i
i行第一个元素为第
i
i
i组数据的答案:
[
y
(
1
)
y
(
1
)
.
.
.
y
(
m
)
]
\begin{bmatrix}y^{(1)}\\y^{(1)}\\...\\y^{(m)}\end{bmatrix}
⎣⎢⎢⎡y(1)y(1)...y(m)⎦⎥⎥⎤
最后的答案 θ i \theta_i θi组成的 ( n + 1 ) ∗ 1 (n+1)*1 (n+1)∗1矩形为 ( X T ∗ X ) − 1 ∗ X T ∗ Y (X^T*X)^{-1}*X^T*Y (XT∗X)−1∗XT∗Y
很神奇,一步解决问题,最大的时间瓶颈为计算一个 ( n + 1 ) ( n + 1 ) (n+1)(n+1) (n+1)(n+1)矩阵的逆矩阵,复杂度为 O ( n 3 ) O(n^3) O(n3)。也就是说,当特征数量较大时,时间复杂度为很大。但是相较于梯度下降算法,正规方程不需要自己定 α \alpha α,不需要迭代,不需要特征缩放,较为方便。
正规方程……(X^T)X不可逆
一般不会出现,即使出现了,使用求伪逆的函数做也是没有问题的( p i n v i n O c t a v e pinv\;in\;Octave pinvinOctave)
讲一下导致这种情况的可能原因:
- 两个特征值线性相关,即 x i = k x j x_i=kx_j xi=kxj
- m < n m<n m<n,即特征数量多于数据个数
学习视频:吴恩达机器学习