在阅读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. Linux开发-makefile

    makefile 介绍 make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序. 首先,我们用一个示例来说明makefile的书写规则.以便给大家一个感性认识.这 ...

  2. boost asio allocation

    allocation演示了自定义异步操作的内存分配策略,因为asio在执行异步IO操作时会使用系统函数来动态分配内存,使用完后便立即释放掉:在IO操作密集的应用中,这种内存动态分配策略会较大地影响程序 ...

  3. class-感知机Perception

    1 感知机模型1.1 模型定义2 感知机学习策略2.1 数据的线性可分性2.2 学习策略3 学习算法3.1 算法原始形式3.2 收敛性3 学习算法的对偶形式 1 感知机模型 感知机perceptron ...

  4. select选中获取索引三种写法

    $('#someId').prop('selectedIndex'); $('option:selected', '#someId').index(); $('#someId option').ind ...

  5. phpstorm 2017.3.3的安装和破解

    首先先下载phpstorm安装包,可以直接百度phpstorm就有了,或者打开这个链接:https://www.jetbrains.com/zh/phpstorm/specials/phpstorm/ ...

  6. webpack学习(一):webpack 介绍&安装&常用命令

    一.简单介绍 什么是Webpack Webpack是一款用户打包前端模块的工具,它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. 主要是用来打包在浏览器端使用的ja ...

  7. 你该怎么选Offer

    原文出处:http://www.360doc.com/content/15/1223/07/1209677_522436084.shtml 记录目的:自勉.分享 摘要 一段时间无数公司.无数投资人蜂拥 ...

  8. iOS学习——iOS原生实现二维码扫描

    最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...

  9. 论文笔记(2):Deep Crisp Boundaries: From Boundaries to Higher-level Tasks

    ---------------------------------------------------------------------------------------------------- ...

  10. 【MyBatis源码分析】Configuration加载(上篇)

    config.xml解析为org.w3c.dom.Document 本文首先来简单看一下MyBatis中将config.xml解析为org.w3c.dom.Document的流程,代码为上文的这部分: ...