From 0a762b8d55b5f1ef0e9aa83cdc5807124e52da0b Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Sun, 8 Mar 2020 16:12:54 +0800 Subject: [PATCH] ExtremeLearning --- README.md | 4 +-- .../classification/ExtremeLearning.scala | 31 +++++++++++++++++ .../classification/ExtremeLearningTest.scala | 33 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/main/scala/algorithm/classification/ExtremeLearning.scala create mode 100644 src/test/scala/algorithm/classification/ExtremeLearningTest.scala diff --git a/README.md b/README.md index 40ce2b4..b01a946 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ A very light weight Scala machine learning library that provide some basic ML al - [x] Random Forest [[Code]](src/main/scala/algorithm/classification/RandomForest.scala) [[Usage]](src/test/scala/algorithm/classification/RandomForestTest.scala) +- [x] Extreme Learning Machine [[Code]](src/main/scala/algorithm/classification/ExtremeLearning.scala) [[Usage]](src/test/scala/algorithm/classification/ExtremeLearningTest.scala) + ### Boost : - [x] Naive Boost [[Code]](src/main/scala/algorithm/classification/NaiveBoost.scala) [[Usage]](src/test/scala/algorithm/classification/NaiveBoostTest.scala) @@ -123,8 +125,6 @@ A very light weight Scala machine learning library that provide some basic ML al ## TODO -- [ ] Extreme Learning Machine - Classification - - [ ] Polarize Experience Replay - Deep Reinforcement Learning - [ ] Rainbow - Deep Reinforcement Learning diff --git a/src/main/scala/algorithm/classification/ExtremeLearning.scala b/src/main/scala/algorithm/classification/ExtremeLearning.scala new file mode 100644 index 0000000..b5e9848 --- /dev/null +++ b/src/main/scala/algorithm/classification/ExtremeLearning.scala @@ -0,0 +1,31 @@ +// Wei Chen - Extreme Learning +// 2020-03-08 + +package com.scalaml.algorithm +import com.scalaml.general.MatrixFunc._ + +class ExtremeLearning(val neuronNumber: Int, val featureNumber: Int, val outputNumber: Int) { + var wIn = matrixrandom(featureNumber, neuronNumber, -1, 1) + var wOut = matrixrandom(neuronNumber, outputNumber, -1, 1) + + def clear() = { + wIn = matrixrandom(featureNumber, neuronNumber, -1, 1) + wOut = matrixrandom(neuronNumber, outputNumber, -1, 1) + } + clear() + + private def reluLayer(x: Array[Array[Double]]): Array[Array[Double]] = { + matrixdot(x, wIn).map(arr => arr.map(v => math.max(0, v))) + } + + def train(x: Array[Array[Double]], y: Array[Array[Double]]) { + val outX = reluLayer(x) + val tranX = outX.transpose + wOut = matrixdot(inverse(matrixdot(tranX, outX)), matrixdot(tranX, y)) + } + + def predict(x: Array[Array[Double]]): Array[Array[Double]] = { + val outX = reluLayer(x) + matrixdot(outX, wOut) + } +} diff --git a/src/test/scala/algorithm/classification/ExtremeLearningTest.scala b/src/test/scala/algorithm/classification/ExtremeLearningTest.scala new file mode 100644 index 0000000..cc5e584 --- /dev/null +++ b/src/test/scala/algorithm/classification/ExtremeLearningTest.scala @@ -0,0 +1,33 @@ +// Wei Chen - Extreme Learning Test +// 2016-11-06 + +import com.scalaml.TestData._ +import com.scalaml.general.MatrixFunc._ +import com.scalaml.algorithm.ExtremeLearning +import org.scalatest.funsuite.AnyFunSuite + +class ExtremeLearningSuite extends AnyFunSuite { + + val neuronNumber = 100 + val featureNumber = UNLABELED_LARGE_HIGH_DIM_DATA.head.size + val outputNumber = TARGET_LARGE_HIGH_DIM_DATA.head.size + + val el = new ExtremeLearning(neuronNumber, featureNumber, outputNumber) + test("ExtremeLearning Test : Initialization") { + assert(el.wIn.size == featureNumber) + assert(el.wIn.head.size == neuronNumber) + assert(el.wOut.size == neuronNumber) + assert(el.wOut.head.size == outputNumber) + } + + test("ExtremeLearning Test : Train") { + el.train(UNLABELED_LARGE_HIGH_DIM_DATA, TARGET_LARGE_HIGH_DIM_DATA) + val result = el.predict(UNLABELED_LARGE_HIGH_DIM_DATA) + assert(matrixsimilar(result, TARGET_LARGE_HIGH_DIM_DATA, 0.5)) + } + + test("ExtremeLearning Test : Predict - OVERFITS LIKE CRAZY W/O ENOUGH DATA") { + val result = el.predict(UNLABELED_SMALL_HIGH_DIM_DATA) + assert(matrixsimilar(result, TARGET_SMALL_HIGH_DIM_DATA, neuronNumber)) + } +}