在阅读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. 采用Global.asax的Application_BeginRequest事件过滤敏感字符

    1.特殊字符过滤公共类ProcessRequest.cs using System.Web.UI; using System.Web.UI.WebControls; using System.Web. ...

  2. Openstack_O版(otaka)部署_Horizon部署

    控制节点 1. 安装软件包 yum install openstack-dashboard -y 2. 修改配置文件 vim /etc/openstack-dashboard/local_settin ...

  3. Spring Security验证流程剖析及自定义验证方法

    Spring Security的本质 Spring Security本质上是一连串的Filter, 然后又以一个独立的Filter的形式插入到Filter Chain里,其名为FilterChainP ...

  4. Linux下使用Nginx端口转发出现502错误的一种解决办法

    今天圈里的一个朋友在配置完nfinx80端口转发到5000后,发现一个问题 问题描述: 正确配置了Nginx80端口转5000端口,在CentOS上把.Net core WebAPI站点上传到cent ...

  5. C语言 字符串前加L的意义 如:L“A”

    转自:http://c.biancheng.net/cpp/html/1069.html Unicode或者宽字符都没有改变char数据型态在C中的含义.char继续表示1个字节的储存空间,sizeo ...

  6. 申请Jetbrain教育帐号,免费使用一年

    JetBrains是一家捷克的软件开发公司.旗下IDE产品有(不限于):(1) IntelliJ,IDEA  Java集成开发工具:(2) PHPStorm,PHP 集成开发工具:(3) PyChar ...

  7. C#属性的使用--C#基础

    1.属性的作用:保护字段,对字段取值与赋值进行限定 2.属性的使用: _name(属性名)public [对应字段类型] 属性名Name{ get{return _name;} set{_name=v ...

  8. 一个TokenUtils程序,亲测可用

    1. Token用途 token是HTTP请求的令牌,通俗一点说是凭证,目的是防止api被随意访问获取信息. 可使用随机数生成,也可以使用用户id.密码或时间之类进行排序或者加密进行声称. token ...

  9. 百度定位一直出现4.9E -324的问题解决方法

    问题:华为mate10一直在申请百度定位的时候出现此问题并且定位权限和定位服务都打开的情况也是返回这个参数 明显没有定位成功,其他手机暂时没有出现(只要打开定位权限就会立即定位成功) 解决:在定位之前 ...

  10. Linux tar包安装Nginx-1.7.6 (yum方式安装依赖)

    1.首先安装依赖包(依赖包有点多,我们采用yum的方式来安装) yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel ...