在学习机器学习时,无论你是用Octave,还是MATLAB、Python、NumPy 或 Java C C++所有这些语言,它们都具有各种线性代数库,这些库文件都是内置的,是数值计算方面的博士或者专业人士开发的,已经经过高度优化,使用方便有效,运行速度也更快。在我们实现机器学习算法时,应当好好利用这些线性代数库或者数值线性代数库,而不是自己去做那些函数库可以做的事情。
在Octave中直接可以实现两个矩阵相乘的运算。所以,我们可以用合适的向量化方法来实现,编写一个简单得多,也有效得多的代码。 例如,常见的线性回归假设函数是这样的:,对于假设函数值的计算,我们需要进行多项求和。但是,如果我们同时用n+1维列向量表示参数和变量,即
,则假设函数可以简化记为两个向量的内积:
。比较一下向量化和未向量化之间代码差别:
- 未向量化的代码实现方式,我们用一个 for 循环对n个元素进行加和,matlab的下标从1开始
- 作为比较,接下来是向量化的代码实现
再看一个例子,对于性回归算法梯度下降的更新规则:
最简单方法就是用一个for循环令j=0、1、2、3......来不断更新参数 。但让我们用向量化的方式来实现,可以更加简单,做法如下:
我打算把θ看做一个n+1维向量, δ=,更新规则就变成了
。这是个向量减法,因为α乘以 δ是一个向量,所以就是θ- α δ得到的向量。对于 δ来看,
是一个向量,δ最终就是作加和。
当我们使用几十或几百个特征量来计算线性归回,向量化地实现线性回归,通常运行速度就会比你以前用你的for循环快的多。因此使用向量化实现方式,你应该是能够得到一个高效得多的线性回归算法,这会是一个很好的技巧,无论是对于Octave 或者一些其他的语言 如C++、Java 来让你的代码运行得更高效。