在阅读Spark ML源码的过程中,发现很多机器学习中的优化问题,都是直接调用breeze库解决的,因此拿来breeze源码想一探究竟。整体来看,breeze是一个用scala实现的基础数学库,breeze之于Spark ML,就像numpy和scipy之于sklearn一样,很多Spark ML中的优化问题,看到后面发现都是在breeze库中解决的,对于有志于理解底层实现的朋友来说,breeze是一本很好的教科书。
虽然breeze仅2.5MB代码,比Spark ML仅多了40%,但阅读的难度大不少,因为breeze相对更偏底层,用到了很多scala语言的核心特征,尤其是scala的类型系统和隐式转换,如果这两部分功底不足阅读上会有很大障碍,这里推荐一本书,Scala in Depth,都说中文版翻译的很差,我也没读过,还是直接看英文版吧,讲的很清楚。
啰啰嗦嗦一大堆,现在就领着大家走马观花的逛一逛breeze这个库,笔者也是工作之余在看,接触没多久,还请高手指教。
阅读的起点最好是generic文件夹,其中包含了breeze中最底层的UFunc特征,这是用来表达breeze中操作、函数等一系列内容的基础类,它主要是提供了一大堆模板,用来产生具体的操作和函数,代码晦涩难懂,如果实在看不懂可以跳过,知道这是一个关于操作和函数的底层基础类就好了。另外还包含了Multimethod.scala,这个特征用来提供一些注册器,产生一个方法时,我们可以先在这里注册,当我们需要用到一个方法的时候,它可以利用动态反射原理,在已注册方法中挑选出合适的方法返回。具体应用我也没搞清。
接下来就可以进入math库看看了,这里面包含了很多基础数学的结构,需要一定的集合论知识。首先,是Semiring, Ring, Field,分别代表半环、环、域,分别定义了各自的基础结构,其中,大多数实际定义都在Field中,因为域是三者中要求最高、也最具体的集合类型,而Semiring和Ring中的内容,都是从Field中迁移过去的。然后是Complex.scala,定义了复数,以及相关的很多操作,LogDouble.scala,定义了对数表示的各种运算,MatrixNorms.scala,定义了各类矩阵Norm的计算方法,PowImplicits.scala,利用隐式转换,为各类基础方法加入了pow方法(隐式转换的典型应用:扩展以后类,为以后类添加方法),最后是VectorSpace.scala,顾名思义定义了线性空间相关的操作,这里面的trait关系太复杂,关系图画了半天放弃了,有时间再来理理清楚。
然后可以进入linalg库,这是breeze最大的一个库,但结构相对来说非常清晰,根目录下定义了线性代数常用的数据结构,比如Vector, Matrix, DenseMatrix, CSCMatrix等等,还有一些线性代数里的基本操作,比如LSMR包含了一种通过迭代求最小二乘问题的算法,pca包含了PCA算法等,这里的类都非常基础,代码相对来说也比较难懂。但子目录下的代码就相对好很多了,support包含了一系列的trait,这些trait大多以Can开头,顾名思义就是表示某个类是否具有某种能力,比如CanCopy表示是否能够被拷贝,CanSlice表示是否能够被索引等等。function文件夹下包含了各种函数功能,比如Max,Accumulate,Argmax等等。operators文件夹中包含了一般性的操作定义,比如BinaryOp, CounterOp等等,代码也较为晦涩。
再看看stats库,这里面最重要的就是distribution文件夹,里面包含了各种基础的分布的表示方法,分布的表示分为离散型和连续型,这个库可以作为一个数学中概率论和数理统计、随机过程的学习教材,基本原理都来自概率数学,而且代码结构非常清晰,对于理解各类机器学习算法也非常重要,推荐仔细阅读。stats库中其余的内容都比较直接,就不一一介绍了。
终于进入了我们最关心的optimize库,这是一个通用的优化库,包含了线性优化、Proximal优化、流优化、凸优化等等。也是非常好的优化教程,正在学习最优化的朋友如果对实现感兴趣可以仔细阅读这一块的代码,非常受用。当然,对于机器学习算法来说,最重要的还是LBFGS和OWLQN,这两个分别是求解一般线性模型中的二次最优化问题时最常用的算法,LBFGS用于求解L2正则化的问题,OWLQN是LBFGS算法的变种,用于求解L1正则化问题。这里比较重要的是DiffFunction和Minimizer,分别代表了损失和最小优化器,也是breeze的optimize重要的两个对外接口,在Spark ML库中就经常见到这俩函数。前者返回损失和梯度信息,后者统筹优化算法迭代,有兴趣可以看下这两个类以及它们的子类。
以上我们介绍的generic, math, linalg, stats, optimize都是breeze中的基础库,另外的库属于附加库,下面我们一句话介绍下它们的内容,对特定领域感兴趣的朋友可以深入阅读源码。
collection包含了breeze中常用的集合类型,也可以算是基础库,它包含了可变和不可变集合两个内容。features包含了一个特征向量的定义。integrate包含了积分相关的内容。interpolation包含了插值计算相关的内容。io包含了输入输出内容,比如读写csv文件。numeric包含了数值计算相关的内容,其中包含了CODATA2010定义的一些常数。polynomial包含了多项式相关的计算、signal包含了信号处理相关的计算,比如各种滤波函数。storage包含了存储相关的库。util包含了一些应用功能。
以上就简单的走马观花式介绍了breeze,欢迎感兴趣的朋友一起探讨。我最近也在持续阅读,有更细节的体会也会及时发出来跟大家交流。

转载于:https://www.cnblogs.com/jicanghai/p/8686531.html

breeze源码阅读心得相关推荐

  1. ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 一.心得分享 如何阅读ZooKeeper源码?从哪里开始阅读?最近把ZooKeeper源码看了个 ...

  2. 源码阅读心得11-13

    11.对float赋值的时候情况,float f = 0.75f.我竟然从未声明过float变量,以前都是cast而来的. 12.在循环中,要使用StringBuffer/StringBuilder而 ...

  3. Hive源码阅读之路

    Hive源码阅读(1)阅读环境搭建 前言:让学习成为一种习惯 环境准备 Hive源码下载 Hive源码目录 hive三个最重要的组件: 其他组件 hive辅助组件 编译源码 配置Hive本地调试 配置 ...

  4. Soul 网关源码阅读(一) 概览

    Soul 源码阅读(一) 概览 简介     阅读soul的官方文档,大致了解soul的功能和相关概念 心得     需要对网关的功能有个大致的了解,把soul官方文档读两遍(第一遍通读,能看懂多少是 ...

  5. 文本匹配开山之作-DSSM论文笔记及源码阅读(类似于sampled softmax训练方式思考)

    文章目录 前言 DSSM框架简要介绍 模型结构 输入 Encoder层 相似度Score计算 训练方式解读 训练数据 训练目标 训练方式总结 DSSM源码阅读 训练数据中输入有负样本的情况 输入数据 ...

  6. 【Vue原理】Vue源码阅读总结大会

    专注 Vue 源码分享,为了方便大家理解,分为了白话版和 源码版,白话版可以轻松理解工作原理和设计思想,源码版可以更清楚内部操作和 Vue的美,喜欢我就关注我的公众号,好吧兄弟,不会让你失望的 阅读源 ...

  7. sfm三维重建源码_OpenMVG源码阅读小记

    "读一份好源码,就是和许多智慧的人谈话". 本文记录了笔者学习 openMVG 开源软件的一些初步经验和心得.如果你对计算机视觉和摄影测量有兴趣,需要用到相关技术,这篇文章正好就是 ...

  8. 应用监控CAT之cat-client源码阅读(一)

    CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...

  9. centos下将vim配置为强大的源码阅读器

    每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...

最新文章

  1. 山科大计算机专业排名,山东科技大学专业排名情况
  2. 关于[UITableView setEditing:YES animated:YES] 没有animation
  3. Android之运行的错误:java.lang.UnsatisfiedLinkError: Couldn‘t find cibloger.so
  4. elasticsearch简介(大数据技术)
  5. cad致命错误如何处理_Golang 如何优雅地处理错误
  6. java collections_扫盲java.util.Collections工具包,学习排序、二分、洗牌、旋转算法
  7. 第一次搭建vue项目--添加依赖包、启动项目
  8. mysql执行ref_MySql执行分析
  9. 一文读懂公有云的现状与未来
  10. Empire C:Basic 4
  11. [leetcode]15. 三数之和
  12. plsql查询不显示结果_管理NVivo的查询结果
  13. sql2012,返回数据多时不走索引
  14. pycharm添加python注释头_pycharm使用教程——py文件自动添加文件头注释
  15. C# 实现局域网的windows环境下的桌面分享
  16. HDU-1728-逃离迷宫
  17. GhostXP_SP3电脑装机终极版V9.7 (NTFS版)
  18. Android 科大讯飞语音评测SDK 踩坑实录
  19. UE4学习笔记--EQS系统
  20. 手游平台搭建技术对接文档

热门文章

  1. 微信小程序开发实战(二)UI组件介绍 Vant Weapp
  2. C++ 指向常量的指针与指针类型的常量
  3. B1091 N-自守数 (15分)
  4. SQLServer图数据库一些优点
  5. 使用scanf()函数接收带空格的字符串
  6. MeteoInfoLab脚本示例:Streamline流线图
  7. PAT (Basic Level) Practise:1017. A除以B
  8. 简单实用的Windows命令(一)
  9. jquery效果案例学习站
  10. Redis5.0:这些场景下使用,高效还降低成本!