scalaNLPのbreezeツール体験

6012 ワード

scalaNLPは機械学習と数値計算に用いられるscalaツールライブラリであり,ビッグデータ解析ツールsparkが統合している.
BreezeとEpicの2つのツールが含まれており,前者は機械学習と数値計算に適しており,後者は統計解析予測に用いることができる.
今日は少し時間をかけてbreezeというツールを初歩的に理解しました.
ベクトルと行列の作成
現在のコンピュータ数学はベクトルとマトリクス、特に機械学習から離れられないので、このようなツールに対して、マトリクスとベクトルを創造し、そのいくつかの4つの演算に便利な方法を提供することが最も重要です.
matlabのように、直接字面量で構築することもできるし、簡単に特殊なマトリクスを作成することもできるし、numpyのように簡単な方法で構築することもできる.例えばnp.arange(0,30,2)は、もちろんbreezeはscala言語の特性に限られ、scala言語の特性も十分に利用され、ベクトルを作成する簡単な方法を提供しています.
次はnumpyとの対比です
Operation
Breeze
Numpy
Zeroed matrix DenseMatrix.zeros[Double](n,m) zeros((n,m))
Zeroed vector DenseVector.zeros[Double](n) zeros(n)
Vector of ones DenseVector.ones[Double](n) ones(n)
Vector of particular number DenseVector.fill(n){5.0} ones(n) * 5
n element range linspace(start,stop,numvals)
Identity matrix DenseMatrix.eye[Double](n) eye(n)
Diagonal matrix diag(DenseVector(1.0,2.0,3.0)) diag((1,2,3))
Matrix inline creation DenseMatrix((1.0,2.0), (3.0,4.0)) array([ [1,2], [3,4] ])
Column vector inline creation DenseVector(1,2,3,4) array([1,2,3,4])
Row vector inline creation DenseVector(1,2,3,4).t array([1,2,3]).reshape(-1,1)
Vector from function DenseVector.tabulate(3){i => 2*i}
Matrix from function DenseMatrix.tabulate(3, 2){case (i, j) => i+j}
Vector creation from array new DenseVector(Array(1, 2, 3, 4))
Matrix creation from array new DenseMatrix(2, 3, Array(11, 12, 13, 21, 22, 23))
Vector of random elements from 0 to 1 DenseVector.rand(4)
Matrix of random elements from 0 to 1 DenseMatrix.rand(2, 3)
numpy私は実際に使ったことがなくて、図の中から比較して、実は両者の作成はすべてとても便利で、実はimport breeze.linalg.DenseVector._ DenseVectorは省略できます.(ただし他の方法と衝突しないように注意してください)
簡単な使用例
import breeze.linalg._
import breeze.stats.distributions.{Binomial, Poisson}
val x = DenseVector.zeros[Double](5) //      5 0  
x(0)
x(1) = 2 //           2
x(1)
x(3 to 4) := 0.5 //              0.5
x
x(1)
val m = DenseMatrix.zeros[Int](5,5) //     5*5 0  

(m.rows, m.cols)

val p = Poisson(3.0) //     λ 3.0     

p.sample(10) //            10   

val b = Binomial(10, 0.5) //     n 10,     0.5     
b.sample(3) //            

使いやすいです.
マトリックスベクトルのいくつかの基本演算
ここで同じように比較してみましょう
Operation
Breeze
Matlab
Numpy
Elementwise addition a + b a + b a + b
Elementwise multiplication a :* b a .* b a * b
Elementwise comparison a :< b a < b (gives matrix of 1/0 instead of true/false) a < b
Inplace addition a :+= 1.0 a += 1 a += 1
Inplace elementwise multiplication a :*= 2.0 a *= 2 a *= 2
Vector dot product a dot b , a.t * bdot(a,b) dot(a,b)
Elementwise sum sum(a) sum(sum(a)) a.sum()
Elementwise max a.max max(a) a.max()
Elementwise argmax argmax(a) argmax(a) a.argmax()
Ceiling ceil(a) ceil(a) ceil(a)
Floor floor(a) floor(a) floor(a)
実はここに皆さんが望んでいる演算がなければ、あるいは皆さんがこれらに詳しくなければ、breezeのマトリクスやベクトルもmap、reduceなどの操作を提供しています.
いくつかの例:
import breeze.linalg._

val a = DenseVector(1,2,4,5,6)
val b = DenseVector(4,5,6,7,8)

val c = a + b

val res = a dot b
val m = max(c)
val d = c *:* 2
val su = sum(a)

上記の結果
iimport breeze.linalg._

a: breeze.linalg.DenseVector[Int] = DenseVector(1, 2, 4, 5, 6)
b: breeze.linalg.DenseVector[Int] = DenseVector(4, 5, 6, 7, 8)

c: breeze.linalg.DenseVector[Int] = DenseVector(5, 7, 10, 12, 14)

res: Int = 121

m: Int = 14

d: breeze.linalg.DenseVector[Int] = DenseVector(10, 14, 20, 24, 28)

su: Int = 18

res0: Int = 4


Broadcasting
マトリクスの各行または列を単位として演算したい場合があります.たとえば、次の例です.
import breeze.stats.mean
val x = DenseMatrix((1,2,3),(4,5,6))

x(::, *) + DenseVector(1,2)

mean(x(*, ::))

結果
import breeze.stats.mean
x: breeze.linalg.DenseMatrix[Double] = 1.0  2.0  3.0  
4.0  5.0  6.0  

res1: breeze.linalg.DenseMatrix[Double] = 2.0  3.0  4.0  
6.0  7.0  8.0  

res2: breeze.linalg.DenseVector[Double] = DenseVector(2.0, 5.0)

かくりつぶんぷ
breezeにはポアソン分布,正規分布など多くの確率分布が内蔵されている.
import breeze.stats.distributions._
import breeze.stats._

val p = Poisson(3.0)

val samp = p.sample(10)

val posi = samp.map(p.probabilityOf)

val doublePoi = for(x 

結果
import breeze.stats.distributions._
import breeze.stats._

p: breeze.stats.distributions.Poisson = Poisson(3.0)

samp: IndexedSeq[Int] = Vector(1, 2, 3, 3, 0, 2, 4, 4, 2, 4)

posi: IndexedSeq[Double] = Vector(0.14936120510359185, 0.22404180765538775, 0.22404180765538775, 0.22404180765538775, 0.049787068367863944, 0.22404180765538775, 0.16803135574154085, 0.16803135574154085, 0.22404180765538775, 0.16803135574154085)

doublePoi: breeze.stats.distributions.Rand[Double] = MappedRand(Poisson(3.0),lew.bing.nlp.A$A28$A$A28$$Lambda$1368/249549676@28b8a031)

res0: breeze.stats.MeanAndVariance = MeanAndVariance(3.0000000000000018,3.141141141141139,1000)

res1: Double = 3.0

res2: Double = 3.0

締めくくり
breezeはまだ多くの机能があって、私のいくつかの高等数学の知识はすべて先生に返して、これらの机能に対してあまり深く研究していないで、时间に限られて、ケースを书きたくなくて、みんなは公式のドキュメントを见て、ドキュメントの书くのはとても简洁で、入门はとても简単で、兴味のあるのは见てみることができます.