在阅读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,欢迎感兴趣的朋友一起探讨。我最近也在持续阅读,有更细节的体会也会及时发出来跟大家交流。

breeze源码阅读心得的更多相关文章

  1. ThinkPhp 源码阅读心得

    php 中header 函数 我可能见多了,只要用来跳转.今天在阅读TP源码的时候发现,header函数有第三个参数.有些困惑所以找到手册查阅下,发现 void header ( string $st ...

  2. mybatis源码阅读心得

    第一天阅读源码及创建时序图.(第一次用prosson画时序图,挺丑..) 1.  调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法: 2.   ...

  3. commons-io源码阅读心得

    FileCleanTracker: 开启一个守护线程在后台默默的删除文件. /* * Licensed to the Apache Software Foundation (ASF) under on ...

  4. 源码阅读之mongoengine(0)

    最近工作上用到了mongodb,之前只是草草了解了一下.对于NoSQL的了解也不是太多.所以想趁机多学习一下. 工作的项目直接用了pymongo来操作直接操作mongodb.对于用惯了Djongo O ...

  5. 【安卓本卓】Android系统源码篇之(一)源码获取、源码目录结构及源码阅读工具简介

    前言        古人常说,“熟读唐诗三百首,不会作诗也会吟”,说明了大量阅读诗歌名篇对学习作诗有非常大的帮助.做开发也一样,Android源码是全世界最优秀的Android工程师编写的代码,也是A ...

  6. Redis源码阅读(一)事件机制

    Redis源码阅读(一)事件机制 Redis作为一款NoSQL非关系内存数据库,具有很高的读写性能,且原生支持的数据类型丰富,被广泛的作为缓存.分布式数据库.消息队列等应用.此外Redis还有许多高可 ...

  7. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  8. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  9. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

随机推荐

  1. Java语法 示例

    第二章: int:整型 double:双精度浮点型 char:字符型 String:字符串型语法:数据类型 变量名: 如:String name: 变量名=值: 如:name="张三&quo ...

  2. 启动就加载(一)----注解方式实现的。static项目启动的时候就加载进来(一般用于常用参数)

    一,案例 1.1,图片分析 1.2,代码 1.2.1,编写加载系统参数的servlet public class SysInitServlet extends HttpServlet { public ...

  3. PyTorch官方中文文档:torch

    torch 包 torch 包含了多维张量的数据结构以及基于其上的多种数学操作.另外,它也提供了多种工具,其中一些可以更有效地对张量和任意类型进行序列化. 它有CUDA 的对应实现,可以在NVIDIA ...

  4. es6学习笔记--解构赋值

    昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.   数组的解构 ...

  5. 简述MyBatis的体系结构

    MyBatis体系结构主要由以下几个关键部分: 1.加载配置 配置有两种形式:一种是xml配置文件,另一种是java代码的注解MyBatis将SQL的配置信息加载成为一个个的MappedStateme ...

  6. 在VCS仿真器中使用FSDB[转载]

    来源:https://www.cnblogs.com/catannie/p/8099331.html FSDB(Fast Signal Database)是Verdi支持的文件格式,用于保存仿真产生的 ...

  7. luogu【P3377】 【模板】左偏树

    左偏树 顾名思义 向左偏的树 (原题入口) 它有啥子用呢??? 当然是进行堆的合并啦2333普通堆的合并其实是有点慢的(用优先队列的话 只能 一个pop 一个push 来操作 复杂度就是O(n log ...

  8. $HNOI\ 2010$ 解题报告

    HNOI 2010 解题报告 0. HNOI2010 AC代码包下载地址 注: 戳上面的标题中的'地址' 下载 代码包, 戳下面每一题的文件名 可进入 题目链接. 每一题 对应代码的文件名 我在 每一 ...

  9. NTT中可用素数模数原根表

    常用素数: P = 1004535809 ====> pr = 3 P = 998244353 =====> pr = 3 //(g 是mod(r*2^k+1)的原根) 素数 r k g ...

  10. [BZOJ4198] [Noi2015] 荷马史诗 (贪心)

    Description 追逐影子的人,自己就是影子. ——荷马   Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是 ...