『ゼロから作るDeep Learning』をScalaで実装する(その2) - パーセプトロン

前回の続き

who-you-me.hatenablog.com

ANDゲート、NANDゲート、ORゲート、XORゲートをパーセプトロンで実装します。

// Perceptron.scala
import breeze.linalg._

object Perceptron {
  private def gate(w: DenseVector[Double], b: Double)
                  (x1: Double, x2: Double): Double = {
    assert(w.size == 2)
    val x = DenseVector(x1, x2)
    if ((w dot x) + b <= 0) 0.0
    else 1.0
  }

  val AND = gate(DenseVector(0.5, 0.5), -0.7)_
  val NAND = gate(DenseVector(-0.5, -0.5), 0.7)_
  val OR = gate(DenseVector(0.5, 0.5), -0.2)_

  def XOR(x1: Double, x2: Double): Double = {
    val s1 = NAND(x1, x2)
    val s2 = OR(x1, x2)
    AND(s1, s2)
  }
}

コードの重複を避けたかったので、ANDNANDORについては共通のカリー化された関数gateを用意し、それに部分適用する形で実装してみました。

GitHubにも上げた。

github.com

ここまでは簡単。次はニューラルネットでたぶんここからが本番。