Scala的Cool Breeze易于计算:Breeze库简介

数学是机器学习的核心部分,要深入学习机器学习,人们应该掌握数学概念的基础知识,但是当您开始开发算法时,数学可能是一个真正的难题。 值得庆幸的是,我们有一些很棒的库可以减轻我们的痛苦,并且还使我们可以将更多的精力放在基本需求上,而不是将精力更多地放在操作技术上。 数值处理库名为Breeze。

因此,我们将在此博客中重点介绍Breeze,这是最受欢迎的博客之一,
强大的线性代数库。 Spark MLlib是在Breeze和Spark的基础上构建的,它为可伸缩的机器学习提供了强大的框架。

介绍

Breeze是一个通用,干净且功能强大的Scala数值处理库,其模式遵循NumPy,Matlab和R,并获得Apache Public License 2.0的许可。 Breeze是Scalala的后继产品,提供密集的线性代数,数值例程,优化,随机数生成器和信号处理等。

图片1

简单来说,Breeze是一个Scala库,它扩展了
Scala集合库不仅提供向量和矩阵的支持,还提供了支持向量和矩阵处理的全部功能。 我们可以用Python术语安全地将Breeze与NumPy进行比较。 Breeze构成了MLlib的基础-Spark中的机器学习库

Breeze包含四个库:

  • 微风数学:数字和线性代数。 在适当的情况下,由本机库(通过JBlas)支持的快速线性代数。
  • 微风处理:用于标记,处理和按摩数据(尤其是文本数据)的工具。 包括词干提取器,分词器和停用词过滤等功能。
  • 微风学习:优化和机器学习。 包含用于凸优化,采样分布,几个分类器和用于线性编程和置信度传播的DSL的最新例程。
  • breeze-viz:(非常Alpha)使用JFreeChart对绘图的基本支持。

轻风拂面

在第一个配方中,我们将看到如何使用Scala Build Tool(SBT)将Breeze库拉入我们的项目。

 名称:=“微风” 
 版本:=“ 0.1” 
  scalaVersion:=“ 2.11.6” 
  libraryDependencies ++ = Seq(“ org.scalanlp”%“ breeze_2.11”%“ 0.12”) 
  “ https://oss.sonatype.org/content/repositories/releases/”上的解析程序+ =“ Sonatype版本” 
或用于控制台
  $ sbt 
设置libraryDependencies + =“ org.scalanlp”%“ breeze_2.11”%“ 0.12”
在“ https://oss.sonatype.org/content/repositories/releases/”上设置解析器+ =“ Sonatype Releases”
设置scalaVersion:=“ 2.11.6”
安慰
 微风进口 
import breeze.linalg._ 
import breeze.numerics._
  与其他数值计算环境的比较 
 与其他数值计算环境相比,Breeze矩阵默认为以列为主的排序(如Matlab),但索引基于0的索引(如Numpy)。  Breeze将矩阵和列向量作为其核心概念。 行向量通常存储为单行矩阵。 这样做的缺点是,行向量到列向量的转换是使用转置切片( at(::,0) )而不是简单的转置( at )进行的,从而具有更大的类型安全性。 
 创建 
  OperationBreezeNumpyZeroed矩阵DenseMatrix.zeros[Double](n,m)zeros((n,m))零向量DenseVector.zeros[Double](n)zeros(n)向量DenseVector.ones[Double](n)ones(n)特定数量的向量DenseVector.fill(n){5.0}ones(n) * 5 n个元素范围linspace(start,stop,numvals)矩阵DenseMatrix.eye[Double](n)eye(n)对角矩阵diag(DenseVector(1.0,2.0,3.0))diag((1,2,3))矩阵内联创建DenseMatrix((1.0,2.0), (3.0,4.0))array([ [1,2], [3,4] ])列向量内联创建DenseVector(1,2,3,4)array([1,2,3,4])行向量内联创建DenseVector(1,2,3,4).tarray([1,2,3]).reshape(-1,1)来自函数DenseVector.tabulate(3){i => 2*i}向量来自函数DenseVector.tabulate(3){i => 2*i} DenseMatrix.tabulate(3, 2){case (i, j) => i+j}矩阵DenseMatrix.tabulate(3, 2){case (i, j) => i+j} 

读写矩阵

 当前,Breeze通过两种方式支持矩阵的IO:Java序列化和csv。 后者来自两个函数: breeze.linalg.csvread和。  breeze.linalg.csvwrite csvread获取一个File,以及可选的用于确定CSV文件如何定界的参数(例如,如果它实际上是tsv文件,则可以将制表符设置为字段定界符。)并返回DenseMatrix。 类似地, csvwrite获取一个File和一个DenseMatrix,并将矩阵的内容写入文件。 

索引和切片

  OperationBreezeMatlabNumpyRB基本索引a(0,1)a(1,2)a[0,1]a[1L,2L]提取向量a(1 to 4)a(1 until 5)a.slice(1,5)a(2:5)a[1:5]a[2:5] (负步) a(5 to 0 by -1)a(6:-1:1)a[5::-1]a[6:1] (尾部) a(1 to -1)a(2:end)a[1:]a[-1] (最后一个元素) a( -1 )a(end)a[-1]tail(a, n=1)提取矩阵a(::, 2)a(:,3)a[:,2]a[,2] 

运作方式

  OperationBreezeMatlabNumpyR a * ba * bdot(a, b)a %*% b加法a + ba + ba + ba + b形状/矩阵乘法a * ba * bdot(a, b)a %*% b元素加法a *:* ba .* ba * ba * b元素除法a /:/ ba ./ ba / ba / b元素比较a :< ba < b (给出1/0的矩阵,而不是真/假) a < ba < b元素比较等于a :== ba == b (给出1 /的矩阵0代替true / false) a == ba == b 

映射并缩小

 对于大多数简单的映射任务,可以简单地使用矢量化或通用函数。 给定一个向量, v可以简单地用log(v)取向量的每个元素的对log(v) 。但是,有时候,我们想对向量的每个元素应用某种特有的函数。 为此,我们可以使用map函数: 
  val v = DenseVector(1.0,2.0,3.0) 
v.map(xi => foobar(xi))
  Breeze提供了许多内置的归约函数,例如求和,均值。 您可以使用高阶函数reduce实现自定义归约,例如,我们可以将前9个整数求和,如下所示: 
  val v = linspace(0,9,10) 
val s = v.reduce(_ + _)

铸造和类型安全

 与Numpy和Matlab相比,Breeze要求您更清楚地了解变量的类型。 例如,当创建一个新的向量时,在无法自动推断类型的情况下,必须指定一个类型(例如在DenseVector.zeros[Double](n) )。 通过在( DenseVector )中传递其初始值来创建向量时,将自动进行推理。 一个常见的错误是使用整数进行初始化(例如DenseVector ),这将给出整数矩阵而不是双精度数。  Numpy和Matlab都默认改为加倍。 
 在大多数表达式中,微风不会将整数转换为双精度。 当aDenseVector[Double]时,诸如a :+ 3a :+ 3简单操作将无法编译。  Breeze提供了一个convert函数,可用于显式转换。 您也可以使用v.mapValues(_.toDouble) 
 铸件 
  OperationBreezeMatlabNumpyR convert(a, Int)int(a)a.astype(int)as.integer(a)为Int convert(a, Int)int(a)a.astype(int)as.integer(a) 
 参考文献: 
官方Wiki页:此处感谢您的阅读,继续分享。

告示贴