ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SOM Clustering(Self-Organizing Map, 자기조직화지도)
    Data Science 2022. 8. 21. 20:16
    반응형

    1. SOM Clustering

    SOM Clustering(이하 SOM)은 map의 topology 구조를 유지하면서 고차원의 데이터를 저차원으로 변경하는 비지도 학습 방법이다.

    구조는 입력 레이어와 출력 레이어 두개의 층으로 구성되어 있다.

    입력된 패턴에 가장 유사한 출력 레이어의 neuron이 winner neuron이 되고, 이를 중심으로 유사한 입력패턴의 집합이 이루어진다.

    이를 통해서 유사한 패턴은 동일한 출력(같은 군집)을 가지게 된다.

     

    SOM의 가장 큰 특징이자 대표적인 군집화 기법 K-Means와의 차이점으로는 군집화의 개수를 설정하지 않아도 된다는 점이다.

    그 외에도, 시각적 표현이 뛰어나며 입력변수의 위치 관계를 보존한다는 특징이 있다.

     

     SOM에 대해서 고려하게 된 계기는 아래와 같다.

    • 대상 데이터에서 명확하게 군집의 수를 정할 수 있는 도메인적 기준이 없다.
    • 대상 데이터의 차원수(독립변수)가 너무 많다.

    실제로 기업에서 제공되는 데이터의 경우 수많은 독립변수를 가진 고차원의 데이터들이 많다.

    대표적인 K-Means Clustering의 경우 다차원에서는 그 성능의 한계를 자주 보이며, 실제 과제에서도 유의미한 군집 성능을 보여주지 못했다.

     

    2. SOM 구현

    SOM 라이브러리 설치

    SOM 알고리즘에 대해서 구현되어 있는 라이브러리를 설치하여 구현을 진행한다.

    pip install minisom

    SOM 생성

    from minisom import MiniSom   
    
    # initialization of 6x6 SOM
    som = MiniSom(6, 6, 4, sigma=0.3, learning_rate=0.1,topology='hexagonal',random_seed=7)

    SOM의 파라미터는 아래와 같다.

    dimension X/Y : topology의 X,Y차원 수.

    input_len: 입력되는 독립변수 개수

    sigma : neighborhood 반경, 새로운 expression vector가  노드와 연결 될 때 SOM 벡터의 변경을 확장하는데 사용된다.

    learning_rate : 학습률을 설정한다.

    topology : Map의 모양(rectangular/hexagonal ), hexagonal 을 선택하면 좀더 유연한 map 모양을 가질 수 있다.

    random_seed : 랜덤시드를 지정 할 수 있다. 지정하지 않으면 실행때마다 다른 결과를 받을 수 있다.

     

    더미데이터 생성

    실제 데이터를 가지고 진행 할 경우,
    동일한 가중치를 위하여 Scaling을 적용 후 진행하여야 한다.

    data = [[ 0.80,  0.55,  0.22,  0.03],
            [ 0.82,  0.50,  0.23,  0.03],
            [ 0.80,  0.54,  0.22,  0.03],
            [ 0.80,  0.53,  0.26,  0.03],
            [ 0.79,  0.56,  0.22,  0.03],
            [ 0.75,  0.60,  0.25,  0.03],
            [ 0.2,  0.29,  0.52,  0.03],
            [ 0.3,  0.29,  0.62,  0.02],
            [ 0.27,  0.99,  0.92,  0.8],
            [ 0.27,  0.99,  0.92,  0.9]]

    SOM 학습

    # trains the SOM with 10000 iterations
    som.train(data, 10000)

    SOM 평가

    Quantization Error(양자화 오차)를 통해서 군집정도를 평가한다.

    QE의 값이 낮을 수록 군집화가 잘 됐음을 의미한다.

    som.quantization_error(data)
    #0.24942525690454084

    군집값 추출

    winner_coordinates = np.array([som.winner(x) for x in data]).T
    cluster_index = np.ravel_multi_index(winner_coordinates,(6,6))
    
    #array([22, 22, 22, 22, 22, 22, 22, 22, 26, 26])

    의도한 바로는 3개의 군집이 발현되기를 바랬는데, 막상 2개의 군집만이 나타났다.

    추가적으로 파라미터의 종류 및 의미를 정리하고 최적화를 진행 할 예정이다.

    또한, 결과를 시각화하는 코드를 추가 할 예정이다.

    참고문헌

    https://github.com/JustGlowing/minisom

    https://koreascience.kr/article/JAKO201033359737855.pdf

    https://airsbigdata.tistory.com/84

    https://rosypark.tistory.com/110

    http://jaynewho.com/post/7

    https://studying-haeung.tistory.com/4

    https://untitledtblog.tistory.com/5

    반응형

    댓글

Designed by Tistory.