Breeze とは

Scala の数値計算ライブラリ。
行列・ベクトル演算の各種 API を提供。

可視化ライブラリの Breeze Viz もある。

使用するための設定

build.sbt

libraryDependencies ++= Seq(
  // https://mvnrepository.com/artifact/org.scalanlp/breeze
  "org.scalanlp" %% "breeze" % "1.0"
  // https://mvnrepository.com/artifact/org.scalanlp/breeze-viz
  "org.scalanlp" %% "breeze-viz" % "1.0"
)

簡単なサンプル

Breeze

import breeze.linalg._

val v = DenseVector(1.0, 2.0, 3.0)

val a = DenseMatrix(
  (1.0, 2.0, 3.0),
  (2.0, 5.0, 1.0)
)
val b = DenseMatrix(
  (2.0, 3.0),
  (4.0, 7.0),
  (-3.0, 2.0)
)
val c = DenseMatrix(
  (1.0, 2.0, 3.0),
  (1.0, 4.0, 2.0),
  (4.0, 3.0, 5.0)
)
val d: DenseMatrix[((Int, Int, Int), (Int, Int, Int))] = DenseMatrix(
  (
    ((1,2,3), (4,5,6)),
    ((7,8,9), (0,1,2))
  ),
  (
    ((3,4,5), (6,7,8)),
    ((9,0,1), (2,3,4))
  )
)

val i = DenseMatrix.eye[Double](3)
val one = DenseMatrix.ones[Double](2, 3)
val z = DenseMatrix.zeros[Double](4, 5)

println("---------- 2x3 行列 A ----------")
println(a)
println("---------- 3x2 行列 B ----------")
println(b)
println("---------- 3x3 行列 C ----------")
println(c)
println("---------- 3x2x2x2 配列 D ----------")
println(d)
println("---------- ベクトル v ----------")
println(v)
println("---------- 単位行列 I ----------")
println(i)
println("---------- 全てが1の行列 ----------")
println(one)
println("---------- ゼロ行列 Z ----------")
println(z)
println("---------- ゼロ行列 Z の値を更新 ----------")
z(0, 1) = 1.0
z(::, 0) := 2.0
z(1 to 2, 2 to 3) := 3.0
println(z)
println("---------- 行列の和 ----------")
println(a + b.t)
println("---------- 行列の積 ----------")
println(a * b)
println(b * a)
println("---------- 行列の要素同士の積 ----------")
println(a *:* b.t)
println("---------- 要素の定数倍 ----------")
println(a * 2.0)
println("---------- 要素に定数を足す ----------")
println(a + 1.0)
println("---------- 行列の全ての列に同じベクトルを足す ----------")
println(s"$b, $v\n-->\n${b(::, *) + v}")
println("---------- 行列の全ての行に同じベクトルを足す ----------")
println(s"$a, $v\n-->\n${a(*, ::) + v}")
println("---------- 行列をベクトルにかける ----------")
println(a * v)
println("---------- C の逆行列 ----------")
println(s"$c\nx\n${inv(c)}\n=\n${c * inv(c)}")
println("---------- C の行列式 ----------")
println(det(c))
println("---------- C の固有値、固有ベクトル ----------")
println(eig(c).eigenvalues)
println(eig(c).eigenvectors)

println("---------- 要素全ての和を取る ----------")
println(s"$a\n--> ${sum(a)}")
println("---------- 列で和を取る ----------")
println(s"$a\n--> ${sum(a, Axis._0)}")
println("---------- 行で和を取る ----------")
println(s"$a\n--> ${sum(a, Axis._1)}")

println("---------- 行列を上下に結合 ----------")
println(DenseMatrix.vertcat(a, b.t))
println("---------- 行列を左右に結合 ----------")
println(DenseMatrix.horzcat(a, b.t))

println("---------- 行列の整形 ----------")
println(a.reshape(3,2))

println("---------- 行列をフラットに展開してベクトルに → reshape で元に戻す ----------")
println(a.flatten())
println(a.flatten().toDenseMatrix.reshape(2, 3))
---------- 2x3 行列 A ----------
1.0  2.0  3.0  
2.0  5.0  1.0  
---------- 3x2 行列 B ----------
2.0   3.0  
4.0   7.0  
-3.0  2.0  
---------- 3x3 行列 C ----------
1.0  2.0  3.0  
1.0  4.0  2.0  
4.0  3.0  5.0  
---------- 3x2x2x2 配列 D ----------
((1,2,3),(4,5,6))  ((7,8,9),(0,1,2))  
((3,4,5),(6,7,8))  ((9,0,1),(2,3,4))  
---------- ベクトル v ----------
DenseVector(1.0, 2.0, 3.0)
---------- 単位行列 I ----------
1.0  0.0  0.0  
0.0  1.0  0.0  
0.0  0.0  1.0  
---------- 全てが1の行列 ----------
1.0  1.0  1.0  
1.0  1.0  1.0  
---------- ゼロ行列 Z ----------
0.0  0.0  0.0  0.0  0.0  
0.0  0.0  0.0  0.0  0.0  
0.0  0.0  0.0  0.0  0.0  
0.0  0.0  0.0  0.0  0.0  
---------- ゼロ行列 Z の値を更新 ----------
2.0  1.0  0.0  0.0  0.0  
2.0  0.0  3.0  3.0  0.0  
2.0  0.0  3.0  3.0  0.0  
2.0  0.0  0.0  0.0  0.0  
---------- 行列の和 ----------
3.0  6.0   0.0  
5.0  12.0  3.0  
---------- 行列の積 ----------
1.0   23.0  
21.0  43.0  
8.0   19.0  9.0   
18.0  43.0  19.0  
1.0   4.0   -7.0  
---------- 行列の要素同士の積 ----------
2.0  8.0   -9.0  
6.0  35.0  2.0   
---------- 要素の定数倍 ----------
2.0  4.0   6.0  
4.0  10.0  2.0  
---------- 要素に定数を足す ----------
2.0  3.0  4.0  
3.0  6.0  2.0  
---------- 行列の全ての列に同じベクトルを足す ----------
2.0   3.0  
4.0   7.0  
-3.0  2.0  , DenseVector(1.0, 2.0, 3.0)
-->
3.0  4.0  
6.0  9.0  
0.0  5.0  
---------- 行列の全ての行に同じベクトルを足す ----------
1.0  2.0  3.0  
2.0  5.0  1.0  , DenseVector(1.0, 2.0, 3.0)
-->
2.0  4.0  6.0  
3.0  7.0  4.0  
---------- 行列をベクトルにかける ----------
DenseVector(14.0, 15.0)
---------- C の逆行列 ----------
1.0  2.0  3.0  
1.0  4.0  2.0  
4.0  3.0  5.0  
x
-0.7368421052631579   0.05263157894736842   0.42105263157894735    
-0.15789473684210528  0.368421052631579     -0.052631578947368425  
0.6842105263157895    -0.26315789473684215  -0.10526315789473684   
=
1.0000000000000002  -1.1102230246251565E-16  0.0                      
0.0                 1.0                      -2.7755575615628914E-17  
0.0                 0.0                      0.9999999999999999       
---------- C の行列式 ----------
-19.0
---------- C の固有値、固有ベクトル ----------
DenseVector(8.717593221512578, -0.9683438842904944, 2.250750662777923)
-0.4216651368900519   -0.8120998434362547   0.17759547231246928  
-0.42822507399666565  -0.06975532161916993  -0.7830441060250898  
-0.7992632847391679   0.5793341344997862    0.5960719555837861   
---------- 要素全ての和を取る ----------
1.0  2.0  3.0  
2.0  5.0  1.0  
--> 14.0
---------- 列で和を取る ----------
1.0  2.0  3.0  
2.0  5.0  1.0  
--> Transpose(DenseVector(3.0, 7.0, 4.0))
---------- 行で和を取る ----------
1.0  2.0  3.0  
2.0  5.0  1.0  
--> DenseVector(6.0, 8.0)
---------- 行列を上下に結合 ----------
1.0  2.0  3.0   
2.0  5.0  1.0   
2.0  4.0  -3.0  
3.0  7.0  2.0   
---------- 行列を左右に結合 ----------
1.0  2.0  3.0  2.0  4.0  -3.0  
2.0  5.0  1.0  3.0  7.0  2.0   
---------- 行列の整形 ----------
1.0  5.0  
2.0  3.0  
2.0  1.0  
---------- 行列をフラットに展開してベクトルに → reshape で元に戻す ----------
DenseVector(1.0, 2.0, 2.0, 5.0, 3.0, 1.0)
1.0  2.0  3.0  
2.0  5.0  1.0  

Breeze Viz

import breeze.linalg._
import breeze.plot._

val x: DenseVector[Double] = DenseVector(0 to 100: _*).map(_ * 0.02)

val f = Figure()

val p1 = f.subplot(1, 2, 0)
p1.title = "Graph 1"
p1.xlabel = "X"
p1.ylabel = "Y"
p1.xaxis.setTickUnit(new NumberTickUnit(0.2))
p1.yaxis.setTickUnit(new NumberTickUnit(1.0))
p1 += plot(x, x ^:^ 2.0, name = "Y = X^2")
p1 += plot(x, x ^:^ 3.0, name = "Y = X^3", style = '.')
p1.legend = true

val p2 = f.subplot(1, 2, 1)
p2.title = "Graph 2"
p2.xlabel = "X"
p2.ylabel = "Frequency of X"
val g = breeze.stats.distributions.Gaussian(0,1)
p2 += hist(g.sample(100000),100)

f.saveas("target/sample.png")

sample