Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/benfred/fmin
Unconstrained function minimization in Javascript
https://github.com/benfred/fmin
numerical-optimization optimization-algorithms visualization
Last synced: 13 days ago
JSON representation
Unconstrained function minimization in Javascript
- Host: GitHub
- URL: https://github.com/benfred/fmin
- Owner: benfred
- License: bsd-3-clause
- Created: 2016-11-24T23:39:25.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2018-06-03T23:55:38.000Z (over 6 years ago)
- Last Synced: 2024-10-14T18:40:21.635Z (about 1 month ago)
- Topics: numerical-optimization, optimization-algorithms, visualization
- Language: JavaScript
- Size: 1.32 MB
- Stars: 354
- Watchers: 20
- Forks: 61
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# fmin [![Build Status](https://travis-ci.org/benfred/fmin.svg?branch=master)](https://travis-ci.org/benfred/fmin)
Unconstrained function minimization in javascript.
This package implements some basic numerical optimization algorithms: Nelder-Mead, Gradient
Descent, Wolf Line Search and Non-Linear Conjugate Gradient methods are all provided.Interactive visualizations with D3 explaining how these algorithms work are also included in this package.
Descriptions of the algorithms as well as most of the visualizations are available on my blog post
[An Interactive Tutorial on Numerical
Optimization](http://www.benfrederickson.com/numerical-optimization/).## Installing
If you use NPM, `npm install fmin`. Otherwise, download the [latest release](https://github.com/benfred/fmin/releases/latest).
## API Reference
# nelderMead(f, initial)
Uses the [Nelder-Mead method](https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method) to
minimize a function f starting at location initial.Example usage minimizing the function f(x, y) = x2 + y2 + x sin y + y
sin x is:
![nelder mead demo](./images/nelder_mead.gif)```js
function loss(X) {
var x = X[0], y = X[1];
return Math.sin(y) * x + Math.sin(x) * y + x * x + y *y;
}var solution = fmin.nelderMead(loss, [-3.5, 3.5]);
console.log("solution is at " + solution.x);
```# conjugateGradient(f, initial)
Minimizes a function using the [Polak–Ribière non-linear conjugate gradient method
](https://en.wikipedia.org/wiki/Nonlinear_conjugate_gradient_method). The function f should
compute both the loss and the gradient.An example minimizing [Rosenbrock's Banana
function](https://en.wikipedia.org/wiki/Rosenbrock_function) is:![conjugate gradient demo](./images/conjugate_gradient.gif)
```js
function banana(X, fxprime) {
fxprime = fxprime || [0, 0];
var x = X[0], y = X[1];
fxprime[0] = 400 * x * x * x - 400 * y * x + 2 * x - 2;
fxprime[1] = 200 * y - 200 * x * x;
return (1 - x) * (1 - x) + 100 * (y - x * x) * (y - x * x);
}var solution = fmin.conjugateGradient(banana, [-1, 1]);
console.log("solution is at " + solution.x);
```