前言
向量化可以通过使用系统内置的线性代数库或者数值线性代数库,大大减少代码的数量和运行的时间
向量化(Vectorization)
在之前讲多变量线性回归的时候,假设函数
h
h
h如下:
要想表示出假设函数,我们可以通过未向量化的代码通过累加
θ
j
\theta_{j}
θj
x
j
x_{j}
xj获得,也可以直接通过向量化,把
θ
\theta
θ和
x
x
x看作向量,直接计算它们的内积,之后一步得到:
通过C++的例子可以很明显的看出两者的区别:
接下来,我们将向量化运用到线性回归算法的梯度下降中。模型参数更新规则如下:
假设
n
n
n=2,即有两个特征变量,可以得到:
这时候,我们把
θ
\theta
θ看做一个向量,然后用
θ
\theta
θ-
α
\alpha
α 乘以某个别的向量
δ
\delta
δ 来更新
θ
\theta
θ,很明显,
δ
\delta
δ=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x^{(i)}
m1i=1∑m(hθ(x(i))−y(i))x(i)。也就是模型参数
θ
\theta
θ的更新规则可以表示为:
θ
=
θ
−
α
δ
\theta=\theta-\alpha\delta
θ=θ−αδ
δ
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
\delta=\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x^{(i)}
δ=m1i=1∑m(hθ(x(i))−y(i))x(i)
再深入一点,
δ
=
[
δ
0
δ
1
δ
2
]
\delta\text{=}\begin{bmatrix} \delta_{0}\\ \delta_{1}\\ \delta_{2}\\ \end{bmatrix}
δ=⎣⎡δ0δ1δ2⎦⎤,
δ
j
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\delta_{j}=\frac{1}{m}\sum\limits_{i=1}^{m}{({{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}})}x_{j}^{(i)}
δj=m1i=1∑m(hθ(x(i))−y(i))xj(i)。其中,
x
(
i
)
=
[
x
0
(
i
)
x
1
(
i
)
x
2
(
i
)
]
x^{(i)}\text{=}\begin{bmatrix} x^{(i)}_{0}\\ x^{(i)}_{1}\\ x^{(i)}_{2}\\ \end{bmatrix}
x(i)=⎣⎢⎡x0(i)x1(i)x2(i)⎦⎥⎤。
h
θ
(
x
(
i
)
)
−
y
(
i
)
{{h}_{\theta }}({{x}^{(i)}})-{{y}^{(i)}}
hθ(x(i))−y(i)是一个常数,
x
(
i
)
x^{(i)}
x(i)是
n
+
1
n+1
n+1维的,所以
δ
\delta
δ也是
n
+
1
n+1
n+1维的。我们就可以这样一步步地将所有变量有向量的形式表示出来。在上一篇中,用Python计算代价函数就是利用的向量化。