Main Content

lsqnonneg

求解非负线性最小二乘问题

说明

求解以下形式的非负最小二乘曲线拟合问题

minxCxd22, where x0.

示例

x = lsqnonneg(C,d) 返回在 x ≥ 0 的约束下,使得 norm(C*x-d) 最小的向量 x。参数 Cd 必须为实数。

示例

x = lsqnonneg(C,d,options) 使用结构体 options 中指定的优化选项求最小值。使用 optimset (Optimization Toolbox) 可设置这些选项。

x = lsqnonneg(problem)problem 的最小值,其中 problem 是一个结构体。

示例

[x,resnorm,residual] = lsqnonneg(___),对于上述任何语法,还返回残差的 2-范数平方值 norm(C*x-d)^2 以及残差 d-C*x

[x,resnorm,residual,exitflag,output] = lsqnonneg(___) 还返回描述 lsqnonneg 的退出条件的值 exitflag,以及提供优化过程信息的结构体 output

示例

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___) 还返回拉格朗日乘数向量 lambda

示例

全部折叠

计算线性最小二乘问题的非负解,并将结果与无约束问题的解进行比较。

为问题 min||Cx-d|| 准备 C 矩阵和 d 向量。

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];

计算有约束和无约束的解。

x = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

xunc = C\d
xunc = 2×1

   -2.5627
    3.1108

x 中的所有项均为非负数,但 xunc 中某些项为负数。

计算两个解的残差的范数。

constrained_norm = norm(C*x - d)
constrained_norm = 0.9118
unconstrained_norm = norm(C*xunc - d)
unconstrained_norm = 0.6674

无约束解的残差范数较小,因为约束只会增加残差范数。

Display 选项设置为 'final',以查看 lsqnonneg 结束时的输出。

创建选项。

options = optimset('Display','final');

为问题 min||Cx-d|| 准备 C 矩阵和 d 向量。

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];

使用 options 结构体调用 lsqnonneg

x = lsqnonneg(C,d,options);
Optimization terminated.

以带输出的方式调用 lsqnonneg,以获取解、残差范数和残差向量。

为问题 min||Cx-d|| 准备 C 矩阵和 d 向量。

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];

获取解和残差信息。

 [x,resnorm,residual] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

验证返回的残差范数是返回的残差向量范数的平方。

 norm(residual)^2
ans = 0.8315

lsqnonneg 完成之后,请求所有输出参数,以检查解和求解过程。

为问题 min||Cx-d|| 准备 C 矩阵和 d 向量。

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];

求解该问题,并请求所有输出参数。

[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(C,d)
x = 2×1

         0
    0.6929

resnorm = 0.8315
residual = 4×1

    0.6599
   -0.3119
   -0.3580
    0.4130

exitflag = 1
output = struct with fields:
    iterations: 1
     algorithm: 'active-set'
       message: 'Optimization terminated.'

lambda = 2×1

   -0.1506
   -0.0000

exitflag1,表示正确的解。

x(1) = 0,对应的 lambda(1) 0,表示正确的对偶性。同样,x(2) > 0,对应的 lambda(2) = 0

输入参数

全部折叠

线性乘数,指定为实矩阵。代表以下问题中的变量 C:

minxCxd22, where x0.

为了保证兼容性,C 的行数必须等于 d 的长度。

示例: C = [1,2;3,-1;-4,4]

数据类型: double

加法项,指定为实数向量。代表以下问题中的变量 d:

minxCxd22, where x0.

为了保证兼容性,d 的长度必须等于 C 的行数。

示例: d = [1;-6;5]

数据类型: double

优化选项,指定为结构体,例如 optimset 返回的结构体。您可以使用 optimset 设置或更改 options 结构体中这些字段的值。有关详细信息,请参阅设置优化选项

Display

显示级别:

  • 'notify'(默认值)仅在函数未收敛时显示输出。

  • 'off''none' 不显示输出。

  • 'final' 仅显示最终输出。

TolX

关于正标量 x 的终止容差。默认值为 10*eps*norm(C,1)*length(C)。请参阅 容差和终止条件

示例: options = optimset('Display','final')

数据类型: struct

问题结构体,指定为含有以下字段的结构体。

字段名称条目

C

实矩阵

d

实数向量

solver

'lsqnonneg'

options

Options 结构体,例如 optimset 返回的结构体

数据类型: struct

输出参数

全部折叠

解,以实数向量形式返回。xd 的长度相同。

残差范数的平方,以非负标量的形式返回。等于 norm(C*x-d)^2

残差,以实数向量形式返回。残差为 d - C*x

lsqnonneg 停止的原因,以整数形式返回。

1

函数收敛于解 x

0

迭代次数超出 options.MaxIter

有关优化过程的信息,以包含下列字段的结构体形式返回:

iterations

执行的迭代次数

algorithm

'active-set'

message

退出消息

拉格朗日乘数,以实数向量形式返回。这些条目满足互补条件 x'*lambda = 0。这意味着当 x(i) 近似为 0 时,lambda(i) < 0;当 x(i) > 0 时,lambda(i) 近似为 0

算法

lsqnonneg 使用 [1] 中所述的算法。算法以一组可能的基向量开始并计算关联的对偶向量 lambda。然后将选择对应于 lambda 中的最大值的基向量,以便将该基向量交换为其他可能的向量。此操作会一直继续,直至 lambda ≤ 0

替代功能

App

优化实时编辑器任务为 lsqnonneg 提供可视化界面。

参考

[1] Lawson, C. L. and R. J. Hanson. Solving Least-Squares Problems. Upper Saddle River, NJ: Prentice Hall. 1974. Chapter 23, p. 161.

扩展功能

版本历史记录

在 R2006a 之前推出

另请参阅

| |