lstsq#

rlinalg.lstsq(a, b, tol=1e-07, overwrite_a=False, check_finite=True)#

Compute least-squares solution to equation Ax = b.

Compute a vector x such that the 2-norm |b - A x| is minimized.

Parameters:
  • a ((M, N) array_like) – Left-hand side array

  • b ((M,) or (M, K) array_like) – Right hand side array

  • tol (float) – The absolute tolerance to use for QR decomposition.

  • overwrite_a (bool, optional) – Discard data in a (may enhance performance). Default is False.

  • check_finite (bool, optional) – Whether to check that the input matrices contain only finite numbers. Disabling may give a performance gain, but may result in problems (crashes, non-termination) if the inputs do contain infinities or NaNs.

Returns:

  • x ((N,) or (N, K) ndarray) – Least-squares solution. For underdetermined systems, x[i] will be zero for all i >= rank(A).

  • residues ((K,) ndarray or float) – Square of the 2-norm for each column in b - a x, if M > N and rank(A) == n (returns a scalar if b is 1-D). Otherwise a (0,)-shaped array is returned.

  • rank (int) – Effective rank of a.

Raises:

ValueError – When parameters are not compatible.

Notes

This function uses a QR decomposition rather than a SVD decomposition in the case of numpy.linalg.lstsq or scipy.linalg.lstsq. This is the same behaviour as :r:func:`lm.fit`.

See also

numpy.linalg.lstsq

The NumPy implementation using LAPACK.

scipy.linalg.lstsq

The NumPy implementation using LAPACK.

lm.fit

Documentation of the equivalent R function lm.fit.

Examples

>>> import numpy
>>> from rlinalg import lstsq

Suppose we have the following data:

>>> x = numpy.array([1, 2.5, 3.5, 4, 5, 7, 8.5])
>>> y = numpy.array([0.3, 1.1, 1.5, 2.0, 3.2, 6.6, 8.6])

We want to fit a quadratic polynomial of the form y = a + b*x**2 to this data. We first form the “design matrix” M, with a constant column of 1s and a column containing x**2:

>>> M = x[:, numpy.newaxis]**[0, 2]
>>> M
array([[ 1.  ,  1.  ],
       [ 1.  ,  6.25],
       [ 1.  , 12.25],
       [ 1.  , 16.  ],
       [ 1.  , 25.  ],
       [ 1.  , 49.  ],
       [ 1.  , 72.25]])

We want to find the least-squares solution to M.dot(p) = y, where p is a vector with length 2 that holds the parameters a and b.

>>> p, res, rank = lstsq(M, y)
>>> p
array([0.20925829, 0.12013861])