Documentation |
Solve nonnegative least-squares constraints problem
Solves nonnegative least-squares curve fitting problems of the form
$$\underset{x}{\mathrm{min}}{\Vert C\cdot x-d\Vert}_{2}^{2},\text{where}x\ge 0.$$
x = lsqnonneg(C,d)
x = lsqnonneg(C,d,options)
x = lsqnonneg(problem)
[x,resnorm] = lsqnonneg(...)
[x,resnorm,residual] = lsqnonneg(...)
[x,resnorm,residual,exitflag] = lsqnonneg(...)
[x,resnorm,residual,exitflag,output]
= lsqnonneg(...)
[x,resnorm,residual,exitflag,output,lambda]
= lsqnonneg(...)
x = lsqnonneg(C,d) returns the vector x that minimizes norm(C*x-d) subject to x >= 0. C and d must be real.
x = lsqnonneg(C,d,options) minimizes with the optimization parameters specified in the structure options. You can define these parameters using the optimset function. lsqnonneg uses these options structure fields:
Display | Level of display. 'off' displays no output; 'final' displays just the final output; 'notify' (default) displays output only if the function does not converge. |
TolX | Termination tolerance on x. |
x = lsqnonneg(problem) finds the minimum for problem, where problem is a structure with the following fields:
C | Matrix |
d | Vector |
solver | 'lsqnonneg' |
options | Options structure created using optimset |
[x,resnorm] = lsqnonneg(...) returns the value of the squared 2-norm of the residual: norm(C*x-d)^2.
[x,resnorm,residual] = lsqnonneg(...) returns the residual, d-C*x.
[x,resnorm,residual,exitflag] = lsqnonneg(...) returns a value exitflag that describes the exit condition of lsqnonneg:
>0 | Indicates that the function converged to a solution x. |
0 | Indicates that the iteration count was exceeded. Increasing the tolerance (TolX parameter in options) may lead to a solution. |
[x,resnorm,residual,exitflag,output] = lsqnonneg(...) returns a structure output that contains information about the operation in the following fields:
algorithm | 'active-set' |
iterations | The number of iterations taken |
message | Exit message |
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(...) returns the dual vector (Lagrange multipliers) lambda, where lambda(i)<=0 when x(i) is (approximately) 0, and lambda(i) is (approximately) 0 when x(i)>0.
Compare the unconstrained least squares solution to the lsqnonneg solution for a 4-by-2 problem:
C = [ 0.0372 0.2869 0.6861 0.7071 0.6233 0.6245 0.6344 0.6170]; d = [ 0.8587 0.1781 0.0747 0.8405]; [C\d lsqnonneg(C,d)] = -2.5627 0 3.1108 0.6929 [norm(C*(C\d)-d) norm(C*lsqnonneg(C,d)-d)] = 0.6674 0.9118
The solution from lsqnonneg does not fit as well (has a larger residual), as the least squares solution. However, the nonnegative least squares solution has no negative components.
[1] Lawson, C.L. and R.J. Hanson, Solving Least Squares Problems, Prentice-Hall, 1974, Chapter 23, p. 161.