ScalaNLP-Breeze 学习笔记

叁叁肆2018-09-17 17:31

本文来自网易云社区


作者:钱烽

一、Breeze QuickStart地址:https://github.com/scalanlp/breeze/wiki/Quickstart

  • 矩阵 + 向量 : import breeze.linalg._
    1. 默认使用列向量,转成行向量用DenseVector.t或Transpose(DenseVector);行向量以单行矩阵的形式存储,转成列向量用DenseVector.t(::, 0)。
    2. 切片符号
      • “x to y by z”or “x until y by z”表示列/行区间,即列或行中的一部分;或表示矩阵区间,即矩阵中的某些连续列或行
      • “::”表示矩阵中的所有行或列。
    3. ":="给切片赋值,例如向量切片v(1 to 2) := 0.8,矩阵切片m(1 to 2, 1 to 2) := DenseMatrix.ones[Double](2, 2)
    4. elementwise操作:使用 :*、:/、:<、:&等
    5. "*"表示broadcasting(矩阵中用到):分列或分行操作(foreach的意思),结合切片符号一起使用,例如 m(::, *) += DenseVector[Double](1, 2)
    6. SparseVector.zeros: 稀疏向量的零元素不会占用空间
  • 统计操作:import breeze.stats._
    1. 矩阵的数值计算只支持Double类型。Int转Double的方法:v.mapValues(_.toDouble)或者使用convert函数
    2. 既可以用于全部元素,也可以用于broadcasting(每列分别统计),例如 mean(m2(::, *)
  • 概率函数:import breeze.stats.distributions._
    1. 使用时,new一个分布函数,例如 val gaussianRand = new Gaussian(0, 0.01)
  • 优化方法:import breeze.optimize._
    1. 要求计算的变量来自breeze.linalg._
    2. 一般方法:new DiffFunction(value form, gradient form),实现calculate函数,调用valueAt和gradientAt函数
    3. 目标函数形式简单的情况下,可以用近似方法val diffg = new ApproximateGradientFunction(g)
    4. 有了原始函数和梯度函数后,可以用L-BFGS求极值:
      • val lbfgs = new LBFGS[DenseVector[Double]](maxIter=100, m=3)
      • val xAtMin = lbfgs.minimize(f,DenseVector(0,0,0))
      • val minValue = f(xAtMin)
二、Breeze Universal Functions的地址: https://github.com/scalanlp/breeze/wiki/Universal-Functions
  • 定义:可以作用于单个元素或集合中的每个元素的普适函数;可以自己implement这样的函数。
    • import breeze.linalg._、import breeze.math._、import breeze.numerics._
  • Elementwise UFuncs
    • 操作结果作为一个新的对象返回
    • 如果要修改原始元素,可以用inplace函数
  • Operator UFuncs
    • infix:a+b、prefix:-a、inplace:“:=”(冒号表示:赋值后,内容改变,指针不变;“=”表示改变指针指向的地址)
    • 其他的冒号前缀,表示操作到标量元素(elementwisely),例如 :*、:/、:^等
  • Reduction UFuncs
    • sum等,可以用于broadcasting
    • any:是否存在任意非零元素;all:是否全部是是非零元素。
    • min、max:array.min和array.max太慢了



本文来自网易云社区,经作者钱烽授权发布

网易云免费体验馆0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区