From 9c9640c1c377e9dcf53db7dabf677b73cb4f7fe9 Mon Sep 17 00:00:00 2001 From: Fergus McDonald Date: Fri, 30 Oct 2020 23:50:29 -0700 Subject: [PATCH] Added Softmax to Maths folder (#516) --- DIRECTORY.md | 2 ++ Maths/Softmax.js | 13 +++++++++++++ Maths/test/Softmax.test.js | 12 ++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 Maths/Softmax.js create mode 100644 Maths/test/Softmax.test.js diff --git a/DIRECTORY.md b/DIRECTORY.md index 2fd0c0e90..9c4549653 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -119,6 +119,7 @@ * [PrimeCheck](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/PrimeCheck.js) * [ReversePolishNotation](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/ReversePolishNotation.js) * [SieveOfEratosthenes](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/SieveOfEratosthenes.js) + * [Softmax](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/Softmax.js) * test * [Abs](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/test/Abs.test.js) * [Area](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/test/Area.test.js) @@ -145,6 +146,7 @@ * [PrimeCheck](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/test/PrimeCheck.test.js) * [ReversePolishNotation](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/test/ReversePolishNotation.test.js) * [SieveOfEratosthenes](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/test/SieveOfEratosthenes.test.js) + * [Softmax](https://github.com/TheAlgorithms/Javascript/blob/master/Maths/test/Softmax.test.js) ## Navigation * [Haversine](https://github.com/TheAlgorithms/Javascript/blob/master/Navigation/Haversine.js) diff --git a/Maths/Softmax.js b/Maths/Softmax.js new file mode 100644 index 000000000..baeb9fad3 --- /dev/null +++ b/Maths/Softmax.js @@ -0,0 +1,13 @@ +// Wikipedia: https://en.wikipedia.org/wiki/Softmax_function + +const Softmax = (inputs) => { + const eulerExpOfAllInputs = inputs.map(input => Math.exp(input)) + const sumOfEulerExpOfAllInputs = eulerExpOfAllInputs.reduce((a, b) => a + b) + + return inputs.map((input) => { + const eulerExpInputs = Math.exp(input) + return eulerExpInputs / sumOfEulerExpOfAllInputs + }) +} + +export { Softmax } diff --git a/Maths/test/Softmax.test.js b/Maths/test/Softmax.test.js new file mode 100644 index 000000000..179697bcf --- /dev/null +++ b/Maths/test/Softmax.test.js @@ -0,0 +1,12 @@ +import { Softmax } from '../Softmax' + +describe('Softmax', () => { + it('should return equal distribution of 1 for equal input values', () => { + expect(Softmax([1, 1])).toEqual([0.5, 0.5]) + expect(Softmax([1, 1, 1, 1])).toEqual([0.25, 0.25, 0.25, 0.25]) + }) + + it('should return values which sum to the value of 1', () => { + expect(Softmax([1, 2, 3, 4]).reduce((a, b) => a + b, 0)).toEqual(1) + }) +})