大多数工科学生或者刚刚入门近年来比较火的“人工智能”相关算法的同学,在选择语言的时候,都会选择MATLAB、 Python 、R等等这些高级语言,对自己所学的算法进行实现和调试。这些高级语言中,包含了实现复杂算法的基础数学算法、基本统计算法、基础数据结构的实现,比如均值(mean)、方差(std)、向量(Vector)等等。借助于这些高级语言的Built-in Function,我们的一些想法会在较短时间内实现。并且,解释型的编程方式,也方便了大家去调试代码、运行代码。但是使用这些语言和它们的函数,会带来一些效率降低的问题。大多数人首先想到的解决方式,可能是去选择底层语言来实现算法,比如C/C++, JAVA等。但其实,我们在运用高级语言进行编码时,也有大量需要进行优化的内容。我们应当从“调包”和利用Built-in Function的习惯中解放出来。

问题

最近在用C++实现CUSUM时,我参考该算法的MATLAB的代码直接翻译成了C++的代码。本想到算法应该会非常迅速,但是它的表现的确让我大失所望。在优化掉输出( ostream )带来的时间损耗后,算法的速度依然没有达到期望的要求。于是,观察代码细节时发现,在迭代过程中,我们对一段随迭代次数其长度线性增长的数组片段( slice )求取均值、方差时,使用了 mean() 和 std() 函数。

那么,每一次新的数据添加进一个数组(Array或者Vector),就去调用上述这类函数,真的有必要嘛?我们是不是引入了太多的重复计算?

解决方案

我们先来看一下CUSUM算法的MATLAB实现的一个片段:

%% Global Loop

% w = waitbar(0,'Calculating Cumulative Sums, please wait...');

while k < length(x)

% current sample

k = k+1;

% mean and variance estimation (from initial to current sample)

m(k) = mean(x(k0:k));

v(k) = var(x(k0:k));

复制代码

上述代码片段里,在 while 循环中,我们调用了 length(x) 次函数 mean 和 std ,这其中包含了大量的重复计算,带来了大量的计算开销(计算均值,肯定有大量的加和操作)。假设我们已经计算了实数数组 的均值,记为 。当一个新的数据 被采样到,并加入 中,形成 。在计算均值 时,可以利用以下公式:

同理,我们可以得到计算新方差的公式:

新的编码方案就变成:

// Global Loop

while (k < len - 1) {

k++;

prev_delta = X[k] - m[k - 1]; // online average

m.emplace_back(m[k - 1] + prev_delta / (k - k0 + 1));

post_delta = X[k] - m[k]; // online s.t.d

v.emplace_back(std::sqrt(v[k - 1]*v[k - 1] + prev_delta*post_delta));

复制代码

这样计算速度就快很多了。

思考

如上所述的这种从左至右计算统计量的过程,在很多算法中出现过,比如著名的 决策树 算法。决策树在某个节点确定分裂特征和分裂点的计算过程中,是如何进行计算统计量的呢?著名的决策树开源框架,如XGBoost中,又是如何编码,对样本梯度进行统计的呢?这些留给大家去思考和发现。

python调包侠_拒绝调包侠,不需要高级算法和数据结构技巧相关推荐

  1. python 模块 包 库_模块(包、库)

    模块的基本概念: 模块是程序,它就是一个扩展名为.py的python程序.因此对于一个.py的python文件而言,既可以把它当作程序来执行,也可以将它作为模块引入. 导入一个模块时,python解释 ...

  2. axis2 jar包冲突_一个jar包冲突引起的StackOverflowError

    项目运行中错误信息:java.lang.IllegalStateException: Unable to complete the scan for annotations for web appli ...

  3. java更改包名称_更改Java包名称如何改变我的系统架构

    java更改包名称 即使只是少量更改角度,也可能对您如何使用系统产生深远影响. 假设您正在用Java编写Web应用程序. 在系统中,您处理订单,客户和产品. 作为一个Web应用程序,您的类包括诸如Co ...

  4. python网络安全怎么学_学习网络安全包住宿

    学习网络安全包住宿,学员活动开班学员上课学校环境学院宿舍环境线下就业培训往期部分学员薪资. 学习网络安全包住宿, 网络安全人才严重匮乏,缺口超过70万.必火网络安全学院,实打实的为就业而生,为年薪30 ...

  5. python源码包安装_源码包安装python2.7.6和ipython1.2.1

    1. CentOS 6.X的安装就不多说 2.安装包Python2.7.6 和Ipython的下载官网都有,自行下载. 注意,不要去卸载系统自带的python程序,在CentOS6.X中python为 ...

  6. idea创建包怎么让包分层_干货 | 通勤包怎么选?我推荐这6只

    大家好,我是原「饲主的日常」的编辑赤楠. 最近「饲主的日常」刚刚正式完成改版,变成了关注奢侈品领域的媒体号「Origin 原物志」,进化论每周四也固定为奢侈品专栏了. 还没关注「 Origin 原物志 ...

  7. 台式计算机亮度设置,怎么调台式电脑亮度_怎么调台式电脑的亮度

    我们在使用电脑过程中,看久了就会眼睛疲劳,这样我们可以调整电脑的亮度来减缓一键疲劳,电脑亮度对大家来说是不一样的,因为每个人的适应度是不一样的,有的喜欢亮一点的,有的喜欢暗一点的,那么我们要怎么调整台 ...

  8. 电子琴节奏包制作_外卖料理包未来的命运,存在还是毁灭?

    去年十一月份,一条视频登上微博热搜榜,暗访视频曝出杠岗香生产劣质料理包,引起轩然大波,同时也让料理包呈现在大众视野. 最近,网上又传出"黑心店"新闻,内容是几位杭州餐厅老板指出自己 ...

  9. java中如何改变包结构_修改jar包package目录结构操作方法

    开发中会遇到用第三方的jar包,有时候会出现不同的jar包,包名一致的情况,这就会引发运行时异常,找不到相应的jar包. 这种问题时常困扰我们很长时间.下面提出一种解决办法,例如gson.jar. 1 ...

最新文章

  1. iOS调用系统相机文字改为中文
  2. 企业如何进行团队协作?
  3. centos 7 php7.4_索尼小音箱特价!【Aldi】7月7日起 特卖品 及本期特价食品
  4. Codeforces #440.Div.2
  5. mysql置疑原因_SQLSERVER数据库经常置疑的原因
  6. C++笔记-QSslSocket::supportsSsl返回false(windows版的Qt不支持SSL)解决
  7. 轻量级前端MVVM框架avalon - 整体架构
  8. viewpager fragment FragmentStatePagerAdapter数据删除后更新界面
  9. MathType中如何快速输入空心字母
  10. Redis学习笔记~Redis并发锁机制
  11. 04【副词】(Adverb)位置,形态,时间/频度副词,强调?
  12. 相机标定与三维重建原理
  13. 抖音爆火微信每日早安推送
  14. Python通讯录案例
  15. 苹果Home键恢复(无工具篇)
  16. 牛客 20859 兔子的名字
  17. Windows10和Ubuntu双系统如何卸载Ubuntu系统
  18. 弥散阴影html,设计弥散阴影效果海报图片的PS实例教程
  19. java期末心得,java期末小结
  20. 联想z5可以刷鸿蒙系统吗,联想Z5 Pro GT刷机教程_Z5ProGT线刷升级更新官方系统包的方法...

热门文章

  1. 解决Docker容器内访问宿主机MySQL数据库服务器的问题
  2. 解决javascript动态改变img的src属性图片不显示问题
  3. 将两个列表连接在一起
  4. 从Git存储库中删除文件而不从本地文件系统中删除它
  5. String和C#中的string有什么区别?
  6. 《2018-2019全球IPv6支持度白皮书》发布,江北新区IPv6示范区建设正式启动
  7. Flask restful api与blueprint结合实践
  8. Notepad++使用vs2015主题教程
  9. 重新建立域计算机账户与域控制器的联系
  10. 职场疑问:如何进行技术面试