Main Content

lscov

既知の共分散を使用した最小二乗解法

    説明

    x = lscov(A,b) は、線形システム A*x = b について、誤差の二乗和 r'*r が最小になる最小二乗解を返します。ここで、行列 A と列ベクトル b について r = b - A*x です。b が行列の場合、xb の対応する列が別々に方程式を満たします。

    x = lscov(A,b,w) は、r'*diag(w)*r が最小になる重み付き最小二乗解を返します。ここで、r = b - A*x です。

    x = lscov(A,b,C) は、r'*inv(C)*r が最小になる一般化最小二乗解を返します。ここで、r = b - A*x であり、b の共分散行列は C に比例します。

    x = lscov(A,b,C,alg) は、線形システムを解くアルゴリズムを指定します。既定では、lscovC のコレスキー分解を使用して x を計算します。alg"orth" と指定すると、C の直交分解が使用されます。C が可逆でない場合、lscovalg の値に関係なく直交分解を使用します。

    [x,stdx] = lscov(___) は、x の推定標準誤差も返します。標準誤差は x の標準偏差の推定です。前述の構文にある任意の入力引数の組み合わせが使用できます。

    [x,stdx,mse] = lscov(___) は、平均二乗誤差も返します。平均二乗誤差は関数で最小化する値に比例します。

    [x,stdx,mse,S] = lscov(___) は、x の推定共分散行列も返します。この構文は b が列ベクトルの場合のみ使用できます。

    すべて折りたたむ

    線形システム A*x = b の行列 A とベクトル b を作成します。lscov を使用して線形システムの最小二乗解を計算します。3 つの出力引数を指定して、解、推定標準誤差、平均二乗誤差を返します。

    a1 = [0.2; 0.5; 0.6; 0.8; 1.0; 1.1]; 
    a2 = [0.1; 0.3; 0.4; 0.9; 1.1; 1.4]; 
    A = [ones(size(a1)) a1 a2]; 
    b = [0.17; 0.26; 0.28; 0.23; 0.27; 0.24];
    [x,stdx,mse] = lscov(A,b)
    x = 3×1
    
        0.1018
        0.4844
       -0.2847
    
    
    stdx = 3×1
    
        0.0058
        0.0206
        0.0135
    
    
    mse = 1.2774e-05
    

    b にノイズを追加してサンプルの行列を作成し、バックスラッシュ演算子 (\) を使用して行列の最小二乗推定を計算します。結果の各行の標準誤差を計算します。

    B = b + randn(6,1e5);
    X = A\B;
    s1 = std(X,0,2)
    s1 = 3×1
    
        1.6311
        5.7609
        3.7838
    
    

    バックスラッシュを使用して得られる標準誤差を lscov を使用して得られる標準誤差と比較します。lscov で実行されるスケーリングを考慮し、標準誤差 stdxmse の平方根で再スケーリングします。X の標準誤差は lscov で計算される標準誤差とおおむね一致します。再スケーリングされた標準誤差は、b の要素全体でノイズが一様な場合、x の最初の要素よりも 2 番目の要素の方がはるかに影響が大きいことを示しています。

    s2 = stdx/sqrt(mse)
    s2 = 3×1
    
        1.6349
        5.7661
        3.7845
    
    

    問題 A*x = b の行列 A とベクトル b を作成します。相対的な観測の重みのベクトルを作成し、重み付き最小二乗解を計算します。

    a1 = [0.2; 0.5; 0.6; 0.8; 1.0; 1.1]; 
    a2 = [0.1; 0.3; 0.4; 0.9; 1.1; 1.4]; 
    A = [ones(size(a1)) a1 a2]; 
    b = [0.17; 0.26; 0.28; 0.23; 0.27; 0.34];
    w = [1 1 1 1 1 0.1]';
    [x1,stdx1,mse1] = lscov(A,b,w)
    x1 = 3×1
    
        0.1046
        0.4614
       -0.2621
    
    
    stdx1 = 3×1
    
        0.0309
        0.1152
        0.0814
    
    
    mse1 = 3.4741e-04
    

    同じ問題の通常の最小二乗解を計算し、両方の解をプロットします。最初の 5 つの点は、重み付き最小二乗解の方が通常の最小二乗解よりも b に近くなっています。重み付き最小二乗解の 6 番目の要素は重みを下げているため、その解の 6 番目の点は b から離れています。

    [x2,stdx2,mse2] = lscov(A,b);
    x = 1:6;
    plot(x,b,"o",x,A*x1,"o",x,A*x2,"o")
    legend("b","Weighted","Ordinary")

    問題 A*x = b の行列 A とベクトル b を作成します。共分散スケールの行列を作成し、一般化最小二乗解を計算します。

    a1 = [0.2; 0.5; 0.6; 0.8; 1.0; 1.1]; 
    a2 = [0.1; 0.3; 0.4; 0.9; 1.1; 1.4]; 
    A = [ones(size(a1)) a1 a2]; 
    b = [0.17; 0.26; 0.28; 0.23; 0.27; 0.24];
    C = 0.2*ones(size(a1)) + 0.8*diag(ones(size(a1)));
    [x,stdx,mse] = lscov(A,b,C)
    x = 3×1
    
        0.1018
        0.4844
       -0.2847
    
    
    stdx = 3×1
    
        0.0061
        0.0206
        0.0135
    
    
    mse = 1.5967e-05
    

    問題 A*x = b の行列 A とベクトル b を作成します。x の共分散行列の推定を計算します。

    a1 = [0.2; 0.5; 0.6; 0.8; 1.0; 1.1]; 
    a2 = [0.1; 0.3; 0.4; 0.9; 1.1; 1.4]; 
    A = [ones(size(a1)) a1 a2]; 
    b = [0.17; 0.26; 0.28; 0.23; 0.27; 0.24];
    [x,stdx,mse,S] = lscov(A,b)
    x = 3×1
    
        0.1018
        0.4844
       -0.2847
    
    
    stdx = 3×1
    
        0.0058
        0.0206
        0.0135
    
    
    mse = 1.2774e-05
    
    S = 3×3
    10-3 ×
    
        0.0341   -0.1075    0.0617
       -0.1075    0.4247   -0.2712
        0.0617   -0.2712    0.1829
    
    

    係数の標準誤差は、この共分散行列の対角にある値の平方根に等しくなります。

    sqrt(diag(S))
    ans = 3×1
    
        0.0058
        0.0206
        0.0135
    
    

    入力引数

    すべて折りたたむ

    オペランド。ベクトルまたは行列として指定します。行列 Ab の行数は同じでなければなりません。b が行列の場合、lscovb の列ごとに 1 つの解を返します。

    データ型: single | double
    複素数のサポート: あり

    相対的な重み。A と同じ行数をもつ非負の実数の列ベクトルとして指定します。重みは一般にカウントまたは逆分散のいずれかです。この引数を指定すると、lscov は線形システム A*x = b の重み付き最小二乗解を返し、r'*diag(w)*r を最小化します。ここで、r = b - A*x です。

    データ型: single | double

    スケーリングされた共分散行列。実対称 (複素数の場合はエルミート) 行列として指定します。C は正定値または半正定値のいずれかになります。C が正定値の場合、lscov は線形システム A*x = b の最小二乗解を返し、r'*inv(C)*r を最小化します。ここで、r = b - A*x であり、共分散行列は C に比例します。

    C が半正定値の場合、lscovA*x + T*e = b の解を返します。ここで、T*T' = C であり、e はこのシステムが解をもつすべてのベクトル e の中で最小のノルムをもつベクトルです。このシステムは、b[A T] の列空間内にある場合のみ解をもちます。

    データ型: single | double

    最小二乗解のアルゴリズム。次の値のいずれかとして指定します。

    • "chol"C のコレスキー分解を使用し、その因子を反転して通常の最小二乗に問題を変換します。

    • "orth" — 直交分解アルゴリズムを使用します。C が悪条件の場合や特異の場合は、計算量は多くなりますが、このアルゴリズムの方が適しています。

    既定では、関数 lscov はコレスキー分解を使用します。ただし、C が半定値であると lscov が判定すると、alg の値に関係なく直交分解アルゴリズムが関数で使用されます。

    出力引数

    すべて折りたたむ

    解。ベクトルまたは行列として返されます。Amn 列の行列で bmp 列の行列の場合、xnp 列の行列になります。これは p1 の場合を含みます。A が劣決定の場合は複数の x が考えられます。この場合、一意に定義される解を得るために x の一部の要素がゼロに制限されます。

    A が非スパース ストレージの場合、x も非スパースになります。スケーリングされた共分散行列を指定する場合、xAb、および C がスパースであればスパースになります。それ以外の場合、xAb がスパースであればスパースになります。

    推定標準誤差。ベクトルとして返されます。スケーリングされた共分散行列で b の偏差を記述している場合、標準誤差は x の標準偏差の推定です。A が劣決定の場合、x のゼロに制限された要素に対応する stdx の要素にゼロが格納されます。

    lscovstdx を平均二乗誤差に基づいてスケーリングしますが、C が厳密に b の共分散行列であるとかわる場合はスケーリングは必要ありません。この場合に該当する推定を得るには、stdxsqrt(1/mse) でスケーリングします。

    平均二乗誤差。スカラーとして返されます。b に共分散行列 sigma^2*C または sigma^2*diag(1./w) がある場合、msesigma^2 の推定です。lscov では、b の共分散行列がスケール係数からのみわかり、mse をその未知のスケール係数の推定であると仮定します。

    推定共分散行列。関数は b が列ベクトルの場合のみ S を返します。A が劣決定の場合、x のゼロに制限された要素に対応する S の行と列にゼロが格納されます。

    lscovS を平均二乗誤差に基づいてスケーリングしますが、C が厳密に b の共分散行列であるとかわる場合はスケーリングは必要ありません。この場合に該当する推定を得るには、S1/mse でスケーリングします。

    アルゴリズム

    一般化最小二乗問題で mn 列の行列 Amm 列の行列 C がフル ランクの場合、mn 以上のときの lscov の出力は次の標準式で表されます。

    x = inv(A'*inv(C)*A)*A'*inv(C)*b
    mse = (b - A*x)'*inv(C)*(b - A*x)./(m-n)
    S = inv(A'*inv(C)*A)*mse
    stdx = sqrt(diag(S))

    mn 未満のときは平均二乗誤差は 0 です。

    重み付き最小二乗では、C の代わりに diag(1./w) を使用するときに標準式が適用されます。通常の最小二乗では、C の代わりに単位行列を使用します。

    関数 lscov で使用している方法は標準式よりも高速で安定性が高く、ランク落ちの場合にも適用できます。たとえば、lscov はコレスキー分解 C = R'*R を計算してから、代わりに最小二乗問題 (R'\A)*x = (R'\b) を解きます。これには、最小二乗問題を解くために mldivideA\b に使用されるのと同じアルゴリズムが使用されます。

    参照

    [1] Paige, Christopher C. "Computer Solution and Perturbation Analysis of Generalized Linear Least Squares Problems." Mathematics of Computation 33, no. 145 (1979): 171–83. https://doi.org/10.2307/2006034.

    [2] Golub, Gene H., and Charles F. Van Loan. Matrix Computations. Baltimore, MD: Johns Hopkins University Press, 1996.

    [3] Goodall, Colin R. "Computation using the QR decomposition." Handbook of Statistics 9 (1993): 467–508. https://doi.org/10.1016/S0169-7161(05)80137-3.

    [4] Strang, Gilbert. Introduction to Applied Mathematics. Wellesley, MA: Wellesley-Cambridge Press, 1986.

    拡張機能

    バージョン履歴

    R2006a より前に導入