-
-
Save yutaono/bed57b91ffab97768c83 to your computer and use it in GitHub Desktop.
parceptron
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name := "parceptron" | |
version := "1.0" | |
scalaVersion := "2.11.7" | |
libraryDependencies ++= Seq( | |
"org.scalanlp" %% "breeze" % "0.11.2", | |
"org.scalanlp" %% "breeze-natives" % "0.11.2", | |
"org.scalanlp" %% "breeze-viz" % "0.11.2" | |
) | |
resolvers ++= Seq( | |
"Sonatype Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/", | |
"Sonatype Releases" at "https://oss.sonatype.org/content/repositories/releases/" | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5.1,3.5,1.4,0.2,Iris-setosa | |
4.9,3.0,1.4,0.2,Iris-setosa | |
4.7,3.2,1.3,0.2,Iris-setosa | |
4.6,3.1,1.5,0.2,Iris-setosa | |
5.0,3.6,1.4,0.2,Iris-setosa | |
5.4,3.9,1.7,0.4,Iris-setosa | |
4.6,3.4,1.4,0.3,Iris-setosa | |
5.0,3.4,1.5,0.2,Iris-setosa | |
4.4,2.9,1.4,0.2,Iris-setosa | |
4.9,3.1,1.5,0.1,Iris-setosa | |
5.4,3.7,1.5,0.2,Iris-setosa | |
4.8,3.4,1.6,0.2,Iris-setosa | |
4.8,3.0,1.4,0.1,Iris-setosa | |
4.3,3.0,1.1,0.1,Iris-setosa | |
5.8,4.0,1.2,0.2,Iris-setosa | |
5.7,4.4,1.5,0.4,Iris-setosa | |
5.4,3.9,1.3,0.4,Iris-setosa | |
5.1,3.5,1.4,0.3,Iris-setosa | |
5.7,3.8,1.7,0.3,Iris-setosa | |
5.1,3.8,1.5,0.3,Iris-setosa | |
5.4,3.4,1.7,0.2,Iris-setosa | |
5.1,3.7,1.5,0.4,Iris-setosa | |
4.6,3.6,1.0,0.2,Iris-setosa | |
5.1,3.3,1.7,0.5,Iris-setosa | |
4.8,3.4,1.9,0.2,Iris-setosa | |
5.0,3.0,1.6,0.2,Iris-setosa | |
5.0,3.4,1.6,0.4,Iris-setosa | |
5.2,3.5,1.5,0.2,Iris-setosa | |
5.2,3.4,1.4,0.2,Iris-setosa | |
4.7,3.2,1.6,0.2,Iris-setosa | |
4.8,3.1,1.6,0.2,Iris-setosa | |
5.4,3.4,1.5,0.4,Iris-setosa | |
5.2,4.1,1.5,0.1,Iris-setosa | |
5.5,4.2,1.4,0.2,Iris-setosa | |
4.9,3.1,1.5,0.1,Iris-setosa | |
5.0,3.2,1.2,0.2,Iris-setosa | |
5.5,3.5,1.3,0.2,Iris-setosa | |
4.9,3.1,1.5,0.1,Iris-setosa | |
4.4,3.0,1.3,0.2,Iris-setosa | |
5.1,3.4,1.5,0.2,Iris-setosa | |
5.0,3.5,1.3,0.3,Iris-setosa | |
4.5,2.3,1.3,0.3,Iris-setosa | |
4.4,3.2,1.3,0.2,Iris-setosa | |
5.0,3.5,1.6,0.6,Iris-setosa | |
5.1,3.8,1.9,0.4,Iris-setosa | |
4.8,3.0,1.4,0.3,Iris-setosa | |
5.1,3.8,1.6,0.2,Iris-setosa | |
4.6,3.2,1.4,0.2,Iris-setosa | |
5.3,3.7,1.5,0.2,Iris-setosa | |
5.0,3.3,1.4,0.2,Iris-setosa | |
7.0,3.2,4.7,1.4,Iris-versicolor | |
6.4,3.2,4.5,1.5,Iris-versicolor | |
6.9,3.1,4.9,1.5,Iris-versicolor | |
5.5,2.3,4.0,1.3,Iris-versicolor | |
6.5,2.8,4.6,1.5,Iris-versicolor | |
5.7,2.8,4.5,1.3,Iris-versicolor | |
6.3,3.3,4.7,1.6,Iris-versicolor | |
4.9,2.4,3.3,1.0,Iris-versicolor | |
6.6,2.9,4.6,1.3,Iris-versicolor | |
5.2,2.7,3.9,1.4,Iris-versicolor | |
5.0,2.0,3.5,1.0,Iris-versicolor | |
5.9,3.0,4.2,1.5,Iris-versicolor | |
6.0,2.2,4.0,1.0,Iris-versicolor | |
6.1,2.9,4.7,1.4,Iris-versicolor | |
5.6,2.9,3.6,1.3,Iris-versicolor | |
6.7,3.1,4.4,1.4,Iris-versicolor | |
5.6,3.0,4.5,1.5,Iris-versicolor | |
5.8,2.7,4.1,1.0,Iris-versicolor | |
6.2,2.2,4.5,1.5,Iris-versicolor | |
5.6,2.5,3.9,1.1,Iris-versicolor | |
5.9,3.2,4.8,1.8,Iris-versicolor | |
6.1,2.8,4.0,1.3,Iris-versicolor | |
6.3,2.5,4.9,1.5,Iris-versicolor | |
6.1,2.8,4.7,1.2,Iris-versicolor | |
6.4,2.9,4.3,1.3,Iris-versicolor | |
6.6,3.0,4.4,1.4,Iris-versicolor | |
6.8,2.8,4.8,1.4,Iris-versicolor | |
6.7,3.0,5.0,1.7,Iris-versicolor | |
6.0,2.9,4.5,1.5,Iris-versicolor | |
5.7,2.6,3.5,1.0,Iris-versicolor | |
5.5,2.4,3.8,1.1,Iris-versicolor | |
5.5,2.4,3.7,1.0,Iris-versicolor | |
5.8,2.7,3.9,1.2,Iris-versicolor | |
6.0,2.7,5.1,1.6,Iris-versicolor | |
5.4,3.0,4.5,1.5,Iris-versicolor | |
6.0,3.4,4.5,1.6,Iris-versicolor | |
6.7,3.1,4.7,1.5,Iris-versicolor | |
6.3,2.3,4.4,1.3,Iris-versicolor | |
5.6,3.0,4.1,1.3,Iris-versicolor | |
5.5,2.5,4.0,1.3,Iris-versicolor | |
5.5,2.6,4.4,1.2,Iris-versicolor | |
6.1,3.0,4.6,1.4,Iris-versicolor | |
5.8,2.6,4.0,1.2,Iris-versicolor | |
5.0,2.3,3.3,1.0,Iris-versicolor | |
5.6,2.7,4.2,1.3,Iris-versicolor | |
5.7,3.0,4.2,1.2,Iris-versicolor | |
5.7,2.9,4.2,1.3,Iris-versicolor | |
6.2,2.9,4.3,1.3,Iris-versicolor | |
5.1,2.5,3.0,1.1,Iris-versicolor | |
5.7,2.8,4.1,1.3,Iris-versicolor | |
6.3,3.3,6.0,2.5,Iris-virginica | |
5.8,2.7,5.1,1.9,Iris-virginica | |
7.1,3.0,5.9,2.1,Iris-virginica | |
6.3,2.9,5.6,1.8,Iris-virginica | |
6.5,3.0,5.8,2.2,Iris-virginica | |
7.6,3.0,6.6,2.1,Iris-virginica | |
4.9,2.5,4.5,1.7,Iris-virginica | |
7.3,2.9,6.3,1.8,Iris-virginica | |
6.7,2.5,5.8,1.8,Iris-virginica | |
7.2,3.6,6.1,2.5,Iris-virginica | |
6.5,3.2,5.1,2.0,Iris-virginica | |
6.4,2.7,5.3,1.9,Iris-virginica | |
6.8,3.0,5.5,2.1,Iris-virginica | |
5.7,2.5,5.0,2.0,Iris-virginica | |
5.8,2.8,5.1,2.4,Iris-virginica | |
6.4,3.2,5.3,2.3,Iris-virginica | |
6.5,3.0,5.5,1.8,Iris-virginica | |
7.7,3.8,6.7,2.2,Iris-virginica | |
7.7,2.6,6.9,2.3,Iris-virginica | |
6.0,2.2,5.0,1.5,Iris-virginica | |
6.9,3.2,5.7,2.3,Iris-virginica | |
5.6,2.8,4.9,2.0,Iris-virginica | |
7.7,2.8,6.7,2.0,Iris-virginica | |
6.3,2.7,4.9,1.8,Iris-virginica | |
6.7,3.3,5.7,2.1,Iris-virginica | |
7.2,3.2,6.0,1.8,Iris-virginica | |
6.2,2.8,4.8,1.8,Iris-virginica | |
6.1,3.0,4.9,1.8,Iris-virginica | |
6.4,2.8,5.6,2.1,Iris-virginica | |
7.2,3.0,5.8,1.6,Iris-virginica | |
7.4,2.8,6.1,1.9,Iris-virginica | |
7.9,3.8,6.4,2.0,Iris-virginica | |
6.4,2.8,5.6,2.2,Iris-virginica | |
6.3,2.8,5.1,1.5,Iris-virginica | |
6.1,2.6,5.6,1.4,Iris-virginica | |
7.7,3.0,6.1,2.3,Iris-virginica | |
6.3,3.4,5.6,2.4,Iris-virginica | |
6.4,3.1,5.5,1.8,Iris-virginica | |
6.0,3.0,4.8,1.8,Iris-virginica | |
6.9,3.1,5.4,2.1,Iris-virginica | |
6.7,3.1,5.6,2.4,Iris-virginica | |
6.9,3.1,5.1,2.3,Iris-virginica | |
5.8,2.7,5.1,1.9,Iris-virginica | |
6.8,3.2,5.9,2.3,Iris-virginica | |
6.7,3.3,5.7,2.5,Iris-virginica | |
6.7,3.0,5.2,2.3,Iris-virginica | |
6.3,2.5,5.0,1.9,Iris-virginica | |
6.5,3.0,5.2,2.0,Iris-virginica | |
6.2,3.4,5.4,2.3,Iris-virginica | |
5.9,3.0,5.1,1.8,Iris-virginica |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package parceptron | |
import breeze.linalg._ | |
import breeze.plot._ | |
import breeze.math._ | |
import breeze.numerics._ | |
import scala.annotation.tailrec | |
import scala.io.Source | |
sealed trait Klass | |
object Klass { | |
case object A extends Klass | |
case object B extends Klass | |
} | |
sealed trait State | |
case object Success extends State | |
case object Failure extends State | |
class Parceptron(rho: Double, xs: List[DenseMatrix[Double]], t: List[Klass], maxNumOfTrials: Int = 1000) { | |
// (5) Xの全パターンを正しく識別できるまで (2) - (4) を繰り返す。 | |
@tailrec | |
final def calc(omega: DenseMatrix[Double], numOfTrials: Int = 0): (DenseMatrix[Double], Int) = { | |
if (numOfTrials > maxNumOfTrials) throw new Exception(s"$numOfTrials times tried but error.") | |
else { | |
optimizeOmega(omega) match { | |
case (omg, 0) => (omg, numOfTrials) | |
case (omg, err) => calc(omg, numOfTrials + 1) | |
} | |
} | |
} | |
private def optimizeOmega(omega: DenseMatrix[Double]): (DenseMatrix[Double], Int) = { | |
// (4) Xの全パターンについて(2),(3)を行う。 | |
(xs zip t).foldLeft[(DenseMatrix[Double], Int)]((omega, 0)) { case ((_omega, err), (_x, _t)) => | |
// (2) 既知データXから学習パターンを1つ選ぶ。 | |
// (3)-1 識別関数g(x)によって識別を行い、 | |
val ev = g(_omega, _x) | |
updateOmega(omega = _omega, ev = ev, x = _x, t = _t) match { | |
case (newOmega, Success) => (newOmega, err) | |
case (newOmega, Failure) => (newOmega, err + 1) | |
} | |
} | |
} | |
// evaluation function | |
private def g(omega: DenseMatrix[Double], x: DenseMatrix[Double]): Double = sum(omega.t * x) | |
// (3)-2 正しく識別できなかった場合はωを更新する。 | |
private def updateOmega(omega: DenseMatrix[Double], ev: Double, x: DenseMatrix[Double], t: Klass): (DenseMatrix[Double], State) = { | |
if ((ev < 0 && t == Klass.A) || (ev > 0 && t == Klass.B)) (omega, Success) | |
else if (ev >= 0) (omega - rho * x, Failure) | |
else (omega + rho * x, Failure) | |
} | |
} | |
object Main extends App { | |
val source = Source.fromURL(getClass.getResource("/iris.data")) | |
// 特徴量ベクトルXを作成 | |
// | |
// "5.1,3.5,1.4,0.2,Iris-setosa" | |
// -> Array("5.1", "3.5", "1.4", "0.2", "Iris-setosa") | |
// -> ([1, 5.1, 3.5, 1.4, 0.2] t, Klass.A) | |
// | |
// List("5.1,3.5,1.4,0.2,Iris-setosa", "7.0,3.2,4.7,1.4,Iris-versicolor") | |
// -> (List([1.0, 5.1, 3.5, 1.4, 0.2] t, [1.0, 7.0, 3.2, 4.7, 1.4] t), List(Klass.A, Klass.B)) | |
val (features, klasses) = source.getLines.toList.map(_.split(",") match { | |
case Array(e0, e1, e2, e3, c) => (DenseMatrix(1.0d +: Array(e0.toDouble, e1.toDouble, e2.toDouble, e3.toDouble): _*), if (c == "Iris-setosa") Klass.A else Klass.B) | |
}).unzip | |
// (1) 重みベクトルωを適当に決める。 | |
val initialOmega = DenseMatrix(1.0d, 1.0d, 1.0d, 1.0d, 1.0d) | |
val model = new Parceptron(rho = 0.05d, xs = features, t = klasses) | |
val (optimizedOmega, numOfTrials) = model.calc(omega = initialOmega) | |
println(s"optimized omega: ${optimizedOmega.t}, number of trials: ${numOfTrials}") | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment