数学是机器学习的核心部分,要深入学习机器学习,人们应该掌握数学概念的基础知识,但是当您开始开发算法时,数学可能是一个真正的难题。 值得庆幸的是,我们有一些很棒的库可以减轻我们的痛苦,并且还使我们可以将更多的精力放在基本需求上,而不是将精力更多地放在操作技术上。 数值处理库名为Breeze。
因此,我们将在此博客中重点介绍Breeze,这是最受欢迎的博客之一,
强大的线性代数库。 Spark MLlib是在Breeze和Spark的基础上构建的,它为可伸缩的机器学习提供了强大的框架。
介绍
Breeze是一个通用,干净且功能强大的Scala数值处理库,其模式遵循NumPy,Matlab和R,并获得Apache Public License 2.0的许可。 Breeze是Scalala的后继产品,提供密集的线性代数,数值例程,优化,随机数生成器和信号处理等。

简单来说,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) * 5n个元素范围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.csvwritecsvread获取一个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]
运作方式
OperationBreezeMatlabNumpyRa * 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都默认改为加倍。
在大多数表达式中,微风不会将整数转换为双精度。 当a为DenseVector[Double]时,诸如a :+ 3类a :+ 3简单操作将无法编译。 Breeze提供了一个convert函数,可用于显式转换。 您也可以使用v.mapValues(_.toDouble)
铸件
OperationBreezeMatlabNumpyRconvert(a, Int)int(a)a.astype(int)as.integer(a)为Intconvert(a, Int)int(a)a.astype(int)as.integer(a)
参考文献:
官方Wiki页:此处感谢您的阅读,继续分享。
