Levenberg – Marquardt 알고리즘은 어떻게 상세하게 작동하지만 이해할 수있는 방식으로 어떻게 작동합니까?

StackOverflow https://stackoverflow.com/questions/1136416

문제

Im Levenberg – Marquardt Curvefitting 알고리즘이 어떻게 작동하는지 배우고 싶어하는 프로그래머입니다. 수학자가 아닌 프로그래머를 꿀벌을 뿌리는 독자와 함께 어떻게 작동하는지 설명 할 수있는 좋은 튜토리얼이 있습니까?

내 목표는이 알고리즘을 OpenCL에서 구현하여 하드웨어 가속화를 실행할 수 있도록하는 것입니다.

도움이 되었습니까?

해결책

다른 팁

함수를 최소화하는 것은 표면에서 가장 낮은 지점을 찾는 것과 같습니다. 언덕이 많은 표면을 걷고 가장 낮은 지점에 도달하려고한다고 생각하십시오. 당신은 내리막 길로가는 방향을 발견하고 더 이상 내리막 길이 가지 않을 때까지 걸을 것입니다. 그런 다음 내리막 길로 들어가서 더 이상 내리막 길이 가지 않을 때까지 그 방향으로 걸어가는 새로운 방향을 선택했습니다. 결국 (희망적으로) 당신은 더 이상 방향이 내리막 길로 가지 않는 지점에 도달 할 것입니다. 그런 다음 (현지) 최소값에있을 것입니다.

LM 알고리즘 및 기타 많은 최소화 알고리즘은이 체계를 사용합니다.

최소화되는 함수가 F이고 우리는 반복의 x (n) 지점에 있다고 가정합니다. f (x (n+1)) <f (x (n))이되도록 다음 반복 x (n+1)를 찾고자합니다. 즉, 함수 값이 더 작습니다. x (n+1)를 선택하려면 x (n)의 방향과 스텝 크기 (그 방향으로가는 거리)의 두 가지가 필요합니다. LM 알고리즘은 이러한 값을 다음과 같이 결정합니다.

먼저, 지점 x (n)에서 f로 선형 근사치를 계산합니다. 선형 함수의 내리막 방향을 쉽게 찾을 수 있으므로 선형 근사 기능을 사용하여 내리막 방향을 결정합니다. 다음으로, 우리는이 선택한 방향으로 얼마나 멀리 갈 수 있는지 알아야합니다. 근사 선형 함수가 x (n) 주위의 넓은 영역에 대한 f에 대한 근사치라면 상당히 큰 단계를 밟을 수 있습니다. X (n)에 매우 가까운 좋은 근사치라면, 우리는 아주 작은 단계 만 수행 할 수 있습니다.

이것이 LM이하는 일입니다 - x (n)에서 f에 대한 선형 근사치를 계산하여 내리막 방향을 제공 한 다음 선형 함수가 x (n)의 F에 얼마나 잘 어울리는 지에 따라 얼마나 큰 단계를 취할 수 있는지 알아냅니다. LM은 기본적으로 방향을 결정하고 F에 대한 선형 근사치가 실제 함수 F가 얼마나 감소했는지에 대한 선형 근사치를 비교함으로써 근사 기능이 얼마나 좋은지를 알 수 있습니다. 가까이 있으면 근사 기능이 양호하고 조금 더 큰 단계를 밟을 수 있습니다. 그들이 가까이 있지 않으면 근사 기능이 좋지 않으며 우리는 물러서서 더 작은 단계를 밟아야합니다.

LM 알고리즘의 기본 아이디어는 몇 페이지로 설명 될 수 있지만 빠르고 강력한 생산 등급 구현에는 많은 미묘한 최적화가 필요합니다. 최첨단 ART는 여전히 Moré et al.의 Minpack 구현이며, Moré 1978 (http://link.springer.com/content/pdf/10.1007/BFB0067700.pdf) 및 Minpack 사용자 안내서 (http://www.mcs.anl.gov/~more/anl8074b.pdf). 코드를 연구하기 위해 내 C 번역 (https://jugit.fz-juelich.de/mlz/lmfit)은 원래 Fortran 코드보다 더 액세스하기 쉽습니다.

노력하다 수치 레시피 (Levenberg-Marquardt는 섹션 15.5에 있습니다). 온라인으로 사용할 수 있으며 자세한 방식으로 알고리즘을 설명합니다 (완전한 소스 코드, 얼마나 자세한 내용을 얻을 수 있는지) 액세스 할 수 있습니다.

나는 사용했다 Purdue University의 과정 에서이 메모 MATLAB의 일반적인 Levenberg-Marquardt Curve Fitting 알고리즘을 코딩하려면 수치 미분을 계산하고 양식의 기능을 수용합니다. f(x;p) 어디 p 피팅 매개 변수의 벡터입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top