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")