在阅读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. hihocoder Challenge 29 D. 不上升序列

    这场爆零比赛题目还是要补的 这道题据说是出烂掉的原题,我找了下 CF13.C/ CF371 div1 C,一模一样 我服这群原题大佬 为 当时,使 不严格递增的最小步数,那么 Otherwise 显然 ...

  2. C#图解教程

    初识本书是在知乎,许多网友推荐它作为 C# 入门书籍. 本书的最大特点是插图丰富,许多复杂的概念,一副插图就解释得通透明了. 本书另外一个隐藏特性是作者有着 C/C++ 经验,书中经常提到它们与 C# ...

  3. CASE WHEN用法

    问题:假如说这个条件有一条数据不满足,那么那条数据就不会读出来,,那么,我怎么才能把它读出并且赋值为空呢 方法: SELECT `s`.*, ( CASE THEN SUM(a.total_numbe ...

  4. 【转载】Spark学习——spark中的几个概念的理解及参数配置

    首先是一张Spark的部署图: 节点类型有: 1. master 节点: 常驻master进程,负责管理全部worker节点.2. worker 节点: 常驻worker进程,负责管理executor ...

  5. WPF自学入门(四)WPF路由事件之自定义路由事件

    在上一遍博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件.接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧. 创建自定义路由事件分为3个步骤: 1.声明并注册 ...

  6. Keras官方中文文档:Keras安装和配置指南(Linux)

    关于计算机的硬件配置说明 推荐配置 如果您是高校学生或者高级研究人员,并且实验室或者个人资金充沛,建议您采用如下配置: 主板:X299型号或Z270型号 CPU: i7-6950X或i7-7700K ...

  7. jsp学习笔记之:内置对象

    application对象: 设置一个名为name,值为val的应用内共享的数据 <% application.setAttribute("name",val); %> ...

  8. [HNOI2007]紧急疏散

    二分+网络流判定 首先处理出每个人和门间的距离 二分时间,连边时把每个门拆成mid个,一个人能在mid时间内到达,他也可以在这等一会儿,那么这mid个门之间连边 如果可以在x的时间内到达,那么x~mi ...

  9. 基于python创建一个简单的HTTP-WEB服务器

    背景 大多数情况下主机资源只有开发和测试相关人员可以登录直接操作,且有些特定情况"答辩.演示.远程"等这些场景下是无法直接登录主机的.web是所有终端用户都可以访问了,解决了人员权 ...

  10. Java Swing应用程序 JComboBox下拉框联动查询

    在web项目中,通过下拉框.JQuery和ajax可以实现下拉框联动查询. 譬如说,当你查询某个地方时,页面上有:省份:<下拉框省份> 市区:<下拉框市区> 县乡:<下拉 ...