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(___) は前述の任意の構文に対して、さらに残差の二乗ノルム値 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

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

 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, 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 を使用できます。詳細については、最適化オプションの設定を参照してください。

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 の長さと同じです。

二乗残差ノルム。非負のスカラーとして返されます。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 になるまで続けられます。

代替機能

アプリ

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