가우스-뉴턴 알고리즘

thumb|300px|가우스-뉴턴 알고리즘을 사용하여 격자점 <math> x_i </math>에서 잔차 제곱합 <math> r_i(\beta) = y_i - f_{\beta}(x_i) </math>을 최소화함으로써 매개변수 <math>\beta</math>를 가진 비대칭 피크 모델 <math>f_{\beta}(x)</math>로 노이즈가 있는 곡선을 피팅하는 모습. <br /> 상단: 원시 데이터와 모델.<br /> 하단: 정규화된 오차 제곱합의 진화.

**가우스-뉴턴 알고리즘**()은 비선형 최소제곱법 문제를 해결하는 데 사용되며, 이는 함수 값의 제곱합을 최소화하는 것과 같다. 이 알고리즘은 비선형 함수의 최솟값을 찾기 위한 뉴턴 방법의 확장이다. 제곱합은 반드시 비음수여야 하므로, 이 알고리즘은 뉴턴 방법을 사용하여 합의 각 성분의 근을 반복적으로 근사함으로써 합을 최소화하는 것으로 볼 수 있다. 이런 의미에서 이 알고리즘은 과결정 연립방정식을 푸는 데에도 효과적인 방법이다. 계산하기 어려울 수 있는 2계 도함수가 필요하지 않다는 장점이 있다.

비선형 최소제곱 문제는 예를 들어 비선형 회귀에서 발생하는데, 여기서는 모델이 가용 관측치와 잘 일치하도록 모델의 매개변수를 찾는다.

이 방법은 수학자 카를 프리드리히 가우스와 아이작 뉴턴의 이름을 따서 명명되었으며, 가우스의 1809년 저작인 《Theoria motus corporum coelestium in sectionibus conicis solem ambientum》에 처음 등장했다.

## 설명
n개의 변수 \boldsymbol{\beta} = (\beta_1, \ldots \beta_n)를 가진 m개의 함수 \textbf{r} = (r_1, \ldots, r_m)(흔히 잔차라고 함)가 주어지고 m \geq n일 때, 가우스-뉴턴 알고리즘은 제곱합을 최소화하는 \beta의 값을 반복법으로 찾는다.
 S(\boldsymbol \beta) = \sum_{i=1}^m r_i(\boldsymbol \beta)^{2}.

최솟값에 대한 초기 추측치 \boldsymbol \beta^{(0)}에서 시작하여, 이 방법은 다음과 같은 반복을 거친다.
 \boldsymbol \beta^{(s+1)} = \boldsymbol \beta^{(s)} - \left(\mathbf{J_r}^\operatorname{T} \mathbf{J_r} \right)^{-1} \mathbf{J_r}^\operatorname{T} \mathbf{r}\left(\boldsymbol \beta^{(s)}\right), 

여기서 **r**과 **β**가 열벡터라면, 야코비 행렬의 성분은 다음과 같다.
 \left(\mathbf{J_r}\right)_{ij} = \frac{\partial r_i \left(\boldsymbol \beta^{(s)}\right)}{\partial \beta_j},

그리고 기호 ^\operatorname{T}는 행렬 전치를 나타낸다.

매 반복마다 업데이트 \Delta = \boldsymbol \beta^{(s+1)} - \boldsymbol \beta^{(s)}는 이전 방정식을 다음 두 단계로 재배열하여 찾을 수 있다.

*\Delta = -\left(\mathbf{J_r}^\operatorname{T} \mathbf{J_r} \right)^{-1} \mathbf{J_r}^\operatorname{T} \mathbf{r}\left(\boldsymbol \beta^{(s)}\right)
*\mathbf{J_r}^\operatorname{T} \mathbf{J_r} \Delta = -\mathbf{J_r}^\operatorname{T} \mathbf{r}\left(\boldsymbol \beta^{(s)}\right) 

A = \mathbf{J_r}^\operatorname{T} \mathbf{J_r} , \mathbf{b} = -\mathbf{J_r}^\operatorname{T} \mathbf{r}\left(\boldsymbol \beta^{(s)}\right) , \mathbf {x} = \Delta 로 치환하면, 이는 A\mathbf {x} = \mathbf {b}  형태의 전형적인 행렬 방정식이 되며, 다양한 방법으로 풀 수 있다(내용주 참조).

만약 이라면, 이 반복은 다음과 같이 단순화된다.

 \boldsymbol \beta^{(s+1)} = \boldsymbol \beta^{(s)} - \left(\mathbf{J_r}\right)^{-1} \mathbf{r}\left(\boldsymbol \beta^{(s)}\right),

이는 1차원에서의 뉴턴 방법을 직접적으로 일반화한 것이다.

주어진 모델 함수  \mathbf{f}(\mathbf{x}, \boldsymbol{\beta}) 가 일부 데이터 포인트  (x_i, y_i) 에 가장 잘 맞도록 매개변수 \boldsymbol{\beta}를 찾는 데이터 피팅에서, 함수  r_i 는 잔차이다.
r_i(\boldsymbol \beta) = y_i - f\left(x_i, \boldsymbol \beta\right).

그러면 가우스-뉴턴 방법은 함수  \mathbf{f} 의 야코비 행렬  \mathbf{J_f} = -\mathbf{J_r} 을 사용하여 다음과 같이 표현될 수 있다.
 \boldsymbol \beta^{(s+1)} = \boldsymbol \beta^{(s)} + \left(\mathbf{J_f}^\operatorname{T} \mathbf{J_f} \right)^{-1} \mathbf{J_f}^\operatorname{T} \mathbf{r}\left(\boldsymbol \beta^{(s)}\right). 

여기서 \left(\mathbf{J_f}^\operatorname{T} \mathbf{J_f}\right)^{-1} \mathbf{J_f}^\operatorname{T}는 \mathbf{J_f}의 왼쪽 무어-펜로즈 유사역행렬이다.

## 내용주
알고리즘 설명에서 이라는 가정은 필수적인데, 그렇지 않으면 행렬  \mathbf{J_r}^T\mathbf{J_r} 의 역행렬이 존재하지 않아 정규 방정식을 (적어도 유일하게) 풀 수 없기 때문이다.

가우스-뉴턴 알고리즘은 함수 벡터 ri를 선형 근사하여 유도할 수 있다. 테일러 정리를 사용하면 매 반복마다 다음과 같이 쓸 수 있다.
\mathbf{r}(\boldsymbol \beta) \approx \mathbf{r}\left(\boldsymbol \beta^{(s)}\right) + \mathbf{J_r}\left(\boldsymbol \beta^{(s)}\right)\Delta

여기서 \Delta = \boldsymbol \beta - \boldsymbol \beta^{(s)}이다. 우변의 제곱합을 최소화하는  \Delta 를 찾는 작업, 즉
\min \left\|\mathbf{r}\left(\boldsymbol \beta^{(s)}\right) + \mathbf{J_r}\left(\boldsymbol \beta^{(s)}\right)\Delta\right\|_2^2,

은 선형 최소제곱 문제이며, 이를 명시적으로 풀면 알고리즘의 정규 방정식이 도출된다.

정규 방정식은 미지수 증분  \Delta 에 대한 n개의 연립 선형 방정식이다. 이는 숄레스키 분해를 사용하거나, 더 좋게는  \mathbf{J_r} 의 QR 분해를 사용하여 한 단계 만에 풀 수 있다. 대규모 시스템의 경우 켤레기울기법과 같은 반복법이 더 효율적일 수 있다. 만약 **J****r**의 열 사이에 선형 종속성이 있으면  \mathbf{J_r}^T\mathbf{J_r} 이 특이 행렬이 되므로 반복이 실패한다.

\mathbf{r}이 복소수 \mathbf{r}:\Complex^n \to \Complex인 경우 켤레 형태인 \left(\overline \mathbf{J_r}^\operatorname{T} \mathbf{J_r}\right)^{-1}\overline \mathbf{J_r}^\operatorname{T}를 사용해야 한다.

## 예시
thumb|right|280px|관측 데이터(빨간색)와 <math>\hat\beta_1 = 0.362</math>, <math>\hat\beta_2 = 0.556</math>으로 얻은 계산된 곡선(파란색)
이 예시에서는 가우스-뉴턴 알고리즘을 사용하여 데이터와 모델 예측값 사이의 오차 제곱합을 최소화함으로써 모델을 데이터에 피팅한다.

효소 매개 반응에서 기질 농도 와 반응 속도 사이의 관계를 연구하는 생물학 실험에서 다음 표의 데이터를 얻었다.

최소제곱 의미에서 데이터에 가장 잘 맞는 다음과 같은 형태의 곡선(모델 함수)을 찾고자 한다.
\text{rate} = \frac{V_\text{max} \cdot [S]}{K_M + [S]}

여기서 매개변수 V_\text{max}와 K_M을 결정해야 한다.

i = 1, \dots, 7에 대해 와 **속도**의 값을 각각 x_i와 y_i로 나타내자. \beta_1 = V_\text{max}이고 \beta_2 = K_M이라 하자. 잔차의 제곱합
r_i = y_i - \frac{\beta_1 x_i}{\beta_2 + x_i},  \quad (i = 1, \dots, 7)

이 최소화되도록 하는 \beta_1과 \beta_2를 찾을 것이다.

미지수 \beta_j에 대한 잔차 벡터 r_i의 야코비 행렬 \mathbf{J_r}은 i번째 행이 다음과 같은 성분을 갖는 7 \times 2 행렬이다.
\frac{\partial r_i}{\partial \beta_1} = -\frac{x_i}{\beta_2 + x_i};
\quad
\frac{\partial r_i}{\partial \beta_2} = \frac{\beta_1 \cdot x_i}{\left(\beta_2 + x_i\right)^2}.

\beta_1 = 0.9 및 \beta_2 = 0.2라는 초기 추측값으로 시작하여, 가우스-뉴턴 알고리즘을 5번 반복한 후 최적값 \hat\beta_1 = 0.362와 \hat\beta_2 = 0.556을 얻는다. 잔차 제곱합은 초기값 1.445에서 5번의 반복 후 0.00784로 감소했다. 오른쪽 그림의 그래프는 최적 매개변수로 결정된 모델 곡선과 관측 데이터를 보여준다.

## 수렴 특성
가우스-뉴턴 반복은 다음 4가지 조건 하에서 국소 최솟값 \hat{\beta}로 수렴함이 보장된다. 함수 r_1,\ldots,r_m이 열린 볼록 집합 D\ni\hat{\beta}에서 2회 연속 미분 가능하고, 야코비 행렬 \mathbf{J}_\mathbf{r}(\hat{\beta})이 풀 컬럼 랭크(full column rank)를 가지며, 초기 반복값 \beta^{(0)}이 \hat{\beta}에 가깝고, 국소 최솟값 |S(\hat{\beta})|이 작아야 한다. 만약 |S(\hat{\beta})|=0이면 수렴은 2차 수렴(quadratic)이다.

증분 Δ가 에 대한 하강 방향이며, 알고리즘이 수렴한다면 그 극한은 의 임계점임을 보일 수 있다. 그러나 최솟값 |S(\hat{\beta})|이 큰 경우에는 수렴이 보장되지 않으며, 뉴턴 방법과 같은 국소 수렴이나 통상적인 울프 조건(Wolfe conditions) 하에서의 수렴도 보장되지 않는다.

가우스-뉴턴 알고리즘의 수렴 속도는 2차 수렴에 가까워질 수 있다. 초기 추측치가 최솟값에서 멀거나 행렬 \mathbf{J_r^\operatorname{T} J_r}의 상태가 나쁘면(ill-conditioned) 알고리즘이 느리게 수렴하거나 전혀 수렴하지 않을 수 있다. 예를 들어 m = 2개의 방정식과 n = 1개의 변수를 가진 다음 문제를 고려해 보자.
\begin{align}
  r_1(\beta) &= \beta + 1, \\
  r_2(\beta) &= \lambda \beta^2 + \beta - 1.
\end{align} 

\lambda 일 때 \beta = 0은 국소 최적점이다. 만약 \lambda = 0이면 문제는 실제로 선형이며 방법은 한 번의 반복으로 최적점을 찾는다. |λ|  1이면 방법은 국소적으로조차 수렴하지 않는다.

## 과결정 연립방정식 풀기
가우스-뉴턴 반복
\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} - J(\mathbf{x}^{(k)})^\dagger\mathbf{f}(\mathbf{x}^{(k)}) \,,\quad k=0,1,\ldots
은 \mathbf{f}(\mathbf{x}) = \begin{bmatrix} f_1(x_1,\ldots,x_n) \\ \vdots \\ f_m(x_1,\ldots,x_n) \end{bmatrix} 형태의 \mathbf{f}(\mathbf{x})=\mathbf{0} 과결정 연립방정식을 푸는 효과적인 방법이다. 여기서 m>n이고 J(\mathbf{x})^\dagger는 \mathbf{f}(\mathbf{x})의 야코비 행렬 J(\mathbf{x})의 무어-펜로즈 유사역행렬이다.
이는 뉴턴 방법의 확장으로 간주될 수 있으며 격리된 정규해에 대해 동일한 국소 2차 수렴을 누린다.

해는 존재하지 않지만 초기 반복값 \mathbf{x}^{(0)}이 제곱합 \sum_{i=1}^m |f_i(x_1,\ldots,x_n)|^2 \equiv \|\mathbf{f}(\mathbf{x})\|_2^2이 작은 국소 최솟값에 도달하는 점 \hat{\mathbf{x}} = (\hat{x}_1,\ldots,\hat{x}_n) 근처에 있다면, 가우스-뉴턴 반복은 \hat{\mathbf{x}}로 선형적으로 수렴한다. 점 \hat{\mathbf{x}}는 종종 과결정 시스템의 최소제곱 해라고 불린다.

## 뉴턴 방법으로부터의 유도

다음에서는 근사를 통해 함수 최적화를 위한 뉴턴 방법으로부터 가우스-뉴턴 알고리즘을 유도한다. 그 결과 가우스-뉴턴 알고리즘의 수렴 속도는 특정 정칙성 조건 하에서 2차 수렴이 될 수 있다. 일반적인 경우(더 약한 조건 하에서) 수렴 속도는 선형적이다.

매개변수 \boldsymbol\beta의 함수 S를 최소화하기 위한 뉴턴 방법의 점화식은 다음과 같다.
 \boldsymbol\beta^{(s+1)} = \boldsymbol\beta^{(s)} - \mathbf H^{-1} \mathbf g,

여기서 **g**는 S의 기울기 벡터를 나타내고, **H**는 S의 헤세 행렬을 나타낸다.

S = \sum_{i=1}^m r_i^2이므로 기울기는 다음과 같이 주어진다.
g_j = 2 \sum_{i=1}^m r_i \frac{\partial r_i}{\partial \beta_j}.

헤세 행렬의 원소는 기울기 원소 g_j를 \beta_k에 대해 미분하여 계산한다.
H_{jk} = 2 \sum_{i=1}^m \left(\frac{\partial r_i}{\partial \beta_j} \frac{\partial r_i}{\partial \beta_k} + r_i \frac{\partial^2 r_i}{\partial \beta_j \partial \beta_k}\right).

가우스-뉴턴 방법은 2계 도함수 항(이 식의 두 번째 항)을 무시함으로써 얻어진다. 즉, 헤세 행렬은 다음과 같이 근사된다.
H_{jk} \approx 2 \sum_{i=1}^m J_{ij} J_{ik},

여기서 J_{ij} = {\partial r_i}/{\partial \beta_j}는 야코비 행렬 **J<sub>r</sub>**의 성분이다. 정확한 피팅 근처에서 정확한 헤세를 평가할 때 r_i가 거의 0이 되므로 두 번째 항도 거의 0이 되어 이 근사가 정당화된다. 기울기와 근사된 헤세 행렬은 행렬 표기법으로 다음과 같이 쓸 수 있다.
\mathbf{g} = 2 {\mathbf{J}_\mathbf{r}}^\operatorname{T} \mathbf{r}, \quad \mathbf{H} \approx 2 {\mathbf{J}_\mathbf{r}}^\operatorname{T} \mathbf{J_r}.

이러한 표현을 위의 점화식에 대입하여 다음과 같은 연산 방정식을 얻는다.
 \boldsymbol{\beta}^{(s+1)} = \boldsymbol\beta^{(s)} + \Delta; \quad \Delta = -\left(\mathbf{J_r}^\operatorname{T} \mathbf{J_r}\right)^{-1} \mathbf{J_r}^\operatorname{T} \mathbf{r}.

가우스-뉴턴 방법의 수렴이 모든 경우에 보장되는 것은 아니다. 2계 도함수 항을 무시할 수 있기 위해 성립해야 하는 근사치
\left|r_i \frac{\partial^2 r_i}{\partial \beta_j \partial \beta_k}\right| \ll \left|\frac{\partial r_i}{\partial \beta_j} \frac{\partial r_i}{\partial \beta_k}\right|

는 다음과 같은 두 가지 경우에 유효할 수 있으며, 이 경우 수렴이 기대된다.
# 함수 값 r_i가 적어도 최솟값 주변에서 크기가 작을 때.
# 함수가 "약하게" 비선형적이어서 \frac{\partial^2 r_i}{\partial \beta_j \partial \beta_k}가 상대적으로 크기가 작을 때.

## 개선된 버전
가우스-뉴턴 방법을 사용하면 잔차 제곱합 S가 매 반복마다 감소하지 않을 수도 있다. 그러나 Δ가 하강 방향이므로 S\left(\boldsymbol \beta^s\right)가 임계점이 아닌 한, 충분히 작은 모든 \alpha>0에 대해 S\left(\boldsymbol \beta^s + \alpha\Delta\right) 가 성립한다. 따라서 발산이 발생하는 경우 한 가지 해결책은 업데이트 공식에서 증분 벡터 Δ의 일부인 \alpha를 사용하는 것이다.
 \boldsymbol \beta^{s+1} = \boldsymbol \beta^s + \alpha \Delta.

즉, 증분 벡터가 너무 길지만 여전히 "내리막"을 가리키고 있으므로 그 길의 일부만 가면 목적 함수 S를 줄일 수 있다. \alpha에 대한 최적값은 직선 탐색 알고리즘을 사용하여 찾을 수 있다. 즉, \alpha의 크기는 보통 0  구간에서의 직접 탐색법이나 아르미호(Armijo) 직선 탐색과 같은 백트래킹 직선 탐색을 사용하여 S를 최소화하는 값을 찾아 결정된다. 일반적으로 \alpha는 울프 조건이나 골드슈타인(Goldstein) 조건을 만족하도록 선택해야 한다.

이동 벡터의 방향 때문에 최적 분율 α가 0에 가까운 경우, 발산을 처리하기 위한 대안적인 방법은 신뢰 영역 방법인 레벤버그-마쿼트 알고리즘(Levenberg–Marquardt algorithm)을 사용하는 것이다. 정규 방정식은 증분 벡터가 최속 하강 방향으로 회전하도록 다음과 같이 수정된다.
\left(\mathbf{J^\operatorname{T} J + \lambda D}\right) \Delta = -\mathbf{J}^\operatorname{T} \mathbf{r},

여기서 **D**는 양의 대각 행렬이다. **D**가 단위 행렬 **I**이고 \lambda \to +\infty일 때, \lambda \Delta = \lambda \left(\mathbf{J^\operatorname{T} J} + \lambda \mathbf{I}\right)^{-1} \left(-\mathbf{J}^\operatorname{T} \mathbf{r}\right) = \left(\mathbf{I} - \mathbf{J^\operatorname{T} J} / \lambda + \cdots \right) \left(-\mathbf{J}^\operatorname{T} \mathbf{r}\right) \to -\mathbf{J}^\operatorname{T} \mathbf{r}이 되므로, Δ의 방향은 음의 기울기 방향인 -\mathbf{J}^\operatorname{T} \mathbf{r}에 가까워진다.

소위 마쿼트 매개변수 \lambda도 직선 탐색에 의해 최적화될 수 있지만, 이는 \lambda가 바뀔 때마다 이동 벡터를 다시 계산해야 하므로 비효율적이다. 더 효율적인 전략은 발산이 발생하면 S가 감소할 때까지 마쿼트 매개변수를 늘리는 것이다. 그런 다음 한 반복에서 다음 반복까지 그 값을 유지하되, 컷오프 값에 도달할 때까지 가능하면 줄여서 마쿼트 매개변수를 0으로 설정할 수 있게 한다. 그러면 S의 최소화는 표준 가우스-뉴턴 최소화가 된다.

## 대규모 최적화
대규모 최적화에서 가우스-뉴턴 방법은 특별히 관심을 받는데, 왜냐하면 (항상은 아니지만) 행렬 \mathbf{J}_\mathbf{r}이 근사 헤세 행렬 \mathbf{J}_\mathbf{r}^\operatorname{T} \mathbf{J_r}보다 더 성긴 경우가 많기 때문이다. 이러한 경우 단계 계산 자체는 일반적으로 켤레기울기법과 같이 크고 성긴 문제에 적합한 근사 반복법으로 수행해야 한다.

이러한 접근 방식이 작동하게 하려면 적어도 다음과 같은 곱을 계산하는 효율적인 방법이 필요하다.
{\mathbf{J}_\mathbf{r}}^\operatorname{T} \mathbf{J_r} \mathbf{p}

어떤 벡터 **p**에 대해서 말이다. 성긴 행렬 저장 방식에서는 일반적으로 \mathbf{J}_\mathbf{r}의 행을 압축된 형태(예: 0이 아닌 원소만)로 저장하는 것이 실용적인데, 전치로 인해 위의 곱을 직접 계산하는 것이 까다로울 수 있다. 그러나 **c**i를 행렬 \mathbf{J}_\mathbf{r}의 행 i로 정의하면 다음과 같은 간단한 관계가 성립한다.
{\mathbf{J}_\mathbf{r}}^\operatorname{T}\mathbf{J_r} \mathbf{p} = \sum_i \mathbf c_i \left(\mathbf c_i \cdot \mathbf{p}\right),

따라서 모든 행은 곱에 가산적이고 독립적으로 기여한다. 실용적인 성긴 저장 구조를 존중하는 것 외에도, 이 표현식은 병렬 컴퓨팅에 매우 적합하다. 모든 행 **c**i는 해당 잔차 ri의 기울기라는 점에 유의하라. 이를 염두에 두면 위의 공식은 잔차가 서로 독립적으로 문제에 기여한다는 사실을 강조한다.

## 관련 알고리즘
다비돈(Davidon), 플레처(Fletcher), 파월(Powell)에 의한 방법이나 브로이든-플레처-골드파브-샤노(BFGS 방법)와 같은 준뉴턴 방법에서는 1계 도함수 \frac{\partial r_i}{\partial \beta_j}만을 사용하여 전체 헤세 행렬 \frac{\partial^2 S}{\partial \beta_j \partial\beta_k}의 추정치를 수치적으로 구축하여 n번의 정교화 사이클 후에 성능 면에서 뉴턴 방법에 가깝게 근사한다. 준뉴턴 방법은 일반적인 실숫값 함수를 최소화할 수 있는 반면 가우스-뉴턴, 레벤버그-마쿼트 등은 비선형 최소제곱 문제에만 적합하다는 점에 유의하라.

1계 도함수만을 사용하여 최소화 문제를 해결하는 또 다른 방법은 경사 하강법이다. 그러나 이 방법은 2계 도함수를 근사적으로도 고려하지 않는다. 결과적으로 많은 함수에서, 특히 매개변수 간의 상호작용이 강한 경우 매우 비효율적이다.

## 구현 예시
### 줄리아
줄리아의 다음 구현은 제공된 야코비 행렬을 사용하는 방법과 자동 미분을 사용하여 계산하는 방법을 제공한다.

```julia
"""
    gaussnewton(r, J, β₀, maxiter, tol)

야코비 J가 있는 잔차 함수 r을 최소화하기 위해 β₀에서 시작하여 가우스-뉴턴 최적화를 수행한다. 단계의 노름이 tol보다 작거나 maxiter번 반복한 후 알고리즘이 종료된다.
"""
function gaussnewton(r, J, β₀, maxiter, tol)
    β = copy(β₀)
    for _ in 1:maxiter
        Jβ = J(β);
        Δ  = -(Jβ' * Jβ) \ (Jβ' * r(β))
        β += Δ
        if sqrt(sum(abs2, Δ)) < tol
            break
        end
    end
    return β
end

import AbstractDifferentiation as AD, Zygote
backend = AD.ZygoteBackend() # 다른 백엔드도 사용 가능

"""
    gaussnewton(r, β₀, maxiter, tol)

β₀에서 시작하여 잔차 함수 r을 최소화하기 위해 가우스-뉴턴 최적화를 수행한다. 관련 야코비 행렬은 자동 미분을 사용하여 계산된다. 단계의 노름이 tol보다 작거나 maxiter번 반복한 후 알고리즘이 종료된다.
"""
function gaussnewton(r, β₀, maxiter, tol)
    β = copy(β₀)
    for _ in 1:maxiter
        rβ, Jβ = AD.value_and_jacobian(backend, r, β)
        Δ  = -(Jβ[1]' * Jβ[1]) \ (Jβ[1]' * rβ)
        β += Δ
        if sqrt(sum(abs2, Δ)) < tol
            break
        end
    end
    return β
end
```


## 각주


## 참고 문헌
*
* .
*

## 외부 링크
* Probability, Statistics and Estimation 이 알고리즘이 자세히 설명되어 있으며 이 문서에서 예시로 논의된 생물학 실험에 적용되었다 (추정값의 불확실성과 함께 84페이지).

### 구현
* Artelys Knitro는 가우스-뉴턴 방법이 구현된 비선형 솔버이다. C로 작성되었으며 C++/C#/Java/Python/MATLAB/R용 인터페이스가 있다.

분류:통계 알고리즘
분류:최소제곱법
분류:최적화 알고리즘 및 방법