Vectorization in Machine Learning

对于有些问题,如果使用了合适的向量化方法,代码就会变得简单得多而且有效得多。

我们来看一些例子:

这是一个常见的线性回归假设函数:

如果想要计算h(x),注意右边是一个求和公式。那么可以自己来计算 j = 0到 j = n的和。

但换另一种方式来想一想,把h(x)看做是θ的转置乘以x,那么就可以表示成两个向量的内积。假设这里有两个特征向量(也就是n等于2)的话,那么θ就是[θ_0; θ_1; θ_2],并且把x看做一个向量,x = [x_0; x_1; x_2]。

这两种思考角度,会给你两种不同的实现方式。

如下图所示,左边是未向量化的代码来计算h(x)。这样的话,我们可能首先要初始化变量prediction的值为0.0,而这个变量prediction的最终结果就是h(x)。然后要用一个for循环,j取值1到n+1,变量prediction每次更新为自身加上θ(j) * x(j),这个就是算法的代码实现。

顺便提醒一下,这里的向量用的下标是从0开始的,但因为MATLAB下标从1开始,在MATLAB中可能会用θ1来表示θ0,θ1用θ2来表示,而第三个元素就用θ3表示。

尽管实际的θ和x,下标从0开始,但MATLAB中的向量下标从1开始。这就是为什么这里的for循环中j的取值是从1到n+1,而不是从0到n。

这是一个未向量化的代码实现方式,我们要用一个for循环对n个元素进行加和。

作为比较,接下来是向量化的代码实现。

将x和θ看做向量,然后只需要令prediction等于θ的转置乘以x。与其写for循环的多行代码,而现在只需要一行代码,这行代码就是利用Octave高度优化的数值线性代数算法,来计算θ和x两个向量的内积。向量化的实现方式不仅代码更简单,也会让运行更高效。

这就是Octave所做的,而向量化的方法,在其他编程语言中同样可以实现。

来看一个用C++实现的例子:

这就是未向量化的代码。同样地先初始化变量prediction为0.0,然后是一个for循环,j等于从0到n,然后变量prediction每次等于自身加上 θ[j] * x[j]。

这样也是自己写了一个for循环。与此相反,利用C++数值线性代数库,就可以用下图这个方程,这取决于你的数值线性代数库的内容,或许可以有一个C++对象向量theta和另一个C++对象向量x,然后只需要用 theta.transpose() * x  ,然后让C++来实现运算。只需要在C++中让两个向量相乘。根据你所使用的数值线性代数库,代码表达方式可能会有些许不同,但通过一个内置库来计算内积,可以得到一段更简单更有效的代码。

 

再来看一个更为复杂的例子:

先提醒一下线性回归梯度下降算法的更新规则,对 j 等于 0、1、2等等的所有值,更新对象θ_j。假设只有两个特征量,也就是n等于2。然后罗列一些方程,用θ_0、θ_1、θ_2做例子。并且这些更新应该是同步更新的。

 

下面是同样的三个方程:

可以想象,实现这三个方程的方法就是用一个for循环,让 j 等于 0、1、2来更新θ_j。

但下面来用向量化的方式实现。看看是否有更简单的方法来压缩这三行代码,或者说是这个for循环,一次来实现这三个方程。

接下来给出将这三步压缩成一行的向量化的代码。思路是这样的:将θ看做一个向量,然后更新向量θ为θ减去α乘以某个向量δ,这里的 δ等于1/m 乘以 从i=1到m的一个表达式的总和,如下图所示。

下面来解释一下,把θ看做一个向量,一个n+1维的向量。α是一个实数,而δ是一个n+1维的向量,所以这个减法是一个向量减法。因为α乘以δ是一个向量,所以θ更新为θ - α乘以 δ得到的向量。那么向量δ是什么呢?其实就是下图红色框内的部分:

 

具体地说,δ是n+1维向量,向量δ的第一个元素就是下图绿色框中的部分:

如果δ下标从0开始,δ就是下图这样子,其中δ_0就是上一张图的绿色框内的部分:

 

如果在实施线性回归的时候,使用两个以上的特征量,有时我们在线性回归中使用几十、几百个、甚至几千个特征,当使用向量化实现线性回归时,相比过去使用for循环来更新θ_0、θ_1、θ_2,通常运行速度会更快。使用向量化实现方式,应该能够得到一个高效得多的线性回归算法。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值