https://github.com/mljs/nnls
Non-Negative Least-Squares
https://github.com/mljs/nnls
Last synced: 8 months ago
JSON representation
Non-Negative Least-Squares
- Host: GitHub
- URL: https://github.com/mljs/nnls
- Owner: mljs
- License: mit
- Created: 2023-07-30T21:38:21.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2023-10-24T13:33:56.000Z (over 2 years ago)
- Last Synced: 2025-02-15T09:11:28.882Z (over 1 year ago)
- Language: TypeScript
- Size: 94.7 KB
- Stars: 0
- Watchers: 6
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# nnls
[![NPM version][npm-image]][npm-url]
[![build status][ci-image]][ci-url]
[![Test coverage][codecov-image]][codecov-url]
[![npm download][download-image]][download-url]
Non-Negative Least-Squares (NNLS) algorithm, by Lawson and Hanson. It was mostly done for learning purposes, and will be improved over time.
Currently, it seems to match [scipy](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.nnls.html), at least in some basic tests.
You are welcome to report issues and contribute to this project.
## Installation
`$ npm i nnls`
## Basic Usage
```js
import { nnls } from 'nnls';
const { x, d } = nnls(X, y); // result and dual vectors
```
The code returns also the dual vector.
You can get execution information using the options:
## Example with options
```js
import { nnls } from 'nnls';
import { Matrix } from 'ml-matrix'; //npm i ml-matrix
const X = new Matrix([
[1, 0],
[2, 0],
[3, 0],
[0, 1],
]);
const Y = Matrix.columnVector([1, 2, 3, 4]);
const solution = Matrix.columnVector([1, 4]);
const result = nnls(X, Y, { info: true });
console.log(result.x.to1DArray(), result.info);
/*
{
x: Matrix {
[
1.000000
4
]
rows: 2
columns: 1
},
d: Matrix {
[
-3.6e-15
0
]
rows: 2
columns: 1
},
info: {
rse: [ 5.477225575051661, 4, 1.0175362097255202e-15 ],
iterations: 3
}
}
* /
```
## [Documentation](https://mljs.github.io/nnls/)
## Misc.
Like other implementations (for example `scipy.optimize.nnls`) it is limited to a single vector $y$, or as it is called in the literature, a single right-hand-side (RHS).
As a minor addition to other implementations, you can pass `{ interceptAtZero:false }` then the result is consistent with $f(0)=C$.
For multiple RHS, you can take a look at [Fast-Combinatorial Non-Negative Least-Squares](https://github.com/mljs/fcnnls)
## License
[MIT](./LICENSE)
[npm-image]: https://img.shields.io/npm/v/nnls.svg
[npm-url]: https://www.npmjs.com/package/nnls
[ci-image]: https://github.com/mljs/nnls/workflows/Node.js%20CI/badge.svg?branch=main
[ci-url]: https://github.com/mljs/nnls/actions?query=workflow%3A%22Node.js+CI%22
[codecov-image]: https://img.shields.io/codecov/c/github/mljs/nnls.svg
[codecov-url]: https://codecov.io/gh/mljs/nnls
[download-image]: https://img.shields.io/npm/dm/nnls.svg
[download-url]: https://www.npmjs.com/package/nnls