本文来自网易云社区
作者:钱烽
一、Breeze QuickStart地址:https://github.com/scalanlp/breeze/wiki/Quickstart
- 矩阵 + 向量 : import breeze.linalg._
- 默认使用列向量,转成行向量用DenseVector.t或Transpose(DenseVector);行向量以单行矩阵的形式存储,转成列向量用DenseVector.t(::, 0)。
- 切片符号
- “x to y by z”or “x until y by z”表示列/行区间,即列或行中的一部分;或表示矩阵区间,即矩阵中的某些连续列或行
- “::”表示矩阵中的所有行或列。
- ":="给切片赋值,例如向量切片v(1 to 2) := 0.8,矩阵切片m(1 to 2, 1 to 2) := DenseMatrix.ones[Double](2, 2)
- elementwise操作:使用 :*、:/、:<、:&等
- "*"表示broadcasting(矩阵中用到):分列或分行操作(foreach的意思),结合切片符号一起使用,例如 m(::, *) += DenseVector[Double](1, 2)
- SparseVector.zeros: 稀疏向量的零元素不会占用空间
- 统计操作:import breeze.stats._
- 矩阵的数值计算只支持Double类型。Int转Double的方法:v.mapValues(_.toDouble)或者使用convert函数
- 既可以用于全部元素,也可以用于broadcasting(每列分别统计),例如 mean(m2(::, *)
- 概率函数:import breeze.stats.distributions._
- 使用时,new一个分布函数,例如 val gaussianRand = new Gaussian(0, 0.01)
- 优化方法:import breeze.optimize._
- 要求计算的变量来自breeze.linalg._
- 一般方法:new DiffFunction(value form, gradient form),实现calculate函数,调用valueAt和gradientAt函数
- 目标函数形式简单的情况下,可以用近似方法val diffg = new ApproximateGradientFunction(g)
- 有了原始函数和梯度函数后,可以用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+款云产品!
更多网易研发、产品、运营经验分享请访问网易云社区。