ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

非負の最小二乗法、問題ベース

この例では、次の問題を解くための問題ベースのアプローチを示します。

C*x = d

これは最小二乗法で解きます。ここで、Cd は与えられた配列、x は未知の配列であり、x は非負に制限されます。つまり、次のようになります。

sum((C*x - d).^2) を最小化する

x >= 0 という条件に従う

はじめに、配列 C および d をワークスペースに読み込みます。

load particle

配列のサイズを表示します。

sizec = size(C)
sizec = 1×2

        2000         400

sized = size(d)
sized = 1×2

        2000           1

C による乗算用に適切なサイズの最適化変数 x を作成します。x の要素に対して下限 0 を設定します。

x = optimvar('x',sizec(2),'LowerBound',0);

目的関数の式を作成します。

residual = C*x - d;
obj = sum(residual.^2);

nonneglsq という名前の最適化問題を作成し、目的関数を問題に含めます。

nonneglsq = optimproblem('Objective',obj);

問題に対する既定のソルバーを求めます。

opts = optimoptions(nonneglsq)
opts = 
  lsqlin options:

   Options used by current Algorithm ('interior-point'):
   (Other available algorithms: 'trust-region-reflective')

   Set properties:
     No options set.

   Default properties:
              Algorithm: 'interior-point'
    ConstraintTolerance: 1.0000e-08
                Display: 'final'
           LinearSolver: 'auto'
          MaxIterations: 200
    OptimalityTolerance: 1.0000e-08
          StepTolerance: 1.0000e-12

   Show options not used by current Algorithm ('interior-point')

既定のソルバーを使用して、問題を解きます。

[sol,fval,exitflag] = solve(nonneglsq)
Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
    x: [400x1 double]

fval = 22.5795
exitflag = 
    OptimalSolution

既定のソルバーlsqlinはすぐに終了しました。しかし、このような性質の問題を扱う他のソルバーもあります。lsqnonnegは、quadprogと同様にこのタイプの問題を解きます。それぞれを試します。

[sol2,fval2,exitflag2] = solve(nonneglsq,'Solver','lsqnonneg');
[sol3,fval3,exitflag3] = solve(nonneglsq,'Solver','quadprog');
Minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

それぞれの解について最初の 10 個のエントリを確認します。

solutions = table(sol.x(1:10),sol2.x(1:10),sol3.x(1:10),'VariableNames',{'lsqlin','lsqnonneg','quadprog'})
solutions=10×3 table
      lsqlin      lsqnonneg     quadprog 
    __________    _________    __________

      0.049416    0.049416       0.049416
      0.082985    0.082985       0.082985
      0.078469    0.078469       0.078469
       0.11682     0.11682        0.11682
       0.07165     0.07165        0.07165
      0.060525    0.060525       0.060525
    1.2196e-09           0     1.2196e-09
     2.703e-10           0      2.703e-10
    1.5017e-10           0     1.5017e-10
    1.2331e-10           0     1.2331e-10

lsqnonneg のエントリはいくつかが正確にゼロになっていますが、他の解は正確にゼロではありません。たとえば、各解の 8 番目のエントリは次のようになっています。

fprintf('The entries are %d, %d, and %d.\n',sol.x(8),sol2.x(8),sol3.x(8))
The entries are 2.702960e-10, 0, and 2.702960e-10.

quadproglsqlin の別のアルゴリズムの方がもう少し正確かもしれません。

options = optimoptions('lsqlin','Algorithm','trust-region-reflective');
[sol,fval,exitflag] = solve(nonneglsq,'Solver','lsqlin','Options',options);
Local minimum possible.

lsqlin stopped because the relative change in function value is less than the function tolerance.
disp(sol.x(8))
   2.2832e-15
options = optimoptions('quadprog','Algorithm','trust-region-reflective');
[sol3,fval3,exitflag3] = solve(nonneglsq,'Solver','quadprog','Options',options);
Local minimum possible.

quadprog stopped because the relative change in function value is less than the sqrt of the function tolerance, the rate of change in the function value is slow, and no negative curvature was detected.
disp(sol3.x(8))
   6.7615e-13

'trust-region-reflective' アルゴリズムを使用すると、既定の内点法アルゴリズムの場合より解がわずかにゼロに近づきます。

関連するトピック