## fcnnls

Fast Combinatorial Non-negative Least Squares.

As described in the publication by Van Benthem and Keenan (10.1002/cem.889), which is in turn based on the active-set method algorithm previously published by Lawson and Hanson. The basic active-set method is implemented in the nnls repository.

Given the matrices $\mathbf{X}$ and $\mathbf{Y}$, the code finds the matrix $\mathbf{K}$ that minimises the squared Frobenius norm $$\mathrm{argmin}_K ||\mathbf{XK} -\mathbf{Y}||^2_F$$ subject to $\mathbf{K}\geq 0$.

https://en.wikipedia.org/wiki/Non-negative_least_squares

### Installation

```
npm i ml-fcnnls
```

### Usage Example

- Single $y$, using arrays as inputs.

```
import { fcnnlsVector } from 'ml-fcnnls';
const X = [
[1, 1, 2],
[10, 11, -9],
[-1, 0, 0],
[-5, 6, -7],
];
const y = [-1, 11, 0, 1];
const k = fcnnlsVector(X, y).K.to1DArray();
```

- Multiple RHS, using
`Matrix`

instances as inputs.

```
import { fcnnls } from 'ml-fcnnls';
import { Matrix } from 'ml-matrix';
const X = new Matrix([
[1, 1, 2],
[10, 11, -9],
[-1, 0, 0],
[-5, 6, -7],
]);
const Y = new Matrix([
[-1, 0, 0, 9],
[11, -20, 103, 5],
[0, 0, 0, 0],
[1, 2, 3, 4],
]);
const K = fcnnls(X, Y).K;
```

- Using the options

```
const K = fcnnls(X, Y, {
info: true,
maxIterations: 5,
gradientTolerance: 0,
});
```

### License

MIT