최소자승법 이해와 다양한 활용예 (Least Square Method)

기계학습 2013.04.19 11:07

한글로 최소자승법 또는 최소제곱법, 영어로는 LSM(Least Square Method) 또는 LMS(Least Mean Square) 방법.

최소자승법 하면 흔히 어떤 점들의 분포를 직선이나 곡선으로 근사하는 것만을 생각하기 쉽습니다. 하지만, 최소자승법은 일반적인 수학적 도구(tool)로서 수치해석, 회귀분석 뿐만 아니라 영상처리 분야에서도 다양하게 활용될 수 있습니다.


이 글에서는 최소자승법이 어떻게 실제 다양한 문제에 활용될 수 있는지, 그리고 계산은 어떻게 하면 되는지 몇몇 구체적 예를 통해 하나씩 살펴보도록 하겠습니다. 그래서 궁극적으로는 이 글을 읽는 분들이 자신의 문제에 최소자승법을 보다 잘 활용할 수 있기를 바래 봅니다. 최소자승법을 잘만 활용할 수 있어도 연구개발에 있어 강력한 무기(?) 하나를 갖게 되는 셈입니다 ^^


1. 최소자승법의 이해

2. 최소자승법의 계산

3. 최소자승법의 활용

4. 최소자승법의 한계


최소자승법을 활용할 수 있으려면 먼저 최소자승법이 어떤 것인지 알고 있어야 할 것입니다.



1. 최소자승법의 이해


조금 딱딱한 표현이긴 하지만 최소자승법(Least Square Method)은 '어떤 모델의 파라미터를 구하는 한 방법으로서, 데이터와의 residual2의 합을 최소화하도록 모델의 파라미터를 구하는 방법'을 지칭한다.


모델, 파라미터, 데이터, residual(레지듀얼), ...


이런 단어 하나 하나들이 그대로 이해되면서 머리속으로 하나의 그림이 그려진다면 굳이 최소자승법의 이해 파트는 읽을 필요가 없을 것이다 ^^.

어쨌든, 이렇게 말하면 얼른 감이 안오기 때문에, 이들 단어가, 그리고 최소자승법이 어떤 의미인지 예를 통해 설명해 보자.


보통 블로그를 운영하면서 가장 신경쓰이는 것 중의 하나가 일일 방문객 수이며, 방문객 수를 늘이기 위해 참으로 눈물겨운 노력들을 한다. 그래서 방문객 수의 추세를 알아보기 위해 아래 그림과 같이 날짜별 블로그 방문객 수를 그래프로 그려 보았다고 하자.



x축은 블로그를 개설한 후 경과 일수고 y축은 일자별 방문객 수이다. 그래프에서 각각의 점들이 관측된 데이터 (x, y)이다.


내 블로그 방문객 수는 어떤 분포를 따르는 것일까? 위 데이터의 분포를 보면 일단 생각나는게 직선일 것이다. 하지만 아직 블로그를 개설한지 얼마 안 되었기 때문에 사실은 실제 분포가 포물선일 수도 있다 (그러기를 희망해 본다 ^^). 이와 같이 데이터 분포를 보고 이걸 직선으로 해석할지 아니면 포물선으로 해석할지 선택하는 것이 바로 모델을 선택하는 것이다 (모델이 미리 알려지지 않은 경우에는 자신이 직접 모델을 선택해야 하는데, 모델을 선택하는 것은 데이터 해석에 있어서 가장 어려우면서도 중요한 일 중 하나이다).


설마 포물선일리는 없을 테니 일단은 모델(model)을 직선으로 잡자. 일단 모델이 결정되면 모델의 파라미터가 정해지는데, 직선의 경우에는 기울기와 y절편이 모델의 파라미터가 된다. 즉, 모델을 f(x) = ax + b로 잡으면 a, b가 파라미터가 된다. 이 시점에서 최소자승법의 의미를 다시 한번 되돌아보자.


최소자승법(Least Square Method)은 모델의 파라미터를 구하기 위한 대표적인 방법 중 하나로서 모델과 데이터와의 residual2의 합 또는 평균을 최소화하도록 파라미터를 결정하는 방법이다.


Residual은 어떤 데이터가 추정된 모델로부터 얼마나 떨어진 값인가를 나타내는 용어이다 (residual을 한국어로 어떻게 표현해야 할지는 잘 모르겠다. 추정오차? 근사오차? → 통계학에서는 '잔차'라고 부른다고 한다). 어쨌든, 관측된 데이터 (x1, y1), ..., (xn, yn)를 보고 어찌 어찌 계산을 해서 구한(추정한) 모델이 f(x) = a1x + b1라고 해 보자. 그런데, 위 그래프 예처럼 원래 관측된 데이터 분포가 완벽한 직선이 아니라면 어떻게 직선(모델)을 구하더라도 몇몇 데이터들은 오차를 갖게 된다. 이 오차를 residual이라고 부른다. 즉, 데이터 (xi, yi)의 residual은 ri = yi - f(xi)가 된다. 여기서 yi는 관측된 값이고 f(xi)는 추정된 모델에 따른 값이다.


결국, 최소자승법을 사용한다는 말은 residual2의 합, 즉 다음 수식을 최소화하도록 f(x)의 파라미터를 결정한다는 말이 된다.

(1)

f(x)가 직선 ax + b인 경우에는,

(2)

를 최소화하도록 a, b를 결정하는게 최소자승법이다. 위 그래프 예에서 보자면 (오른쪽 그림), 데이터들의 분포를 파란색 직선으로 해석할 수도 있고 빨간색 직선으로 해석할 수도 있겠지만 데이터들과의 residual2 합을 최소로하는 직선은 빨간색 직선일 것이다.



2. 최소자승법의 계산


최소자승법(Least Square Method)은 어떤 기준을 가지고 모델의 파라미터를 구하는가를 말해줄 뿐 실제로 이걸 어떻게 계산하는가는 별개의 문제이다. 실제 계산을 못한다면 활용하기 힘든 만큼 최소자승법을 어떻게 계산하느냐도 매우 중요하다. 최소자승법을 계산하는 방법은 크게 해석학적(analytic) 방법과 대수적(algebraic) 방법이 있는데 대수적 방법이 훨씬 직관적이면서도 효과적이다 (설명의 편의상 분류이며 일반적인 용어는 아님을 밝힌다)


A. 대수적 방법


먼저, 대수적 방법은 위의 모델 추정 문제를 행렬식 형태로 표현한 후에 선형대수학을 적용하는 방법이다. 위에서 예로 든 직선 f(x) = ax +b 추정 문제는 결국 다음 식들을 만족하는 a, b를 찾는 것이다.


(3)

이를 행렬식으로 표현하면 다음과 같다.


(4)


(5)


이 때, A의 역행렬은 존재하지 않지만 pseudo inverse라는 걸 이용하면 X를 다음과 같이 계산할 수 있다 (이걸 자신이 직접 계산해야 한다고 걱정할 필요는 없다. 행렬의 pseudo inverse 계산은 Matlab이나 OpenCV 등 다양한 툴들을 이용하면 된다).


(6)


그런데 여기서 이렇게 구한 X가 정말 residual2 합을 최소로 하는 모델 파라미터일까? 하는 의문이 들 수도 있겠다. 약간의 수학적 설명이 필요한 부분인데 여기서는 간단하게만 설명하도록 하겠다 (수학적 지식이 있는 분만 참고하기 바란다). 위의 residual 제곱합 식인 식 (1)을 행렬로 표현하면 ∥B - AX∥2이 된다 (여기서 ∥∥은 벡터의 L2 - norm이다). 즉, ∥B - AX∥2를 최소로 하는 X를 찾는 문제가 되는데, 이걸 X로 편미분한 후에 0으로 놓으면 -2AT(B - AX) = 0이 된다. 따라서, ∥B - AX∥2를 최소로 하는, 즉 residual2 합을 최소로 하는 X는 X = (ATA)-1ATB가 된다.


B. 해석학적 방법


 최소자승법(Least Square Method)을 계산하는 다른 한 방법으로 해석학적(analytic) 방법이 있다. 해석학적 방법은 식 (1)을 각각의 모델 파라미터들로 편미분한 후에 그 결과를 0으로 놓고 연립 방정식을 푸는 것이다. f(x) = ax + b인 직선의 경우 식 (2)을 a, b로 각각 편미분하고 그 결과를 0으로 놓으면 다음과 같은 식이 된다.


(7)


이걸 a, b에 대한 연립방정식으로 놓고 풀면 복잡하긴 하지만 어쨌든 a, b가 구해진다.


그런데, 풀리기야 하지만 이러한 해석학적 방법은 계산이 복잡하고 또 계산하다가 실수할 확률이 매우 높다. 어느 세월에 이걸 다 계산한단 말인가.. 단순한 직선 근사 문제야 어찌 어찌 계산한다고 해도 복잡한 고차 함수나 다변수 함수의 경우에는 일찌감치 포기하고 첫번째 대수적 방법으로 푸는 것이 훨씬 정신건강에 좋을 것이다.


하지만, 굳이 해석학적 방법을 여기에 같이 소개한 이유는 문제에 따라서는 대수적 방법으로 잘 해결되지 않을 수도 있기 때문이다. 대수적 방법을 적용하기 위해서는 f(x)가 파라미터들에 대한 1차 선형함수로 표현될 수 있어야 한다 ( f(x) = ax + b는 a, b를 변수로 보면 a, b에 대한 1차식이다). 파라미터에 대한 선형화가 잘 안되는 경우에는 해석학적 방법을 사용하거나 해석학적 방법과 대수적 방법을 병행하는 것도 고려해 볼 수 있을 것이다.


C. 비선형 최소자승법 (non-linear least square)


주어진 least square 문제가 파라미터들에 대한 선형식이 아닌 경우에는 위와 같은 방법으로는 문제를 해결하기 힘들고 비선형 least square 문제로 풀어야 한다. 비선형 least square 문제는 가우스-뉴턴 방법을 이용하여 풀 수 있는데, 이에 대한 설명 및 예제는 뉴턴법/뉴턴-랩슨법의 이해와 활용(Newton's method)을 참조하기 바란다.



3. 최소자승법의 활용


어떤 문제가 주어졌을 때 최소자승법(Least Square Method)을 활용하기 위해서는 먼저 그 문제를 식 (4)와 같은 행렬식 형태로 표현할 수 있어야 한다. 식 (4)와 같이 표현할 수 있다면 그 문제는 쉽게 풀 수 있을 것이요, 그렇지 않은 경우에는 다른 방법을 찾거나 아니면 무슨 수를 쓰든지 식 (4) 형태로 만들어야 한다. 아래의 몇 가지 예들을 통해서 어떤 식으로 최소자승법이 실제 문제에 활용될 수 있는지 하나씩 살펴보도록 하자.


A. 포물선 근사


일단은 연습문제로서, 위 블로그 방문객 수 그래프를 포물선으로 근사한다고 해 보자. 즉,  관측된 데이터 (x1, y1), ..., (xn, yn)를 포물선 f(x) = ax2 + bx + c로 근사할 경우에는 다음과 같이 행렬식을 세울 수 있다.

(8)


포물선 이상의 3차, 4차, ... n차 함수로 근사할 경우에도 마찬가지이다. 이와 같이 식을 세운 후 matlab 등의 툴로 pseudo inverse 계산을 해 주면 바로 답을 얻을 수 있다.


참고로, 위 행렬식을 최소자승법으로 풀어서 (풀이 방법은 '2. 최소자승법의 계산' 파트를 읽어보기 바란다) 구한 해를 X' = [a' b' c']T라 할 때, AX'은 추정된 모델에 따른 값, B - AX'은 이 모델에 대한 residual을 나타낸다.



B. 영상의 밝기 보정


예를 들어, 문자인식에서 배경과 문자를 분리하기 위해 이미지를 이진화한다고 했을 때, 아래 그림과 같이 배경의 밝기 변화가 심한 경우에는 어떤 threshold 값을 사용해도 글씨와 배경이 잘 분리되지 않을 수 있다.

이럴 때, 배경의 밝기 변화를 근사하여 이를 제거한 후에 이진화를 수행하면 아래 그림과 같이 글씨와 배경을 깨끗하게 분리해 낼 수 있다.

그러기 위해서는 먼저 배경의 밝기 변화를 곡면으로 근사할 수 있어야 한다. 이를 위해 영상의 픽셀값들을  관측값으로 생각하고 모델을 z = f(x, y)로 세운다. 여기서 (x, y)는 픽셀 좌표이고, z는 (x, y)에서의 입력 영상의 픽셀값(intensity), f는 우리가 픽셀값들을 근사하기 위한 어떤 함수 모델이다.


먼저, 영상 배경 밝기를 1차 평면 f(x, y) = ax + by + c로 근사할 경우에는 행렬식을 다음과 같이 세울 수 있다.

(9)


만일, 좀더 복잡한 배경 변화까지 커버하기 위해 2차 곡면  f(x,y) = ax2 + by2 + cxy + dx + ey + f을 사용할 경우에는 행렬식을 다음과 같이 세운다.

(10)


3차 이상의 곡면으로 근사할 경우에도 이와 유사하게 행렬식을 세울 수 있다.



C. 원(circle) 및 타원(ellipse) 근사


2차원 평면상의 점 데이터 (x1, y1), ..., (xn, yn) 들을 원이나 타원으로 근사하는 문제는 직접적인 최소자승법 적용이 힘든 문제로서 이것에 대한 논문들도 많이 나왔을 만큼 쉽지 않은 문제이다.


먼저, 원으로 근사하는 경우를 보면 원의 방정식 (x-a)2 + (y-b)2 = r2를 전개하면 x2 + y2 - 2ax - 2by + a2 + b2 - r2 = 0 이 된다. 그런데, 보다시피 모델 파라미터인 a, b, r에 대한 1차 선형식이 아니기 때문에 최소자승법을 곧이 곧대로 적용하기는 힘들다. 이걸 푸는 한 방법은 c = a2 + b2 - r2라 잡고 x2 + y2을 우변으로 넘긴 후에 행렬식을 다음과 같이 세우는 것이다.

(11)

단, r은 위 행렬식을 풀어서 a, b, c를 구한 후에 r = sqrt(a2 + b2 - c)로 구한다.


타원의 경우에는 x2 + ay2 + bxy + cx + dy + e = 0 라 식을 세운 후 x2을 우변으로 넘겨서 다음과 같이 행렬식을 만들 수 있다 (회전된 타원까지 고려하여 bxy 항이 들어감).

(12)

그런데, 이렇게 원과 타원을 구하는 것은 residual에 대한 기하학적 해석이 명확하지 않은 약간은 편법적인 방법이며 보다 정확한 근사를 위해서는 비선형(non-linear) 최소자승법으로 해결해야 한다. 비선형 least square 문제는 가우스-뉴턴(Gauss-Newton) 방법으로 풀 수 있는데, 이에 대한 설명 및 예제는 뉴턴법/뉴턴-랩슨법의 이해와 활용(Newton's method)에 있는 원(circle) 근사 예제를 참조하기 바란다.



D. 모션 추정하기


영상처리 분야에서는 optical flow라고 아래 그림과 같이 물체 상에 점들이 연속된 영상 프레임에서 어디로 이동하는지를 추적함으로써 물체의 모션을 추정하는 기술이 있다. 참고로 이 예는 조금 전문적인 내용이기 때문에 이해하기 힘들 수도 있겠다. 하지만 통상적인 방법으로 최소자승법을 적용하기 힘든 경우에는 아래에 사용된 기법이 도움이 될 수도 있으니 참고하기 바란다.



만일 시간 t에서의 영상위의 점들 (x1, y1), (x2, y2), ..., (xn, yn)이 그 다음 영상 프레임에서 (x1', y1'), (x2', y2'), ..., (xn', yn')로 이동했다고 했을 때, 이 점들의 이동을 설명하는 변환관계를 구하는 문제가 있다고 하자. 이 때, 이 변환을 평행이동, 회전이동, scale 변화로만 국한하도록 하자 (이러한 변환을 similarity transform이라고 부른다).


먼저 이러한 similarity 변환관계는 일반적으로 다음과 같이 표현된다.


(13)


즉, 주어진 매칭 쌍 (xi, yi) - (xi', yi'), i = 1, ..., n들로부터 위 similarity 변환의 파라미터인 a, b, c, d를 구하는 문제가 되겠다.


이 문제를 최소자승법으로 푸는 방법은 여러 가지가 있을 수 있겠지만 여기서는 OpenCV에서 사용하는 방법을 소개하도록 하겠다. 먼저, 식 (13)을 전개하면 다음과 같다.


 ------- (14)

------- (15)


위 식을 변형하여 (14)*x + (15)*y, (15)*x - (14)*y, (14), (15)를 각각 행으로 하는 행렬식을 만들면 다음과 같은 행렬식이 만들어진다.

(16)


그러면, 이제 원래의 점 매칭쌍 하나당 위 행렬식이 하나씩 나오게 되는데 이것들을 전부 다 더한다.


(17)


그러면 위와 같은 행렬식이 나오는데, 이제는 pseudo inverse를 구할 필요 없이 바로 역행렬을 취하면 원하는 a, b, c, d를 곧바로 구할 수 있게 된다. 왜 이렇게 해야 하느냐고는 묻지 말자. 다만 이렇게 하면 효과적으로 a, b, c, d가 구해지는 것은 확실하며 통상적인 방법으로 최소자승법을 적용하기 힘든 경우에는 위와 같은 기법도 있음을 알아두면 도움이 될 것이다.



4. 최소자승법의 한계


최소자승법(Least Square Method)을 잘 이용하려면 최소자승법의 한계도 잘 알고 있어야 할 것이다. 최소자승법은 데이터 중에 보통 outlier(정상적인 데이터 분포에서 동떨어진 데이터)라고 불리는 이상한 놈이 하나라도 끼어 있으면 적용하기 힘든 방법이다.  그 이유는 최소자승법은 전체 데이터의 residual2 합을 최소화하기 때문에 outlier의 residual도 같이 줄이려고 하다보면 전혀 엉뚱한(잘못된) 근사 결과를 낼 수 있기 때문이다. 따라서, outlier가 존재하는 경우에는 RANSAC, LMedS, M-estimator 등과 같은 robust한 파라미터 추정 방법을 사용해야 한다. Robust한 파라미터 추정 방법들 중 가장 널리 쓰이는 일반적인 방법은 RANSAC이지만 outlier의 비율이 많지 않은 경우에는 M-estimator를 사용하는 것도 좋다 (RANSAC이나 LMedS는 랜덤성이 있기 때문에 극단적인 경우 해를 못 찾을 수도 있다).


RANSAC 및 robust한 파라미터 추정 방법에 대해서는 RANSAC의 이해와 영상처리 활용 글을 참조하기 바랍니다.


☞ 이상으로 최소자승법(Least Square Method) 및 그 활용법에 대한 나름의 설명을 해 보았습니다. 최소자승법에 관한 글들이 인터넷에 많이 있지만 대부분 회귀분석 쪽이라서 최소자승법의 범용성 및 다른 활용법은 잘 드러나 있지 않은 것 같습니다. 여기 있는 예 외에도 응용에 따라 다양한 활용이 가능할 것으로 생각됩니다.


by 다크 프로그래머

  • 이전 댓글 더보기
  • 풍풍.. 2016.07.12 11:11 신고 ADDR 수정/삭제 답글

    안녕하세요. 다크님,
    위의 내용을 보고 B.영상의 밝기 보정을 구현해 보았습니다.
    그런데 예제로 보여주신 화면이 나오지 않았습니다.
    제 힘으로 하려고 1주일동안 구글팅 등등으로 해보다가 안돼서 ....
    OpenCV3.1환경에서 코딩 했습니다.
    결과값은 f(x,y) = 0.27x + 0.23y + 35.36
    ---------------------------------------------------
    1.이미지 파일을 읽었습니다. [cv::Mat frame = cv::imread(....)
    1.1 이것을 그레이 포멧으로 변경하였습니다.[cv::cvtColor(frame, grayFrame, CV_BGR2GRAY)]

    2.영상 배경 밝기를 1차 평면 f(x, y) = ax + by + c로 근사할 경우에는 행렬식을 만들기 위하여
    2.1 cv::Mat A(frame.rows * frame.cols, 3, CV_32FC1);
    cv::Mat Z(frame.rows * frame.cols, 1, CV_32FC1);
    변수를 선언하고 순차적으로 값을 입력해였습니다.
    //X1,Y1,1
    A.at<float>(count, 0) = x; A.at<float>(count, 1) = y;A.at<float>(count, 2) = 1;
    //Z1 색상
    Z.at<float>(count) = fgPtr[x];

    3. AX=Z에서 cv::Mat X = (A.t() * A).inv() * A.t() * Z;
    3.1 결과 값이 X= (0.27,0.23,35.36) 나왔습니다.
    위의 값이 맞다면 그다음에는 영상 밝기를 어떻게 보정해야 하나요.
    미련한 저는 아래와 같이 아니 이상한 결과가 나왔습니다.
    float aValue, bValue, cValue;
    aValue = X.at<float>(0);
    bValue = X.at<float>(1);
    cValue = X.at<float>(2);

    for (int y = 0; y < grayFrame.rows; ++y)
    {
    uchar* fgPtr = grayFrame.ptr(y);

    for (int x = 0; x < grayFrame.cols; ++x)
    {
    float Z1 = aValue * x + bValue * y + cValue;

    fgPtr[x] = Z1;
    }
    }

    조언 부탁드립니다.

    • 라도파 2016.07.12 12:26 신고 수정/삭제

      아니, 아무리 다크님이 친절해도 그렇지, 코드리딩까지 부탁하시다니!
      할 수 없이 제가 봐야겠네요 낄낄
      최소자승법 적용방법은 문제가 없는 것 같고요, 마지막 반복문에서 ax + by + c의 결과값 z는 백그라운드 밝기라고 보시면 됩니다. 요걸 활용하는 방법은 여러가지인데... 간단하게는 원본 영상에서 백그라운드를 빼면 포그라운드만 남습니다. 뺀 값(포그라운드)에 절대값 적용해서 출력하시면 까만 배경에 글씨만 하얀색으로 나올 겁니다. 즉 I'(x, y) = abs( I(x, y) - f(x, y) ) 죠.
      그냥 보정된 영상을 원하시면 원본영상 - 계산된 영상 + 영상전체평균, 즉 I'(x, y) = I(x, y) - f(x, y) + E(I) : 으로 계산하고, 오버플로우 언더플로우 처리하면 될 겁니다. 아마도 ㅎㅎ 여기서 영상전체평균이란게 결국 배경 평균이에요.
      이 방법은 사실 영상 대부분이 백그라운드고 포그라운드는 거의 영향을 안 준다는 가정에서 성립합니다. ransac같은 거 적용하면 더 좋은 결과가 나올지??

    • 풍풍.. 2016.07.12 13:55 신고 수정/삭제

      라도파님께서 알려주신데로 적용하여 확인 하였습니다.
      ^_^
      감사합니다.

    • BlogIcon 다크pgmr 2016.07.13 06:49 신고 수정/삭제

      두분 모두 감사합니다.. ^^

  • hsboy89 2016.09.18 06:42 신고 ADDR 수정/삭제 답글

    수고많으십니다. 많이 배우고 가요. 그런데 결국 LS를 이용해 얻은 예측모델과 실제 모델이 차이나는 이유가 outlier 가 끼어 있어서 그렇다는 말씀이에요? 이게 trainning data 에서 예측 모델에 수직으로 내리느냐, 빗변으로 내리느냐에 따라서 cost 함수 값이 달라지는데 이것까지 포함되서 RANSAC, LMedS, M-estimator 등과 같은 robust 방법으로 수정 될수있는건가요?

    • BlogIcon 다크pgmr 2016.09.19 09:41 신고 수정/삭제

      네, ls 방법에서는 단 하나의 outlier가 시스템 전체를 망가뜨릴 수도 있습니다. 그리고 수직에러, 사선에러 등은 데이터의 에러(모델에서 벗어난 정도)를 어떻게 정의할지의 문제이고, ls, ransac, m-estimator 등은 목적함수(objective function)를 어떻게 정의할지의 문제입니다. ls는 에러의 제곱의 합을 최소화시키는 것을 목적함수로 잡은 것이고, ransac은 정해진 임계값 이상의 에러를 갖는 데이터의 개수를 최소화시키는 것을 목적함수로, lmeds는 에러의 절대값의 합을 최소화시키는 것을 목적으로 하는 파라미터 추정 기법입니다. 에러를 어떻게 정의하는지, 목적함수를 어떻게 정의하는지에 따라 당연히 결과는 달라집니다. 하지만 이 둘은 서로 독립적인 문제로서 사선에러에 대해 ls를 적용할수도 ransac이나 m-estimator를 적용할 수도 있습니다. 수직에러에 대해서도 마찬가지입니다.

  • 사과주의 2016.10.23 17:55 신고 ADDR 수정/삭제 답글

    각 매개변수에 대한 편미분을 0으로 두는게, 어떻게 최솟값이라 볼 수 있는지 이해가 잘 되지 않습니다. 편미분 의미에 대해 제가 지식이 부족한거 같은데 설명 좀 부탁드립니다.

    • BlogIcon 다크pgmr 2016.10.24 10:08 신고 수정/삭제

      타당한 지적이라고 생각합니다. 편미분이 0인 것은 필요조건은 될 수 있어도 충분조건은 아니니까요. 극점에서 실제로 최소가 되는지는 모든 변수방향으로 아래로 볼록인지 확인해 봐야 합니다. 하지만 선형최소자승문제에 있어서는 항상 극점에서 최소가 되는 것으로 알고 있습니다. 그리고 비선형최소자승문제에서는 최소가 될 수도 있고 안될 수도 있다고 합니다.

  • 마가렛 2016.10.24 17:56 신고 ADDR 수정/삭제 답글

    선형이든 비선형이든 최소자승법을 이용하여 논문을 쓰는데 계량경제학, 선형대수... 이런걸 반드시 기초부터 공부해야 하나요? 석사인데 이런거 잘 모르고도 패널분석법 기초적인거 이용해서 논문 썼습니다. 박사과정은 어떤가요? 기본부터 공부를 해야할까요? 아니면 논문 쓸수 있을 정도로만 이해한다음 툴 사용법만 배우면 되는걸까요?

    • BlogIcon 다크pgmr 2016.10.24 23:39 신고 수정/삭제

      대답이 어렵네요. 분야마다 다를 것 같습니다. 전 패널분석법이 무엇인지도 잘 모릅니다 ㅠㅠ. 저보다는 아무래도 같은 분야 선배나 교수님께 여쭤보는게 좋지 않을까요..

  • 처리영상 2016.12.05 15:00 신고 ADDR 수정/삭제 답글

    질문이 있어 글 남깁니다.
    이진화 문제, 가령 "걷는다 뛰는다"에 대한 목적함수를 모델링 한다고 했을때 도출되는 결과는 0 or 1이어야 할텐데, 이런 문제에 대해서도 최적화를 통해 파라미터 추정 방법이 활용 가능할까요? 아니면 단순히 SVM을 사용해 함수를 모델링해야 할까요?

    • BlogIcon 다크pgmr 2016.12.05 18:35 신고 수정/삭제

      네 가능합니다. 인공신경망(artificial neural network)에서 하는 학습 과정이 바로 최적화 과정입니다.

  • df 2017.02.13 15:44 신고 ADDR 수정/삭제 답글

    항상 잘 보고 갑니다.책보다 훨씬 도움 되네요

  • 통계배우는학생 2017.03.02 12:56 신고 ADDR 수정/삭제 답글

    수업에서 배우는 LSM은 너무 딱딱하기만 했는데, 훨씬 이해하기 쉽네요~ 이걸 어디다가 써먹나 싶기도 했는데 모션인식이나 이미지보정에까지 쓰이는줄은 상상도 하지 못했습니다... 역시 세상을 바꾸는 이과생 -_-;; 감사합니다!

  • 궁금 2017.03.06 19:43 신고 ADDR 수정/삭제 답글

    질문하나 드릴께요.
    영상에서 빛의 방향을 추정해보고자, 논문을 이것저것 좀 보다가 문헌정보학 논문에서 이미지 검색을 위한 빛의 방향을 추정하는 방법에 대한 내용을 보게 되었습니다. 위에서 언급하신대로 회귀식을 사용하였는데, x좌표, Y좌표 및 명도 이 세가지를 인자로 한 다중회귀분석을 통해 빛의 방향을 추정하는 것이었습니다.따라서 각 기울기와 절편을 구하는 방법을 알기위해 많은 자료들을 보았으나. 대개 SPSS로 돌리는 터라 계산방법, 과정에 대하서는 자세히 알 수가 없었습니다.
    이를 알아야 프로그램으로 짤텐데요. 또한 설명하신것 처럼 단순회귀분석에서 기울기와 절편구하는 방법에 대한 자료는 많았지만 다중회귀분석은 이와 계산방법이 다르다고 알고 있습니다.
    다중회귀식에서 기울기 및 절편을 구하고 싶은데 어찌해야 할까요.

    • BlogIcon 다크pgmr 2017.03.07 00:07 신고 수정/삭제

      안녕하세요. 저는 분야가 다르다 보니 회귀분석 등의 용어가 제게는 생소하게 느껴집니다. 말씀하신 다중회귀분석은 아마도 다변수선형시스템(y = a1x1+a2x2+...+)을 지칭하는 것 같은데 맞는지 모르겠네요. 그리고 기울기와 절편을 구한다는 것은 시스템의 미지수(a1, a2, ...)들을 구한다는 의미일 것으로 생각됩니다. 만일 그렇다면 본문의 내용중에 그러한 예들이 이미 설명되어 있습니다. 즉, 식 (9), (10), (11), (12) 등이 모두 다중회귀분석의 예들로 볼 수 있습니다. x, y가 변수가 아니라 a, b, ... 가 변수임을 주의하시면 원래 풀고자 하는 문제도 유사하게 적용할 수 있을 것으로 생각됩니다.

  • 소라아빠 2017.04.11 16:21 신고 ADDR 수정/삭제 답글

    가끔씩 와서 잘 읽고 있어요.
    고마와요.

  • timewalker 2017.04.25 13:31 신고 ADDR 수정/삭제 답글

    안녕하세요, 좋은 글 잘 읽었습니다. 구글에서 최소자승법 검색하니 이 블로그가 두 번째로 뜨네요. 그런데 2.B 의 제목은 Analytic method 이고 편도함수를 계산하는 방식으로 해를 구하는 방법이니 한국어 번역이 '분석적 방법'보다는 '해석적 방법'내지는 '해석학적 풀이법'정도가 더 좋지 않을까 조심스레 건의드려봅니다. 물론 analytic 이라는 단어가 '분석적인' 등으로 대표될 수 있는 뜻이 있지만 미분을 취급하는 내용상 해석학적(Mathematical analysis)방법으로 표기하는 편이 읽는데에 편안할 것 같습니다.
    저는 순수과학을 하는 사람인데, 프로그래머의 관점에서 보는 최소자승법의 응용사례를 보니 글이 참 재미있었습니다. 다시 한 번 좋은 글 감사합니다~!

    • BlogIcon 다크pgmr 2017.04.25 14:30 신고 수정/삭제

      좋은 의견 감사합니다. 말씀하신대로 해석학적 방법이 보다 적절한 표현 같습니다. 본문 내용도 수정하였습니다. ^^

  • 시연 2017.07.14 16:59 신고 ADDR 수정/삭제 답글

    와. 논문 읽다가 분석방법이 최소자승법이라.. 검색했다가 구경하고 하트 누르고 갑니다~ 아직 초보수준이라 어렵긴 하지만 정말 감동적으로 잘 쓴 글 같아요!!! 감사합니다!

  • EmptyHeart 2017.10.23 17:32 신고 ADDR 수정/삭제 답글

    안녕하세요. 라인피팅 공부하고 있는데 어렵네요. 대수적 방법으로 구현하려는데 내용은 이해했는데 소스 짜기가 쉽지 않네요. 최소자승법을 이용한 opencv 소스 아무거나 하나 받을 수 있을 까요??? 소스 예제를 봐야 이해할 수 있을 거 같은데 ㅠㅠ 부탁드려요 aszx14898@naver.com

    • BlogIcon 다크pgmr 2017.10.24 00:13 신고 수정/삭제

      Ax = B 꼴의 방정식을 opencv로 풀기 위해서는
      Mat pinvA = A.inv(DECOMP_SVD);
      Mat x = pinvA*B;
      와 같이 하면 됩니다. 이렇게 구한 x는 Ax = B를 만족하는 최소자승 해가 됩니다.

  • EmptyHeart 2017.10.24 17:39 신고 ADDR 수정/삭제 답글

    사각형을 이진화 해서 밝기가 0되면 break하고 좌표를 구했습니다.
    for(int y = 0.4*nY ; y<0.7*nY; y+=10)
    {
    p = ucImagedata+(nWidthStep*y);
    for(int x = nX/2 ; x<nX; x++)
    {
    if((int)*(p+x) == 0)
    {
    ptRight.push_back(Point2i(x, y));
    line(mtDraw,Point2i(x,y),Point2i(x,y),Scalar(255,0,255),1);
    break;
    }
    }
    }

    이런식으로 위 아래 왼 오른쪽을 구했는데
    여기서 이 좌표를 가지고 최소자승법을 이용해서 직선을 만들려고 하는데
    전혀 감이 안오네요
    line으로 어디 찍혔나 확인해 봤습니다.
    cv를 잘 못해서 벡터에서 좌표를 어떻게 꺼내는지도 모르겠어요
    여기서 어떻게 진행해야될지 도와주세요

    • BlogIcon 다크pgmr 2017.10.25 00:00 신고 수정/삭제

      opencv 사용법이나 기본적인 프로그래밍에 대해서는 따로 책이나 온라인 핼프(help) 등을 통해서 개인적으로 공부하셔야 합니다. opencv의 사용법은 http://docs.opencv.org에 가면 함수 사용법을 찾아볼 수 있습니다.

  • EmptyHeart 2017.10.25 18:00 신고 ADDR 수정/삭제 답글

    결국 만들었습니다 ㅜㅜ 그냥 ptRight[i].x 였네요. 이걸 몰라서 해맸네요 소스가 길긴 길지만 그래도 만들긴 만들었네요 ransac도 잘 읽어 보고 적용해볼께요

  • 경제 2017.12.02 22:29 신고 ADDR 수정/삭제 답글

    경제통계학 수업듣고있는데 너무 많ㅇ ㅣ자버려서 기초도 부족했었습니다.. 머리에 쏙쏙 들어오네요.감사합니다

  • arepos 2018.01.07 16:53 신고 ADDR 수정/삭제 답글

    통계관련 PLS프로그램을 새로 접해서 PLS관련한 내용찾다가 글 봤는데
    잘 정리해주셔서 많이 도움이 됐습니다
    그래도 반이상은 흰종이 까만건 글자? 로 보이지만.. ㅡ ㅡ ㅎㅎ
    감사합니다 ^^

  • BlogIcon C++ 2018.02.22 16:13 신고 ADDR 수정/삭제 답글

    RANSAC 알고리즘이 필요하게 되어 최소자승법을 공부하면서 다크님 블로그가 큰 도움이 되었습니다.
    질문이 하나 있습니다.
    선형 모델일 때,
    대수적 방법으로 푸는데 y축과 평행한 경우는 안 되는건가요?
    (0,0), (0,10), (0,20), (0,30), (0,40) 이렇게 5개의 점으로 최소자승법을 돌렸는데
    (ATA)-1 이 부분에서 역행렬이 구해지지 않습니다. (행렬식(determinant)이 0으로 나옵니다.)
    분모가 0으로 나오면서 기울기가 무한대(∞)가 되기 때문인거 같은데..
    이런 case는 대수적 방법으로 불가능한건가요? 해석학적 방법으로 해야하나요?
    대수적 방법으로 쓰고 싶은데 방법이 없을까요?

    • BlogIcon 다크pgmr 2018.02.22 22:07 신고 수정/삭제

      그건 모델이 데이터를 표현할 수 없는 모델이기 때문입니다. y = ax + b 형태의 직선 모델은 y축과 평행인 직선은 표현할 수 없습니다. 그렇기 때문에 일반적으로는 ax + by + c = 0 형태의 직선 모델이 많이 사용됩니다. 단, 이 경우에는 SVD를 이용해서 a, b, c를 구해야 합니다 (http://darkpgmr.tistory.com/108 글 참조)

  • 질문 2018.06.15 08:32 신고 ADDR 수정/삭제 답글

    3차원 공간 좌표 즉, (x, y, z) 인 세가지 특징값이 주어질때는 최소자승법을 어떻게 적용해야 하나요?

    • BlogIcon 다크pgmr 2018.06.15 12:17 신고 수정/삭제

      최소자승법은 주어진 데이터에 맞게 모델을 fitting하는데 사용하는 방법입니다. 즉, fitting시키고자 하는 모델이 무엇인지에 따라 식이 달라집니다.

  • BlogIcon PG5 2018.07.20 11:16 신고 ADDR 수정/삭제 답글

    도움이 되는 글입니다. 감사합니다.

  • RB 2018.08.10 18:26 신고 ADDR 수정/삭제 답글

    안녕하세요 구글링하다가 여기까지 왔는데요 ㅎㅎ
    최적해 구하는 공식이 있잖아요 A^TAx=A^Tb 이런식 같은거요 이건 조건이 없으니 그냥 대입해서 해결하면 되는데
    예를들어 ax+by+c형태의 식이 많은데 이 함수들의 최적해를 구하는 과정인데 여기에 조건이 추가된다면 어떻게 해결할 수 있을까요? 조건이 예를들면 x,y는 0보다 크다 x,y는 어떤 함수 밖에 있어야 한다 등이요 제가 짧은 영어로 외국사이트에 질문한게 있는데 혹시 답변 가능하실까요? ㅎㅎ
    https://math.stackexchange.com/questions/2878070/how-to-solve-conditional-least-square
    읽어주셔서 감사합니다.!

    • BlogIcon 다크pgmr 2018.08.14 13:26 신고 수정/삭제

      simplex 알고리즘이나 Lagrange multiplier 쪽으로 공부해 보시면 좋을 것 같습니다.
      https://en.wikipedia.org/wiki/Simplex_algorithm
      https://en.wikipedia.org/wiki/Lagrange_multiplier