Main Content

lsqnonneg

非負の線形最小二乗法問題を解く

説明

以下の形式の非負の最小二乗曲線近似問題を解く

minxCxd22, where x0.

メモ

lsqnonneg は、ソルバーベースのアプローチのみに適用されます。2 つの最適化アプローチの詳細については、はじめに問題ベース アプローチまたはソルバーベース アプローチを選択を参照してください。

x = lsqnonneg(C,d) は、x ≥ 0 の制約の下で、norm(C*x-d) を最小にするベクトル x を返します。引数 Cd は実数でなければなりません。

x = lsqnonneg(C,d,options) は、options 構造体に指定する最適化オプションを使って最小化します。optimset を使用してこれらのオプションを設定してください。

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 の一部のエントリは負です。

2 つの解の残差のノルムを計算します。

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

制約で増加できるのは残差ノルムのみであるため、制約なしの解にはより小さい残差ノルムがあります。

lsqnonneg の完了時に出力を確認するには、Display オプションを 'final' に設定します。

オプションを作成します。

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

オプション構造体を使用して 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

返された残差ノルムが返された残差ベクトルのノルムの 2 乗であることを検証します。

 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

exitflag は正確な解を示す 1 です。

x(1) = 0 および対応する lambda(1) 0 は正しい二重性を示します。x(2) > 0 と対応する lambda(2) = 0 も同様です。

入力引数

すべて折りたたむ

線形の乗数。実数の行列として指定します。問題における変数 C を表します。

minxCxd22.

互換性を保つために、C の行数と d の長さは等しくなければなりません。

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

データ型: double

加法項。実数ベクトルとして指定します。問題における変数 d を表します。

minxCxd22.

互換性を保つために、d の長さと C の行数は等しくなければなりません。

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

データ型: double

最適化オプション。optimset などによって返される構造体として指定されます。オプション構造体のこれらのフィールドの値を設定または変更するために、optimset を使用できます。詳細については、最適化オプション リファレンスを参照してください。

Display

表示レベル:

  • 'notify' (既定の設定) — 関数が収束しない場合にのみ出力を表示する。

  • 'off' または 'none' — 出力を表示しない。

  • 'final' — 最終出力のみを表示する。

TolX

x に関する許容誤差 (正のスカラー)。既定値は 10*eps*norm(C,1)*length(C) です。詳細については、許容誤差と停止条件を参照してください。

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

データ型: struct

次のフィールドをもつ構造体として指定される問題構造体です。

フィールド名エントリ

C

実数行列

d

実数ベクトル

solver

'lsqnonneg'

options

optimset などによって返されるオプション構造体

データ型: struct

出力引数

すべて折りたたむ

解。実数ベクトルとして返されます。x の長さは d の長さと同じです。

2 乗残差ノルム。非負のスカラーとして返されます。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 であり、lambda(i)x(i) > 0 の場合、近似的に 0 です。

ヒント

  • d の長さが 20 より大きい問題では、lsqlinlsqnonneg より速くなる可能性があります。d の長さが 20 以下の場合、lsqnonneg の方が一般的に効率的です。

    C の行が列より多い場合 (すなわち過決定システムの場合) にソルバー間で切り替えるには、以下のようになります。

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

    は、以下と等価です。

    [m,n] = size(C);
    [x,resnorm,residual,exitflag,output,lambda_lsqlin] = ...
       lsqlin(C,d,-eye(n,n),zeros(n,1));

    唯一の違いは、対応するラグランジュ乗数の符号 lambda = -lambda_lsqlin.ineqlin が反転していることです。

アルゴリズム

lsqnonneg[1] で示すアルゴリズムを使用します。アルゴリズムは、可能な基底ベクトルの集合から開始して、関連した双対ベクトル lambda を計算します。そして他の基底ベクトルと交換するためにベクトル lambda の最大値に対応する基底ベクトルを選んで交換します。この操作は、lambda ≤ 0 になるまで続けられます。

代替機能

アプリ

[最適化] ライブ エディター タスクが 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 より前に導入