Skip to content

Commit

Permalink
ExtremeLearning
Browse files Browse the repository at this point in the history
  • Loading branch information
Wei-1 committed Mar 8, 2020
1 parent 1b467e6 commit 0a762b8
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 2 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
31 changes: 31 additions & 0 deletions src/main/scala/algorithm/classification/ExtremeLearning.scala
Original file line number Diff line number Diff line change
@@ -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)
}
}
33 changes: 33 additions & 0 deletions src/test/scala/algorithm/classification/ExtremeLearningTest.scala
Original file line number Diff line number Diff line change
@@ -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))
}
}

0 comments on commit 0a762b8

Please sign in to comment.