非负线性最小二乘解问题的数学模型为
\[{min}_{x}\frac{1}{2}{\left\| Cx-d \right\|}_{2}^{2}\]
\[x\geq 0\]
式中,矩阵C和矢量d为目标函数的系数。独立变量矢量x要求非负。
最优化工具箱用lsqnonneg函数求线性问题的非负最小二乘解。其调用格式为:
x = lsqnonneg(C,d) 返回矢量x,使范数(C*x-d)最小化,约束条件为x >= 0。C和d必须为实数。
x = lsqnonneg(C,d,x0) 若所有的x0>=0,则使用x0为初值;否则使用默认值。默认的初值为原点(当x0==[ ]或只提供两个输入变量时也使用默认值)。
x = lsqnonneg(C,d,x0,options) 用options结构指定的优化参数进行最小化。
[x,resnorm] = lsqnonneg(...) 返回残差的平方范数值:norm(C*x-d)^2。
[x,resnorm,residual] = lsqnonneg(...) 返回残差C*x-d。
[x,resnorm,residual,exitflag] = lsqnonneg(...) 返回exitflag参数,描述退出条件。
[x,resnorm,residual,exitflag,output] = lsqnonneg(...) 返回包含优化信息的输出结构output参数。
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(...) 返回拉格朗日乘子lambda。
【例18】 利用下面的4*2问题比较无约束最小二乘解和lsqnonneg函数解。
code.matlab
>> 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)]
ans =
-2.5627 0
3.1108 0.6929
>> [norm(C*(C\d)-d), norm(C*lsqnonneg(C,d)-d)]
ans =
0.6674 0.9118
二者的解不完全吻合,但非负最小二乘解没有为负的元素。