주요 콘텐츠

lscov

알려진 공분산을 사용한 최소제곱해(Least-squares Solution)

    설명

    x = lscov(A,b)는 선형 시스템 A*x = b에 대해 오차제곱 r'*r의 합을 최소화하는 최소제곱해를 반환합니다. 여기서 r = b - A*x입니다(A가 행렬이고 b가 열 벡터인 경우). 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를 사용하여 선형 시스템의 최소제곱해를 계산합니다. 해, 해의 추정된 표준 오차, 해의 평균제곱오차를 반환할 세 개의 출력 인수를 지정합니다.

    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를 사용하여 얻은 표준 오차를 비교합니다. mse의 제곱근으로 표준 오차 stdx를 다시 스케일링하여 lscov로 수행된 스케일링을 반영합니다. X에 대한 표준 오차는 일반적으로 lscov로 계산된 표준 오차와 일치합니다. 다시 스케일링된 표준 오차는 b의 요소 전체에 균일한 잡음이 있는 경우 x의 두 번째 요소가 첫 번째 요소보다 훨씬 더 많은 영향을 받음을 나타냅니다.

    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에 더 가까이 있습니다. 가중 최소제곱해의 여섯 번째 요소에 가중치가 부여되었으므로 여섯 번째 점은 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")

    Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent 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의 각 열에 대해 하나의 해를 반환합니다.

    데이터형: 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 값에 관계없이 직교 분해 알고리즘을 사용합니다.

    출력 인수

    모두 축소

    해로, 벡터나 행렬로 반환됩니다. Am×n 행렬이고 bm×p 행렬인 경우 xn×p 행렬이 됩니다(p1인 경우 포함). A가 부족 결정인 경우 x가 여러 개 있을 수 있습니다. 이 경우 고유하게 정의된 해를 얻기 위해 x의 일부 요소가 0으로 제한됩니다.

    A가 비희소 저장 형식을 갖는 경우 x도 비희소 저장 형식을 갖습니다. 스케일링된 공분산 행렬을 지정할 경우 A, b, C가 희소 행렬이면 x는 희소 행렬입니다. 그렇지 않은 경우, Ab가 희소 행렬이면 x는 희소 행렬입니다.

    추정된 표준 오차로, 벡터로 반환됩니다. 스케일링된 공분산 행렬이 b의 변동을 설명한다는 점을 고려하면 표준 오차는 x의 표준 변동을 추정하는 것입니다. A가 부족 결정인 경우 stdxx의 제한된 0 요소에 대응하는 요소에 0을 포함시킵니다.

    lscov는 평균제곱오차에 따라 stdx를 스케일링합니다. 그러나 Cb의 공분산 행렬과 정확히 일치한다고 확인되면 스케일링이 필요하지 않습니다. 이 경우 적절한 추정값을 구하려면 stdxsqrt(1/mse)로 스케일링합니다.

    평균제곱오차로, 스칼라로 반환됩니다. b에 공분산 행렬 sigma^2*C 또는 sigma^2*diag(1./w)가 있는 경우 msesigma^2의 추정값입니다. lscovb의 공분산 행렬을 스케일링 인자를 통해서만 확인할 수 있다고 가정하며 mse는 알 수 없는 스케일링 인자의 추정값입니다.

    추정된 공분산 행렬입니다. 이 함수는 b가 열 벡터인 경우에만 S를 반환합니다. A가 부족 결정인 경우 Sx의 제한된 0 요소에 대응하는 행과 열에 0을 포함시킵니다.

    lscov는 평균제곱오차에 따라 S를 스케일링합니다. 그러나 Cb의 공분산 행렬과 정확히 일치한다고 확인되면 스케일링이 필요하지 않습니다. 이 경우 적절한 추정값을 구하려면 S1/mse로 스케일링합니다.

    알고리즘

    m×n 행렬 Am×m 행렬 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입니다.

    가중 최소제곱의 경우 Cdiag(1./w)로 대체할 때 표준 식이 적용됩니다. 보통최소제곱의 경우 C를 단위 행렬로 대체합니다.

    lscov 함수는 표준 식보다 더 빠르고 안정적인 메서드를 사용하며, 랭크가 부족한 경우에 적용할 수 있습니다. 예를 들어, lscov는 촐레스키 분해 C = R'*R을 계산한 다음, 최소제곱 문제 (R'\A)*x = (R'\b)를 대신 풀기 위해 A\b를 풀 때 mldivide에서 사용한 것과 동일한 알고리즘을 사용합니다.

    참고 문헌

    [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 이전에 개발됨

    참고 항목

    | | |