From ea08fdb9274af848eee3a54434415c6e002f9503 Mon Sep 17 00:00:00 2001 From: oshirogo Date: Wed, 14 Feb 2018 19:53:24 +0900 Subject: [PATCH 1/2] adding vim swp files to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 831f7c2..d893b0c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Mac. .DS_STORE +# vim +*.swp + # Node. node_modules From 4192a6ba6ebad46f9956825c08c48c35b939c4c4 Mon Sep 17 00:00:00 2001 From: oshirogo Date: Thu, 22 Feb 2018 20:58:42 +0900 Subject: [PATCH 2/2] Adding test to verify Hopfield network example --- test/synaptic.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/test/synaptic.js b/test/synaptic.js index d57062f..ab85364 100755 --- a/test/synaptic.js +++ b/test/synaptic.js @@ -7,6 +7,7 @@ import * as synaptic from '../src/synaptic'; var Perceptron = synaptic.Architect.Perceptron; var LSTM = synaptic.Architect.LSTM; +var Hopfield = synaptic.Architect.Hopfield; var Layer = synaptic.Layer; var Network = synaptic.Network; var Trainer = synaptic.Trainer; @@ -606,3 +607,77 @@ describe("Rate Array Check", function () { }); }); }); + +describe('Hopfield Network - Self Organizing Map', function () { + + it("should recognize similar words", function () { + this.timeout(30000); + + var hopfield = new Hopfield(80); + var trainer = new Trainer(hopfield, {cost: Trainer.cost.CROSS_ENTROPY}); + var map = {}; + + var ascii2bin = function(ascii) { + var bin = "00000000000000000000000000000000000000000000000000000000000000000000000000000000"; + for (var i = 0; i < ascii.length; i++) { + var code = ascii.charCodeAt(i); + bin += ('00000000' + code.toString(2)).slice(-8); + } + return bin.slice(-10 * 8).split('').reverse(); + } + + var feed = function(word) { + var input = ascii2bin(word); + var output = hopfield.feed(input); + var key = output.join(''); + + if (key in map) { + map[key].push(word); + } else { + var learn = []; + map[key] = [word]; + + for (var i in map) { + learn.push(i.split('')); + } + var set = []; + for (var p in learn) { + set.push({ + input: learn[p], + output: learn[p] + }); + } + + doTrain(set); + } + } + + var doTrain = function(set){ + trainer.train(set, { + iterations: 100, + error: .5, + rate: .05 + }); + } + + map[ascii2bin("cat").join('')] = ["cat"]; + map[ascii2bin("dog").join('')] = ["dog"]; + map[ascii2bin("john").join('')] = ["john"]; + var learn = [ascii2bin("john"), ascii2bin("dog"), ascii2bin("cat")]; + var set = []; + for (var p in learn) { + set.push({ + input: learn[p], + output: learn[p] + }); + } + + doTrain(set); + assert.equal(Object.keys(map).length, 3, "Map not properly initialized"); + feed("sat"); + assert.equal(Object.keys(map).length, 3, "Patterns in similar words not recognized"); + //feed("browser"); + //assert.equal(Object.keys(map).length, 4, "Different words not recognized"); + }); + +});