昨日はbreeze-vizを導入してQuickStartに乗っているソースを動かしてみるということをやりました。今日は与えられた点と最小二乗法で求めた回帰直線をplotしてみようということをやってみます。

ソースはこんな感じ。breeze-vizのplotの第一引数は描画する点のx座標、第二引数はy座標になっています。第三引数は描画するものを示しているようで、”.“を指定すると点がプロットされます。ここで何も指定しないと直線が描画されることになります。Documentが見れれば細かいことが分かりそうですが、breeze.plotに関してはapi documentの方にも記述がないので実際にソースを読むしかなさそうです(私が探しきれていないだけで実はあったりするのかな)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import breeze.linalg._
import breeze.plot._

case class Data(x: Double, y: Double)

object Main {
  def main(args: Array[String]): Unit = {
    val datas = Array[Data](Data(4.0, 7.0), Data(8.0, 10.0), Data(13.0, 11.0), Data(17.0, 14.0))
    val value = leastSquares(datas)
    println(s"a:${value._1} b:${value._2}")

    val x = datas.map { data => data.x }
    val y = datas.map { data => data.y }
    val oy = datas.map { data => value._1 * data.x + value._2}

    // plot
    val f = Figure()
    val p = f.subplot(0)

    p += plot(x, y, '.')
    p += plot(x, oy)
    p.xlabel = "x"
    p.ylabel = "y"
  }

  def leastSquares(datas: Array[Data]): (Double, Double) = {
    val x_sum = datas.map { data => data.x }.sum
    val x_square_sum = datas.map { data => data.x * data.x }.sum
    val y_sum = datas.map { data => data.y }.sum
    val x_y_sum = datas.map { data => data.x * data.y }.sum

    val a = (((x_sum * y_sum) - (datas.length * x_y_sum)) / ((x_sum * x_sum) - (datas.length * x_square_sum)))
    val b = (((x_sum * x_y_sum) - (x_square_sum * y_sum)) / ((x_sum * x_sum) - (datas.length * x_square_sum)))

    (a, b)
  }
}

追記

plotに関して、描画するstyleを記述するのはmatplotlibにもあるようです。ですが、matplotlibの場合、指定できる文字の種類がbreeze-vizに比べて多いようです。

breeze-vizで使用できる文字は

  • ‘-’
  • ‘.’
  • ‘+’

の3つだけのようです。これはplotに適当な文字を入れてみると出力されるエラーに記述されていました。

java.lang.IllegalArgumentException: Expected style to be one of - . or +

ちなみにplotで指定できるオプションとして

  • style
  • colorcode
  • name
  • lines
  • shapes
  • labels
  • tips

以下がソースに記述されていたコメントになります

/* * Plots the given y versus the given x with the given style. * @param x X-coordinates, co-indexed with y (and indexed by keys of type K). * @param y Y-coordinates, co-indexed with x (and indexed by keys of type K). * @param style Matlab-like style spec of the series to plot. * @param name Name of the series to show in the legend. * @param labels Optional in-graph labels for some points. * @param tips Optional mouse-over tooltips for some points. /

まとめ

breeze-vizを使い始めて、予想以上にDocumentがなくて驚いています。まぁ、”This API is very experimentable”とソースコードにも記述されているので、まだ作る段階ではないということなのでしょうが。とりあえず自分のメモ代わりということで、今後使い方などをまとめていきたいなと思っていて、matplotlib入門のような形で見やすくまとめられたらなと考えています。