이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

lsqnonneg

음이 아닌 선형 최소제곱 문제 풀기

설명

다음 형식의 음이 아닌 최소제곱 곡선 피팅 문제를 풉니다.

minxCxd22, where x0.

참고

lsqnonneg 솔버는 솔버 기반 접근법에만 적용됩니다. 두 가지 최적화 접근법에 대한 설명은 먼저 문제 기반 접근법 또는 솔버 기반 접근법 중 선택하기 항목을 참조하십시오.

예제

x = lsqnonneg(C,d)norm(C*x-d)를 최소화하는 벡터 x를 반환하며, 여기에는 x ≥ 0이 적용됩니다. 인수 Cd는 실수여야 합니다.

예제

x = lsqnonneg(C,d,options)는 구조체 options에 지정된 최적화 옵션을 사용하여 최소화합니다. 이 옵션을 설정하려면 optimset을 사용하십시오.

x = lsqnonneg(problem)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의 일부 요소는 음수입니다.

두 해에 대한 잔차의 노름을 계산합니다.

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

options 구조체를 지정하여 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

exitflag1이며, 이는 올바른 해임을 나타냅니다.

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을 사용하여 options 구조체에서 다음 필드의 값을 설정하거나 변경할 수 있습니다. 자세한 내용은 최적화 옵션 참조 항목을 참조하십시오.

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에서 반환되는 options 구조체

problem 구조체를 얻을 수 있는 가장 간단한 방법은 최적화 앱에서 문제를 내보내는 것입니다.

데이터형: 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에 가까워진다는 의미입니다.

  • 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이 될 때까지 계속됩니다.

참고 문헌

[1] Lawson, C. L. and R. J. Hanson. Solving Least-Squares Problems. Upper Saddle River, NJ: Prentice Hall. 1974. Chapter 23, p. 161.

확장 기능

참고 항목

| | |

R2006a 이전에 개발됨