基于问题的非负线性最小二乘
这个例子展示了如何使用几种算法来求解解为非负的线性最小二乘问题。线性最小二乘问题有这样的形式
.
在这种情况下,约束解是非负的, .
首先,加载数组 而且 进入你的工作空间。
负载粒子
查看每个数组的大小。
size = size(C)
sizec =1×22000 400
size = size(d)
大小=1×22000年1
创建一个优化变量x
适合相乘的大小C
.的下限0
论的要素x
.
X = optimvar(“x”sizec (2)下界的, 0);
创建目标函数表达式。
残差= C*x - d;Obj = sum(residual.^2);
创建一个优化问题叫做nonneglsq
并将目标函数包含在问题中。
not ignored sq = optimproblem(“目标”、obj);
找到问题的默认解决方案。
Opts = optimoptions(nonignored sq)
opts = lsqlin options:当前算法(' internal -point')使用的选项:(其他可用算法:'active-set', 'trust-region- reflection ')设置属性:没有设置选项。默认属性:算法:'interior-point' constraintolerance: 1.0000e-08显示:'final' LinearSolver: 'auto' MaxIterations: 200 OptimalityTolerance: 1.0000e-08 StepTolerance: 1.0000e-12显示当前算法未使用的选项('interior-point')
使用默认求解器解决问题。
[sol,fval,exitflag,output] = solve(nonignored sq);
使用lsqlin解决问题。找到满足约束条件的最小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
要查看优化过程的详细信息,请检查输出结构。
disp(输出)
message: '找到满足约束条件的最小值....'算法:' inner -point' firstorderopt: 9.9673e-07 constrviolation: 0 iterations: 9 linearsolver: 'sparse' cgiterations: [] solver: 'lsqlin'
输出结构显示lsqlin
求解器对内点算法使用稀疏的内部线性求解器,经过9次迭代得到约1e-6的一阶最优测度。
改变算法
信任区域反射算法处理有界约束问题。看看它在这个问题上的表现如何。
选择。算法=“trust-region-reflective”;[sol2,fval2,exitflag2,output2] = solve(nonignored sq,“选项”、选择);
使用lsqlin解决问题。可能的局部最小值。Lsqlin停止,因为函数值的相对变化小于函数公差。
disp (output2)
14算法:'trust-region- reflection ' firstorderopt: 5.2187e-08 cgiterations: 54 constrbreach: [] linearsolver: [] message: '局部最小可能....' solver: 'lsqlin'
这一次,求解器进行更多迭代,并得到一个具有较低(更好)一阶最优性度量的解。
要获得更好的一阶最优性度量,请尝试设置SubproblemAlgorithm
选项“分解”
.
选择。SubproblemAlgorithm =“分解”;[sol3,fval3,exitflag3,output3] = solve(nonignored sq,“选项”、选择);
使用lsqlin解决问题。找到最优解。
disp (output3)
迭代:11算法:'trust-region- reflection ' firstorderopt: 1.3973e-14 cgiterations: 0 constrbreach: [] linearsolver: [] message: '找到最优解。' solver: 'lsqlin'
使用这个选项会使一阶最优性度量接近于零,这是最好的可能。
改变解算器
的lsqnonneg
求解器是专门为处理非负线性最小二乘而设计的。试试那个求解器。
[sol4,fval4,exitflag4,output4] = solve(nonignored sq,“规划求解”,“lsqnonneg”);
使用lsqnonneg解决问题。
disp (output4)
迭代:184算法:'active-set'消息:'优化终止。'求解器:'lsqnonneg'
lsqnonneg
没有报告一阶最优测度。方法中返回的残留规范fval
输出。要查看低显著性数字,请从每个剩余范数中减去22.5794。
T = table(fval - 22.5794, fval2 - 22.5794, fval3 - 22.5794, fval4 - 22.5794,...“VariableNames”, {“默认”,“trust-region-reflective”,“分解”,“lsqnonneg”})
t =1×4表默认trust-region-reflective分解lsqnonneg __________ _______________________ _____________ __________ 4.9179 4.9179 4.9179 5.0804 e-05 e-05 e-05 e-05
默认求解器的剩余范数比其他三种略高(更差),它们的剩余范数在此显示精度水平上难以区分。要看哪个是最小的,减去lsqnonneg
两个结果的结果。
Disp ([fval2 - fval4,fval3 - fval4])
1.0e-12 * 0.7034 0.6963
的lsqnonneg
残差范数最小,几乎可以忽略不计。然而,lsqnonneg
需要最多的迭代才能收敛。