向量化计算cell_吴恩达老师课程笔记系列第24节-Octave教程之向量化和作业(6)

5.1 向量化

参考视频: 5 - 6 - Vectorization (14 min).mkv

在这段视频中,我将介绍有关向量化的内容,无论你是用 Octave,还是别的语言,比如MATLAB 或者你正在用 Python、NumPy 或 Java C C++,所有这些语言都具有各种线性代数库,这些库文件都是内置的,容易阅读和获取,他们通常写得很好,已经经过高度优化,通常是数值计算方面的博士或者专业人士开发的。

而当你实现机器学习算法时,如果你能好好利用这些线性代数库,或者数值线性代数库, 并联合调用它们,而不是自己去做那些函数库可以做的事情。如果是这样的话,那么通常你会发现:首先,这样更有效,也就是说运行速度更快,并且更好地利用你的计算机里可能有的一些并行硬件系统等等;其次,这也意味着你可以用更少的代码来实现你需要的功能。因此,实现的方式更简单,代码出现问题的有可能性也就越小。

举个具体的例子:与其自己写代码做矩阵乘法。如果你只在 Octave 中输入 a 乘以 b 就是一个非常有效的两个矩阵相乘的程序。有很多例子可以说明,如果你用合适的向量化方法来实现,你就会有一个简单得多,也有效得多的代码。

让我们来看一些例子:这是一个常见的线性回归假设函数:

8702e9afc54082426b02928b2d22037e.png

如果你想要计算 hθ(x),注意到右边是求和,那么你可以自己计算 j =0 到 j = n 的和。但换另一种方式来想想,把 hθ(x) 看作θTx,那么你就可以写成两个向量的内积,其中 θ 就是θ0、θ1、θ2,如果你有两个特征量,如果 n =2,并且如果你把 x 看作 x0、x1、x2,这两种思考角度,会给你两种不同的实现方式。

ccd1ac1ff1afe79a44f50e5f0870955e.png

比如说,这是未向量化的代码实现方式:

2a7f1ff9fc517a2f16b1377b61506947.png

计算 hθ(x)是未向量化的,我们可能首先要初始化变量 prediction 的值为 0.0,而这个变量 prediction 的最终结果就是 hθ(x),然后我要用一个 for 循环,j 取值 0 到 n+1,变量prediction 每次就通过自身加上 theta(j) 乘以 x(j) 更新值,这个就是算法的代码实现。

顺便我要提醒一下,这里的向量我用的下标是 0,所以我有 θ0、θ1、θ2,但因为 MATLAB 的下标从 1 开始,在 MATLAB 中 θ0,我们可能会用 theta(1) 来表示,这第二个元素最后就会变成,theta(2) 而第三个元素,最终可能就用theta(3) 表示,因为 MATLAB 中的下标从 1 开始,这就是为什么这里我的 for 循环,j 取值从 1 直到 n+1,而不是从 0 到 n。

6cef0abdc5e5cab8a2ad0bcf80827ad9.png

这是一个未向量化的代码实现方式,我们用一个 for 循环对 n 个元素进行加和。作为比较,接下来是向量化的代码实现:

你把 x 和 θ 看做向量,而你只需要令变量 prediction 等于 theta 转置乘以 x,你就可以这样计算。与其写所有这些 for 循环的代码,你只需要一行代码,这行代码就是利用Octave 的高度优化的数值,线性代数算法来计算两个向量 θ 以及 x 的内积,这样向量化的实现更简单,它运行起来也将更加高效。

这就是 Octave 所做的而向量化的方法,在其他编程语言中同样可以实现。让我们来看一个 C++ 的例子:

44a46070f41aa246b4f823159c0f2a2e.png

与此相反,使用较好的 C++ 数值线性代数库,你可以写出像右边这样的代码,因此取决于你的数值线性代数库的内容。你只需要在 C++ 中将两个向量相乘,根据你所使用的数值和线性代数库的使用细节的不同,你最终使用的代码表达方式可能会有些许不同,但是通过一个库来做内积,你可以得到一段更简单、更有效的代码。

现在,让我们来看一个更为复杂的例子,这是线性回归算法梯度下降的更新规则:

a930b5730b78a76cb58fe50753b9ba01.png

我们用这条规则对 j 等于 0、1、2 等等的所有值,更新对象 θj,我只是用 θ0、θ1、θ2 来写方程,假设我们有两个特征量,所以 n 等于 2,这些都是我们需要对 θ0、θ1、θ2 进行更新,这些都应该是同步更新,我们用一个向量化的代码实现,这里是和之前相同的三个方程,只不过写得小一点而已。

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

但让我们用向量化的方式来实现,看看我们是否能够有一个更简单的方法。基本上用三

行代码或者一个 for 循环,一次实现这三个方程。

028fafb4fe81a3c40556f47575e6981f.png

让我们来看看怎样能用这三步,并将它们压缩成一行向量化的代码来实现。做法如下: 我打算把θ 看做一个向量,然后我用 θ-α 乘以某个别的向量δ 来更新θ。

这里的 δ 等于

6d1637cc7bc9a519a5db7124b277ea90.png

让我解释一下是怎么回事:我要把θ 看作一个向量,有一个 n+1 维向量,α 是一个实数,δ 在这里是一个向量。

所以这个减法运算是一个向量减法,因为 α 乘以 δ是一个向量,所以 θ 就是 θ- αδ 得到的向量。

那么什么是向量 δ 呢 ?

ea07931e9d21576b0b162310f2c70b3f.png

x(i)是一个向量

8d125726a1ff0a80847349f5a08770e1.png

你就会得到这些不同的式子,然后作加和。

776cea00e539733fd5e9acf12a665fc6.png
80af7339eb8cf09905ea01326ec2c9fe.png

实际上,在以前的一个小测验,如果你要解这个方程,我们说过为了向量化这段代码, 我们会令 u = 2v +5w 因此,我们说向量 u 等于 2 乘以向量 v 加上 5 乘以向量 w。用这个例子说明,如何对不同的向量进行相加,这里的求和是同样的道理。

这就是为什么我们能够向量化地实现线性回归。

所以,我希望步骤是有逻辑的。请务必看视频,并且保证你确实能理解它。如果你实在不能理解它们数学上等价的原因,你就直接实现这个算法,也是能得到正确答案的。所以即使你没有完全理解为何是等价的,如果只是实现这种算法,你仍然能实现线性回归算法。如果你能弄清楚为什么这两个步骤是等价的,那我希望你可以对向量化有一个更好的理解,如果你在实现线性回归的时候,使用一个或两个以上的特征量。

有时我们使用几十或几百个特征量来计算线性归回,当你使用向量化地实现线性回归, 通常运行速度就会比你以前用你的 for 循环快的多,也就是自己写代码更新θ0、θ1、θ2。

因此使用向量化实现方式,你应该是能够得到一个高效得多的线性回归算法。而当你向量化我们将在之后的课程里面学到的算法,这会是一个很好的技巧,无论是对于 Octave 或者一些其他的语言 如 C++、Java 来让你的代码运行得更高效。

5.2 工作和提交的编程练习

参考视频: 5 - 7 - Working on and Submitting Programming Exercises (4 min).mkv

643a0f72b896c307600d585550da3012.png

在这段视频中,我想很快地介绍一下这门课程做作业的流程,以及如何使用作业提交系统。这个提交系统可以即时检验你的机器学习程序答案是否正确。

在 'ml-class-ex1' 目录中,我们提供了大量的文件,其中有一些需要由你自己来编辑,因此第一个文件应该符合编程练习中 pdf 文件的要求,其中一个我们要求你编写的文件是warmUpExercise.m 这个文件,这个文件只是为了确保你熟悉提交系统。

你需要做的就是提交一个 5×5 的矩阵,就是 A = eye(5)

这将修改该函数以产生 5×5 的单位矩阵,现在 warmUpExercise() 这个方程就实现了返回 5x5 的单位矩阵,将它保存一下,所以我已经完成了作业的第一部分。

136689ab0ada2e99718fabb2f6cf313c.png

现在回到我的 Octave 窗口,现在来到我的目录 C:甥敳獲angDesktopml-class-ex1

c0a06bee0d390068288ab52e7c356f31.png

如果我想确保我已经实现了程序 像这样输入'warmUpExercise()' 好了它返回了我们用刚才写的代码创建的一个 5x5 的单位矩阵

我现在可以按如下步骤提交代码 我要在这里目录下键入 submit()

我要提交第一部分 所以我选择输入'1'。

这时它问我的电子邮件地址,我们打开课程网站,输入用户名密码。

1d6fa47908a7f3273518b6356ed6f899.png

按下回车键,它连接到服务器,并将其提交,然后它就会立刻告诉你:恭喜您!已成功完成作业 1 第 1 部分。这就确认了你已经做对了第一部分练习,如果你提交的答案不正确,那么它会给你一条消息,说明你没有完全答对,您还可以继续使用此提交密码,也可以生成新密码。你的密码是否会显示出来 取决于你使用的操作系统。

这就是提交作业的方法,你完成家庭作业的时候,我希望你都能答对。

欢迎关注我的公众号LhWorld,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

b4e582e0bc98589d93c4652da9a90a2f.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值