矢量化编程

当使用学习算法时,一段更快的代码通常意味着项目进展更快。例如,如果你的学习算法需要花费20分钟运行完成,这意味着你每个小时能“尝试”3个新主意。但是假如你的程序需要20个小时来运行,这意味着你一天只能“尝试”一个新主意,因为你需要花费这么长时间来等待程序的反馈。对于后者,假如你可以提升代码的效率让其只需要运行10个小时,那么你的效率差不多提升一倍。

矢量化编程是提高算法速度的一种有效方法。为了提升特定数值运算操作(如矩阵相乘、矩阵相加、矩阵-向量乘法等)的速度,数值计算和并行计算的研究人员已经努力了几十年。矢量化编程的思想就是尽量使用这些被高度优化的数值运算操作来实现我们的学习算法。

例如,假设 为向量,需要计算 ,那么可以按以下方式实现(使用Matlab):

z = 0;
for i=1:(n+1),z = z + theta(i) * x(i);
end;

或者可以更加简单的写为:

z = theta' * x;

第二段程序代码不仅简单,而且运行速度更快。

通常,一个编写Matlab/Octave程序的诀窍是:

代码中尽可能避免显式的for循环。

上面的第一段代码使用了一个显式的for循环。通过不使用for循环实现相同功能,可以显著提升运行速度。对Matlab/Octave代码进行矢量化的工作很大一部分集中在避免使用for循环上,因为这可以使得Matlab/Octave更多地利用代码中的并行性,同时其解释器的计算开销更小。

关于编写代码的策略,开始时你会觉得矢量化代码更难编写、阅读和调试,但你需要在编码和调试的便捷性与运行时间之间做个权衡。因此,刚开始编写程序的时候,你可能会选择不使用太多矢量化技巧来实现你的算法,并验证它是否正确(可能只在一个小问题上验证)。在确定它正确后,你可以每次只矢量化一小段代码,并在这段代码之后暂停,以验证矢量化后的代码计算结果和之前是否相同。最后,你会有望得到一份正确的、经过调试的、矢量化且有效率的代码。

一旦对矢量化常见的方法和技巧熟悉后,你将会发现对代码进行矢量化通常并不太费劲。矢量化可以使你的代码运行的更快,而且在某些情况下,还简化了你的代码。

中英文对照

矢量化 vectorization

from: http://ufldl.stanford.edu/wiki/index.php/%E7%9F%A2%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B

Stanford UFLDL教程 矢量化编程相关推荐

  1. Stanford UFLDL教程 池化Pooling

    池化 Contents [hide] 1 池化: 概述 2 池化的不变性 3 形式化描述 4 中英文对照 5 中文译者 池化: 概述 在通过卷积获得了特征 (features) 之后,下一步我们希望利 ...

  2. Stanford UFLDL教程 主成分分析(PCA)

    Stanford UFLDL教程 主成分分析 Contents [hide] 1 引言 2 实例和数学背景 3 旋转数据 4 数据降维 5 还原近似数据 6 选择主成分个数 7 对图像数据应用PCA算 ...

  3. matlab 矢量化编程(二)—— 使用 meshgrid

    matlab 矩阵矢量化编程 使用 meshgrid 使用 meshgrid 避免二重循环. patchSize = 17;pixel_weights = zeros(patchSize); mid ...

  4. matlab 矢量化,matlab矢量化编程简要

    一.基本技术 1)MATLAB索引或引用(MATLAB Indexing or Referencing) 在MATLAB中有三种基本方法可以选取一个矩阵的子阵.它们分别是下标法,线性法和逻辑法(sub ...

  5. Stanford UFLDL教程 自编码算法与稀疏性

    自编码算法与稀疏性 目前为止,我们已经讨论了神经网络在有监督学习中的应用.在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合 ,其中 .自编码神经网络是一种无监督 ...

  6. Stanford UFLDL教程 梯度检验与高级优化

    梯度检验与高级优化 众所周知,反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug时.举例来说,索引的缺位错误(off-by-one error)会导致只有部分层的权重得到训练, ...

  7. Stanford UFLDL教程 稀疏编码自编码表达

    稀疏编码自编码表达 Contents [hide] 1稀疏编码 2拓扑稀疏编码 3稀疏编码实践 3.1将样本分批为"迷你块" 3.2良好的s初始值 3.3可运行算法 4中英文对照 ...

  8. Stanford UFLDL教程 稀疏编码

    稀疏编码 Contents [hide] 1稀疏编码 2概率解释 [基于1996年Olshausen与Field的理论] 3学习算法 4中英文对照 5中文译者 稀疏编码 稀疏编码算法是一种无监督学习方 ...

  9. Stanford UFLDL教程 数据预处理

    数据预处理 Contents [hide] 1概要 2数据归一化 2.1简单缩放 2.2逐样本均值消减 2.3特征标准化 3PCA/ZCA白化 3.1基于重构的模型 3.2基于正交化ICA的模型 4大 ...

最新文章

  1. APP启动原理,APPdelegate程序状态解析
  2. protobuf-c使用说明
  3. Java的Gradle依赖关系,使用编译还是实现?
  4. Java-break-continue
  5. splitlines
  6. LINQ to SQL的不足
  7. JDBC中数据库连接池的使用与传统方式的比较
  8. bulk insert 总结
  9. 三菱PlC程序大型项目QCPU+QD77MS16 宝贝包含一套完整的电气开发系统资料(包含plc程序,触摸屏程序,伺服模块设置程序,程序开发地址规划表)
  10. 全国医院排名(2008)
  11. Oracle基本知识点总结
  12. 百度输入法皮肤工具提示 CSS,如何利用百度输入法超级皮肤增加特别键盘
  13. 使用MRC(机器阅读理解)方式做事件抽取任务,基于2020百度事件抽取任务
  14. 【女人8大隐私部位越丑越健康】
  15. python 0x0101_Python中ASCII转十六进制、C中BCD转十进制、十六进制学习记录
  16. 计算机网络——云计算
  17. python演化博弈仿真_演化博弈应用:例子与思路
  18. C++之设置背景图片(Easyx)
  19. 微信小程序过审:怎么绕过微信小程序上线审核,并且不影响正常用户使用,有用记得点赞哈
  20. 新疆计算机考试ppt教程,新疆维吾尔自治区2019年9月计算机一级考试复习教程:计算机基础及WPS Office应用...

热门文章

  1. Quartz-JobDataMap 参数传递
  2. Python Number(数字)
  3. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0x8b in position 1: invalid start byte
  4. Qt CheckBox的使用
  5. python随机生成中文字符串_利用python3随机生成中文字符的实现方法
  6. html制作主体部分,html – 使用CSS制作具有动态面板主体高度的面板填充父容器高度的其余部分...
  7. 目录创建 android,创建目录浏览器  |  Android 开发者  |  Android Developers
  8. 查看oracle自定义函数,Oracle自定义函数查询数据字典项
  9. order by 空值排在最后_当梅根·马克尔最后一次皇室活动选择选择翡翠绿时证明她非常时髦...
  10. tf.nn.softmax参数详解以及作用