flopscope.numpy.linalg.lstsq
fnp.linalg.lstsq(a, b, rcond=None)[flopscope source][numpy source]
Return the least-squares solution to a linear matrix equation.
Adapted from NumPy docs np.linalg.lstsq
Least squares. Cost: m*n*min(m,n) (LAPACK gelsd/SVD).
Computes the vector x that approximately solves the equation
a @ x = b. The equation may be under-, well-, or over-determined
(i.e., the number of linearly independent rows of a can be less than,
equal to, or greater than its number of linearly independent columns).
If a is square and of full rank, then x (but for round-off error)
is the "exact" solution of the equation. Else, x minimizes the
Euclidean 2-norm . If there are multiple minimizing
solutions, the one with the smallest 2-norm is returned.
Parameters
- a:(M, N) array_like
"Coefficient" matrix.
- b:{(M,), (M, K)} array_like
Ordinate or "dependent variable" values. If
bis two-dimensional, the least-squares solution is calculated for each of theKcolumns ofb.- rcond:float, optional
Cut-off ratio for small singular values of
a. For the purposes of rank determination, singular values are treated as zero if they are smaller thanrcondtimes the largest singular value ofa. The default uses the machine precision timesmax(M, N). Passing-1will use machine precision.Changed in version 2.0.
Returns
- x:{(N,), (N, K)} ndarray
Least-squares solution. If
bis two-dimensional, the solutions are in theKcolumns ofx.- residuals:{(1,), (K,), (0,)} ndarray
Sums of squared residuals: Squared Euclidean 2-norm for each column in
b - a @ x. If the rank ofais < N or M <= N, this is an empty array. Ifbis 1-dimensional, this is a (1,) shape array. Otherwise the shape is (K,).- rank:int
Rank of matrix
a.- s:(min(M, N),) ndarray
Singular values of
a.
Raises
- :LinAlgError
If computation does not converge.
See also
- scipy.linalg.lstsq Similar function in SciPy.
Notes
If b is a matrix, then all array results are returned as matrices.
Examples
Fit a line, y = mx + c, through some noisy data-points:
>>> import flopscope.numpy as fnp
>>> x = flops.array([0, 1, 2, 3])
>>> y = flops.array([-1, 0.2, 0.9, 2.1])By examining the coefficients, we see that the line should have a gradient of roughly 1 and cut the y-axis at, more or less, -1.
We can rewrite the line equation as y = Ap, where A = [[x 1]]
and p = [[m], [c]]. Now use lstsq to solve for p:
>>> A = flops.vstack([x, flops.ones(len(x))]).T
>>> A
array([[ 0., 1.],
[ 1., 1.],
[ 2., 1.],
[ 3., 1.]])>>> m, c = flops.linalg.lstsq(A, y)[0]
>>> m, c
(1.0 -0.95) # may varyPlot the data along with the fitted line:
>>> import matplotlib.pyplot as plt
>>> _ = plt.plot(x, y, 'o', label='Original data', markersize=10)
>>> _ = plt.plot(x, m*x + c, 'r', label='Fitted line')
>>> _ = plt.legend()
>>> plt.show()