Module ndarray_linalg::least_squares[][src]

Least Squares

Compute a least-squares solution to the equation Ax = b. Compute a vector x such that the 2-norm |b - A x| is minimized.

Finding the least squares solutions is implemented as traits, meaning that to solve A x = b for a matrix A and a RHS b, we call let result = A.least_squares(&b);. This returns a result of type LeastSquaresResult, the solution for the least square problem is in result.solution.

There are three traits, LeastSquaresSvd with the method least_squares, which operates on immutable references, LeastSquaresInto with the method least_squares_into, which takes ownership over both the array A and the RHS b and LeastSquaresSvdInPlace with the method least_squares_in_place, which operates on mutable references for A and b and destroys these when solving the least squares problem. LeastSquaresSvdInto and LeastSquaresSvdInPlace avoid an extra allocation for A and b which LeastSquaresSvd has do perform to preserve the values in A and b.

All methods use the Lapacke family of methods *gelsd which solves the least squares problem using the SVD with a divide-and-conquer strategy.

The traits are implemented for value types f32, f64, c32 and c64 and vector or matrix right-hand-sides (ArrayBase<S, Ix1> or ArrayBase<S, Ix2>).

Example

use approx::AbsDiffEq; // for abs_diff_eq
use ndarray::{array, Array1, Array2};
use ndarray_linalg::{LeastSquaresSvd, LeastSquaresSvdInto, LeastSquaresSvdInPlace};

let a: Array2<f64> = array![
    [1., 1., 1.],
    [2., 3., 4.],
    [3., 5., 2.],
    [4., 2., 5.],
    [5., 4., 3.]
];
// solving for a single right-hand side
let b: Array1<f64> = array![-10., 12., 14., 16., 18.];
let expected: Array1<f64> = array![2., 1., 1.];
let result = a.least_squares(&b).unwrap();
assert!(result.solution.abs_diff_eq(&expected, 1e-12));

// solving for two right-hand sides at once
let b_2: Array2<f64> =
    array![[-10., -3.], [12., 14.], [14., 12.], [16., 16.], [18., 16.]];
let expected_2: Array2<f64> = array![[2., 1.], [1., 1.], [1., 2.]];
let result_2 = a.least_squares(&b_2).unwrap();
assert!(result_2.solution.abs_diff_eq(&expected_2, 1e-12));

// using `least_squares_in_place` which overwrites its arguments
let mut a_3 = a.clone();
let mut b_3 = b.clone();
let result_3 = a_3.least_squares_in_place(&mut b_3).unwrap();

// using `least_squares_into` which consumes its arguments
let result_4 = a.least_squares_into(b).unwrap();
// `a` and `b` have been moved, no longer valid

Structs

LeastSquaresResult

Result of a LeastSquares computation

Traits

LeastSquaresSvd

Solve least squares for immutable references

LeastSquaresSvdInPlace

Solve least squares for mutable references, overwriting the input fields in the process

LeastSquaresSvdInto

Solve least squares for owned matrices