저번에 구현한 EM 알고리즘에 오류가 있어서 수정해봤다.
각 클러스터 중심을 구할 때 k-means 와 비슷하게 아예 확률값이 큰 클러스터에 포인트를 할당해 해당 클러스터 파라메터 계산시에만 확률값을 사용했는데 이런식으로 하면 안되고 한 포인트가 가지는 각 클러스터의 확률값을 가지고 이를 기반으로 각 클러스터 파라메터 재계산을 해야한다.
사실 코딩할 때 애매모호 해서 예전에 들었던 k-means와 거의 비슷하다는 강의록을 기억해 이런식으로 코딩했었다. 하지만 다시 확인해보고 여러 책을 뒤져보니 잘못 코딩한게 명백해졌다.
그래서 코드 수정을 했다.
게다가 k-means와 거의 100% 비슷하다는 언급을 취소하고 약 90%정도 비슷하다 정도로 이야기 하고 싶다.
/*
EM clustering algorithm
Created by gogamza 2009.06.28
You can see full description in http://www.freesearch.pe.kr/1262
*/
#include
#include
#include
#include
위 알고리즘을 돌려보면 두 클러스터는 이전 클러스터의 중간값으로 근접해 가고, 나머지 한개의 클러스터는 멀리 떨어진 평균 20을 가지는 점으로 수렴하는걸 볼 수 있다.
세 가지 다른 정규분포에 의해서 나온 점들을 제너레이션 했으나 결국 2개의 클러스터로 클러스터링 되었다는 재밋는 사실을 알 수 있었다.
넘버 제너러이션 시점에서 표준편차를 적은값으로 주면 정확하게 3개의 클러스터로 만들어질 거란 생각을 해본다.