Kernel Density Estimation(커널밀도추정)에 대한 이해

기계학습 2015.02.27 18:49

얼마전 한 친구가 KDE라는 용어를 사용하기에 KDE가 뭐냐고 물어보니 Kernel Density Estimation이라 한다.


순간, Kernel Density Estimation이 뭐지? 하는 의구심이 생겨서 그 친구에게 물어보니 자기도 잘 모른단다. 그러면 공부를 해서 나한테도 좀 알려달라고 부탁을 했다.


얼마 후, 그 친구는 Kernel Density Estimation이란 히스토그램(histogram) 등을 smoothing(스무딩)하는 것을 말하는데 Parzen–Rosenblatt window 방법과 같은 말이라면서 Parzen window 방법의 과정에 대해 열심히 설명한다.


...


무슨 말인지.. Kernel Density Estimation(커널 밀도 추정)이 뭐냐고 물어봤는데 정작 KDE 자체(개념)에 대한 설명은 안해주고 자꾸 주변적인 알고리즘에 대한 얘기만 한다. 마치 집이 뭐냐고 물어봤는데 집이란 철골을 쌓은 다음에 콘크리트를 바른 것이다라고 설명하는 것과 같다.


안되겠다 싶어서, 질문을 바꾸어 밀도추정(density estimation)이 뭐냐고 물어보았다. 그리고 좀더 나아가서 밀도(density)가 무엇인지 커널(kernel)이 무엇인지 물어보았다. 그랬더니 이 친구가 대답을 못한다...


Kernel Density Estimation(KDE)이란 커널함수(kernel function)를 이용한 밀도추정 방법의 하나로서 KDE를 알기 위해서는 먼저 밀도추정(density estimation)이 무엇인지 알아야 한다.



밀도추정 (Density Estimation)


데이터는 어떤 변수가 가질 수 있는 다양한 가능성 중의 하나가 현실 세계에 구체화된 값이다. 그리고 우리는 이렇게 관측된 데이터들을 통해 그 변수(random variable)가 가지고 있는 본질적인 특성을 파악하고자 노력한다.


그러나 하나의 데이터는 변수의 일면에 불과하기 때문에 변수의 진면목을 파악하기 위해서는 많은 수의 데이터가 필요하다. 그리고 이렇게 얻어진(관측된) 데이터들의 분포로부터 원래 변수의 (확률) 분포 특성을 추정하고자 하는 것이 density estimation(밀도추정)이다.


예를 들어, 어떤 육교 밑을 통과하는 차량의 일일 교통량을 파악하는게 목적이라고 하자. 이 때의 변수(random variable)는 '일일 교통량'이다. 그리고 실제 육교 위에서 매일 매일 관찰한 값이 데이터이다. 어떤 날은 차가 500대 지나가고, 어떤 날은 300대, 450대, ... 매일 매일 서로 다른 데이터가 나올 수 있다. 하루, 이틀의 관측 결과만 가지고 이 육교의 '일일 교통량'이 무어라고 결론을 내리기는 힘들다. 하지만 이러한 데이터가 한달, 두달, 1년 넘게 쌓이게 되면 우리는 '일일 교통량'이란 변수가 어떤 값의 분포 특성을 갖는지 좀더 정확히 파악할 수 있게 된다. 그리고 어떤 변수가 가질 수 있는 값 및 그 값을 가질 가능성의 정도를 추정하는 것이 density estimation이다.


밀도(density)는 수학적으로는 mass/volume으로 정의되지만, 밀도추정(density estimation), 기계학습, 확률, 통계 등에서 말하는 밀도(density)는 확률밀도(probability density)를 의미한다 (확률밀도에서 확률을 생략하고 흔히 밀도라고 표현).


즉, 어떤 변수 x의 밀도(density)를 추정하는 것은 x의 확률밀도함수(pdf, probability density function)를 추정하는 것과 동일한 말이다. 어떤 변수 x의 확률밀도함수 f(x)가 아래 그림과 같다고 하자.



<그림 1>


이 때, f(a)는 x = a에서의 확률밀도(probability density) 즉, 변수 x가 a라는 값을 가질 상대적인 가능성(relative likelihood)을 나타낸다.


☞ 밀도(density)와 확률(probability)을 구분해 보면 위 그림에서 x = a일 확률은 0이지만 x = a에서의 density(밀도)는 f(a)로 0이 아니다. 그리고 x가 a, b 사이의 값을 가질 확률(probability)은 그 구간에서의 확률밀도함수의 적분값(면적)으로 계산된다. 즉, density(밀도)는 확률밀도함수의 함수값이며 density를 일정 구간에 대해 적분하면 확률이 나온다.


 --- (1)


어쨌든, 어떤 변수의 확률밀도함수(pdf)를 구할 수 있으면 그 변수가 가질 수 있는 값의 범위 및 확률분포, 특성을 모두 알수 있기 때문에 밀도추정(density estimation)은 확률, 통계, 기계학습, 파라미터 추정 등에서 가장 핵심적인 요소중의 하나이다.



Parametric vs. Non-parametric 밀도추정


밀도추정(density estimation) 방법은 크게 parametric 방법과 non-parametric 방법으로 구분할 수 있다.


Parametric 밀도추정은 미리 pdf(probability density function)에 대한 모델을 정해놓고 데이터들로부터 모델의 파라미터만 추정하는 방식이다. 예를 들어, '일일 교통량'이 정규분포를 따른다고 가정해 버리면 관측된 데이터들로부터 평균과 분산만 구하면 되기 때문에 밀도추정 문제가 비교적 간단한 문제가 되어 버린다.


그런데 현실 문제에서 이렇게 모델이 미리 주어지는 경우는 많지 않으며 분포의 모델을 미리 안다는 것은 너무나 강한 혹은 사치스러운 가정일 수 있다. 이 경우 어떠한 사전 정보나 지식 없이 순수하게 관측된 데이터만으로 확률밀도함수를 추정해야 하는데 이를 non-parametric density estimation라 부른다.


Non-parametric 밀도추정의 가장 간단한 형태가 바로 히스토그램(histogram)이다. 즉, 관측된 데이터들로부터 히스토그램을 구한 후 구해진 히스토그램을 정규화하여 확률밀도함수로 사용하는 것이다.


<그림 2> 히스토그램 밀도추정 (출처: 위키피디아)



Kernel Density Estimation (커널 밀도 추정)


앞서 non-parametric 밀도추정의 가장 단순한 형태가 히스토그램(histogram) 방법이라고 했는데, 히스토그램 방법은 bin의 경계에서 불연속성이 나타난다는 점, bin의 크기 및 시작 위치에 따라서 히스토그램이 달라진다는 점, 고차원(high dimension) 데이터에는 메모리 문제 등으로 사용하기 힘들다는 점 등의 문제점을 갖는다.


Kernel Density Estimation (커널 밀도 추정) 방법은 non-parametric 밀도추정 방법 중 하나로서 커널함수(kernel function)를 이용하여 히스토그램 방법의 문제점을 개선한 방법이다.


먼저, 커널함수(kernel function)에 대한 이해가 필요한데 수학적으로 커널함수는 원점을 중심으로 대칭이면서 적분값이 1인 non-negative 함수로 정의되며 가우시언(Gaussian), Epanechnikov, uniform 함수 등이 대표적인 커널 함수들이다.


 --- (2)

--- (3)


<그림 3> 다양한 커널 함수들 (출처: 위키피디아)


다시 KDE(Kernel Density Estimation, 커널 밀도 추정)로 돌아가서 x를 변수(random variable), x1, x2, ..., xn을 관측된 샘플 데이터, K를 커널 함수라 하자. 이 때 KDE에서는 랜덤 변수 x에 대한 pdf(확률밀도함수)를 다음과 같이 추정한다.


 --- (4)


식 (4)에서 h는 커널(kernel) 함수의 bandwidth 파라미터로서 커널이 뽀족한 형태(h가 작은 값)인지 완만한 형태(h가 큰 값)인지를 조절하는 파라미터이다. 수식적으로 보면 어렵지만 이를 직관적으로 이해하면 다음과 같다.


1. 관측된 데이터 각각마다 해당 데이터 값을 중심으로 하는 커널 함수를 생성한다: K(x-xi)

2. 이렇게 만들어진 커널 함수들을 모두 더한 후 전체 데이터 개수로 나눈다.


<그림 4> "Comparison of 1D histogram and KDE" by Drleft


히스토그램을 이용한 밀도추정 방법과 KDE 방법을 비교해 보면, 히스토그램 방법은 이산적(discrete)으로 각 데이터에 대응되는 bin의 값을 증가시킴으로써 불연속성이 발생하는 반면 KDE(커널밀도추정) 방법은 각 데이터를 커널 함수로 대치하여 더함으로써 그림 4 오른쪽 그래프와 같이 smooth한 확률밀도함수(pdf)를 얻을 수 있는 장점을 갖는다.


즉, KDE(Kernel Density Estimation)를 통해 얻은 확률밀도함수는 히스토그램 확률밀도함수를 스무딩(smoothing)한 것으로도 볼 수 있으며 이 때, 스무딩(smoothing) 정도는 아래 그림처럼 어떤 bandwidth 값의 커널 함수를 사용했으냐에 따라 달라진다.


<그림 5> Kernel density estimate (KDE) with different bandwidths of a random sample of 100 points from a standard normal distribution. Grey: true density (standard normal). Red: KDE with h=0.05. Black: KDE with h=0.337. Green: KDE with h=2 (출처: 위키피디아)


실제 KDE를 사용할 때, 중요한 이슈는 어떤 커널 함수를 사용할지와 커널 함수의 bandwidth 파라미터인 h 값을 어떻게 잡을지이다. 위키피디아에 의하면 가장 최적의 커널함수는 Epanechnikov 커널이며 계산의 편의상 Gaussian 커널함수도 많이 사용된다고 한다. 그리고 Gaussian 커널함수를 사용할 경우 최적의 bandwidth 파라미터 값은 다음과 같다고 한다.


 --- (5)


단, n은 샘플 데이터의 개수, σ는 샘플 데이터의 표준편차.


by 다크 프로그래머


저작자 표시 비영리 변경 금지
신고
  • 이전 댓글 더보기
  • 2016.04.26 17:39 신고 ADDR 수정/삭제 답글

    영상 관련해서 자료 잘 보고 있습니다.
    시험공부할 때나 연구 할 때 도움이 정말 많이 됩니다ㅠㅠ
    설명도 정말 이해가 잘됩니다.
    앞으로도 좋은 글 많이 부탁드립니다 : -)

  • 조동인 2016.04.28 12:21 신고 ADDR 수정/삭제 답글

    와...정말 감사합니다...항상 많이 배우고갑니다ㅠㅠ 감동입니다 ㅠㅠ

  • 1212 2016.04.29 03:05 신고 ADDR 수정/삭제 답글

    우와....이렇게 직관적으로 와닿는 설명은 처음입니다. 감사합니다!!!!

  • leaner 2016.05.03 19:54 신고 ADDR 수정/삭제 답글

    감사합니다! 많은 도움이 되었어요~ 설명을 정말 잘 하시는 것 같아요!!

  • haehae 2016.05.30 21:46 신고 ADDR 수정/삭제 답글

    정말 감사합니다.. 이 분야에 대해 거의 공부해보지 못했음에도 정말 이해가 잘될정도로 설명을 잘해주시네요~ 앞으로 자주 들르겠습니다!!

  • 감사합니다! 2016.07.06 14:55 신고 ADDR 수정/삭제 답글

    감사합니다!

  • 유병혁 2016.08.05 19:58 신고 ADDR 수정/삭제 답글

    머릿 속에 쏙쏙 들어옵니다! 정말 감사드립니다!

  • 박상훈 2016.09.23 11:31 신고 ADDR 수정/삭제 답글

    안녕하세요 글을 잘 읽었습니다!!

    마지막 부분에 ''단, n은 샘플 데이터의 개수, σ는 샘플 데이터의 표준편차.''
    라는 글이 있는데요
    샘플 데이터는 1개인데 σ(표준편차) 를 구할 수 있나요 ?

    • BlogIcon 다크pgmr 2016.09.23 11:41 신고 수정/삭제

      굳이 수식적으로 계산하자면 0이 나옵니다만, 샘플데이터 1개에 대해서 표준편차를 구한다는 것은 의미가 없다고 생각합니다. 표준편차라는게 샘플들이 얼마나 큰 변화폭을 갖는지를 측정하는 게 목적인데..

    • 박상훈 2016.09.23 12:06 신고 수정/삭제

      그러면 위에서 쓰신 sigma 는 n개의 샘플데이터'들' 의 표준편차를 의미하는것인가요 ?

    • 박상훈 2016.09.23 12:10 신고 수정/삭제

      제가 현재 'mutual information-based optimization of sparse spatio-spectral filters in brain-computer interface'

      라는 논문을 보는중인데 ..
      나중이라도 .. 그 논문의 수식 14 - 15 번에서 y가 의미하는게 스칼라인데.. 이것의 분산을 구할 수 있나... 한번만 봐주실 수 있나요 ?ㅠ

    • BlogIcon 다크pgmr 2016.09.23 19:05 신고 수정/삭제

      보고 또 보다보면 보이지 않을까요..

  • mmmzzz 2016.10.08 09:43 신고 ADDR 수정/삭제 답글

    짱이에여...

  • yoonhos 2017.02.03 17:39 신고 ADDR 수정/삭제 답글

    color constancy논문을 이해하는 도중에 kernel density estimation에서 막혔는데 덕분에 수월하게 넘어갑니다 감사합니다

  • thHwang 2017.02.16 22:35 신고 ADDR 수정/삭제 답글

    아주 좋은 설명 감사합니다.
    비모수적 분포 추정 방법을 공부하고있었는데
    커널 밀도 추정이 잘 이해가 안되었었는데,
    물론 커널이라는 단어가 쓰임새에 따라 정의가 다르긴 하지만
    여기서 정의한 의미로 커널을 이해하니 잘 와닿습니다.
    감사합니다

  • SCVOPNER 2017.03.21 14:58 신고 ADDR 수정/삭제 답글

    좋은글 감사합니다!
    안녕하세요
    opencv background subtarator KNN 을 공부하던중 해당 논문을 읽다가 궁금한 점이 있어서 질문을 썼습니다.

    제가 알고 있는 knn은 SVM 처럼 기계학습을 할 때, 라벨을 주어 학습을 하는 것으로 알고 있는데

    배경제거시에는 위에서 설명하신 kernel density estimation 과 knn을 사용하여 배경제거를 한것으로 해석하였는데 이경우에는 어떻게 knn이 쓰이는지 혹시 아신다면 답변 해주시면 감사하겠습니다

    • BlogIcon 다크pgmr 2017.03.21 17:46 신고 수정/삭제

      자세히는 모르겠지만 입력 픽셀 색상과 가장 유사한 k개의 클러스터를 찾은 후, 찾아진 k개의 클러스터가 전경인지 배경 클러스터인지에 따라서 입력 픽셀을 분류하는 방식으로 생각됩니다.

  • 큐빈슨 2017.04.24 02:07 신고 ADDR 수정/삭제 답글

    설명 너무 좋습니다. 큰 도움 받고 갑니다. 공유도 했습니다. 감사합니다!

  • 학생 2017.05.24 14:10 신고 ADDR 수정/삭제 답글

    좋은글 감사합니다.

  • 펭펭 2017.06.04 14:41 신고 ADDR 수정/삭제 답글

    시험공부하다가 큰 도움 받고 갑니다.
    정말 감사합니다!!!!!

  • 꼬마어름 2017.06.11 18:08 신고 ADDR 수정/삭제 답글

    제가 진짜 답글 안다는데.. 다크 프로그래머 블로그는 우리나라 개발자의 등불입니다. 홧팅입니다.

  • 학생2 2017.08.17 15:20 신고 ADDR 수정/삭제 답글

    비전공부하면 무조건 여기로 오게되네요 ... 대단합니다 진짜 ... 본 블로깅들이 모두 유료전환된다고해도 구독할 의사가 있을정도입니다.

  • 학생 2017.09.04 18:12 신고 ADDR 수정/삭제 답글

    좋은글 감사합니다.
    질문이 있는데 이미지로 쳤을 때 KDE의 가우시안 커널을 사용한 것이 카우시안 필터로 스무딩한 것과 같은 것이라고 봐도 되는건가요??

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

      같은 것인지까지는 확신이 없지만 비슷한 거라고 생각합니다.

  • 학생 2017.10.11 23:30 신고 ADDR 수정/삭제 답글

    항상 좋은 글 감사합니다!!!!!

  • 지나가던 2017.10.18 12:22 신고 ADDR 수정/삭제 답글

    와 안그래도 KDE 접하고 헷갈렸는데 친절하게 써주셔서 이해가 쏙쏙 들어왔네요 감사해용