여러분, 안녕하세요! 수업을 잘 따라오고 있길 바랍니다.
저는 항상 어떤 일을 하기 전에 중요한 질문 3가지에 답하려고 합니다.
- 무엇을? - 이 일은 무엇에 관한 것일까? 이걸 먼저 이해해야 합니다
- 왜? - 내가 왜 이 일을 하고 있지? 이유를 명확히 할 필요가 있습니다.
- 어떻게? - 이제 문제를 이해했어. 어떻게 해결하면 좋을까?
여러분, 안녕하세요! 수업을 잘 따라오고 있길 바랍니다.
저는 항상 어떤 일을 하기 전에 중요한 질문 3가지에 답하려고 합니다.
차원 축소란 무엇인가?
통계학, 머신러닝 그리고 정보 이론에서 차원 축소란 주성분 집합을 구해서 확률 변수의 개수를 줄이는 과정을 의미합니다. 차원 축소는 특징 선택과 특징 추출 두 단계로 나뉩니다.
차원 축소는 왜 필요한가?
왜 우리는 아무 데이터나 사용할 수 없을까요? 그게 사람이 하는 방식인데 말입니다. 상황을 관찰하고, 데이터를 수집하고, 인지 능력을 이용해서 결정합니다. 하지만 우리는 실수를 하기도 합니다. 그 이유를 분석해보면 보통 충분하게 데이터가 없었기 때문입니다. 그렇다면 데이터가 너무 많으면 어떻게 될까요? 결정에 혼란을 주어서 끔찍한 결론을 내릴 수도 있습니다.
일상생활에서도 가치있는 데이터를 충분히 얻는 것은 무조건 해결해야 할 중요한 문제입니다. 예를 들어서 제가 x + y = 10 라는 식을 풀라고 하고 X, Y, Z의 값을 주면 어떻게 될까요?
의도치 않은 차원의 증가는 과거보다 훨씬 상세한 단위까지 데이터를 측정할 수 있게 된 것과 연관이 있습니다. 최근 데이터가 급격히 증가하면서 더 중요한 문제로 부상했습니다. 특히 사물인터넷(IOT)이 발전하고 센서가 MQTT 프로토콜을 통해 수백만 개의 데이터 전송할 수 있게 되면서부터입니다. 저희는 값의 변동없이 비슷한 값을 가지고 있는 수많은 변수/차원을 얻게 되었습니다. 이는 원치 않은 차원 증가 문제이고, 따라서 차원 축소 처리가 필요합니다. 변수가 많을수록 더 많은 문제가 일어날 수 있으니까요. 그리고 이 문제를 해결하기 위해 차원 축소 기법이 등장했습니다.
이 ‘궁극적 문제’를 어떻게 풀까요?
아래 그림을 봅시다. 2차원 데이터 x1, x2를 어떤 물체를 센티미터 단위로 측정한 값과 인치 단위로 측정한 값이라고 합시다. 기계학습에서 두 차원을 모두 사용하면 비슷한 정보를 전달하게 되고 시스템에 많은 노이즈를 일으킬 겁니다. 따라서 차원 하나만 사용하는 것이 낫습니다. 이제 2차원에서 1차원으로 차원을 변환 시켰습니다. 이제 데이터를 설명하기 상대적으로 쉬워졌습니다.
비슷한 방법으로 n 차원의 데이터를 k (k < n) 차원의 데이터로 축소할 수 있습니다. 이 k 차원은 n 차원 벡터 중에서 바로 고를 수도 있고(필터링), 차원의 조합(차원의 가중 평균)일 수도 있고, 또 기존의 여러 차원을 잘 나타낼 수 있는 새로운 차원(들) 일 수도 있습니다.
간단하지만 굉장히 명확한 설명이죠?
데이터의 차원을 2차원이나 3차원으로 축소해 데이터를 도식화하고 보일 수 있습니다. 그러면 데이터의 양상을 좀더 분명하게 관찰할 수 있습니다. 아래 그림은 3차원 데이터가 어떻게 2차원으로 변환 되었는지를 보여줍니다. 먼저 2차원 평면을 구하고 두 새로운 축 z1과 z2로 데이터 포인트를 나타냈습니다.
몇 가지 차원 축소 방법:
이 리스트에서 첫 번째와 마지막 방법에 대해 얘기해봅시다.
PCA
기계학습 분야에서 차원 축소 기법으로 가장 잘 알려진 방법 중 하나입니다.
PCA는 다양한 문제에서 중요하게 쓰이기 때문에 다음으로 넘어가기 전에 잘 이해하도록 합시다.
자기 조직화 지도
자기조직화지도(SOM) 또는 코호넨 네트워크는 튜보 코호넨이 개발하였으며 데이터 가시화 기술을 제공합니다. 데이터 차원을 축소 매핑하여 고차원 데이터를 이해할 수 있도록 돕습니다. SOM은 데이터 차원을 축소하고 데이터 간의 유사도를 표시합니다.
SOM을 이용한 군집화는 여러 개의 유닛이 현재 객체에 대해 경쟁하도록 하는 방식입니다. 데이터가 시스템에 들어가면 인공신경망이 입력에 대한 정보를 얻어 학습합니다. 유닛의 가중치가 현재 객체와 가장 비슷한 유닛이 승자/활성 유닛이 됩니다. 학습 단계에서 입력 변수에 대한 값들이 입력 데이터셋 내 이웃 데이터와의 관계를 보존하면서 점진적으로 조정됩니다. 입력된 객체와 값이 바뀌면 승자 유닛의 가중치와 그 이웃의 가중치 역시 조정됩니다.
튜보 코호넨은 이렇게 말했습니다. “SOM은 고차원 데이터 가시화를 위한 새롭고 효율적인 소프트웨어 도구입니다. 고차원 데이터 간의 복잡하고 비선형적인 통계적 관계를 저차원의 화면에서 간단하고 기하학적인 관계로 나타낼 수 있도록 변환하죠. 화면에 나타내는 주요 데이터의 가장 중요한 위상 정보와 계량의 관계를 보존하면서 정보를 압축합니다. 일종의 추상화된 것을 만든다고 생각할 수도 있습니다.”
알고리즘:
Best Matching Unit (BMU)은 모든 가중치 벡터에 대해 표본 벡터와의 거리를 계산하는 기술입니다. 가장 가까운 가중치 벡터가 승자가 됩니다.
일반적으로 SOM은 고차원 데이터를 유사도 구조에 따라 가시화하는데 유용합니다. 특히 거대한 (많은 코호넨 유닛을 가지고 있는) SOM은 기존 데이터의 위상 정보를 잘 보존하는 것으로 알려져있습니다. 예를 들어, 입력 공간에서 이웃하는 데이터들은 SOM 에서 인접한 위치에 표시될 것입니다.
아래의 코드는 ‘고전적인’ 색상 매핑 예제입니다. 즉, SOM이 직사각형 영역에 많은 수의 색을 매핑할 겁니다.
(리눅스 환경의 경우) 시작하기 위해서 아래를 설치하세요
apt-get install swig3.0
ln -s /usr/bin/swig3.0 /usr/bin/swig
pip install pymvpa2
이제 아래의 모듈을 쥬피터 노트북으로 불러올 수 있을 겁니다.
from mvpa2.suite import *
먼저 몇몇 색들을 0과 1사이의 RGB 값으로 정의합니다. 흰색의 경우 (1, 1, 1) 검은색의 경우 (0, 0, 0)이 되겠죠. 정의된 색들 중 상당수가 ‘파란색’의 일종이기 때문에, SOM에서 좀더 자세히 표현되어야 합니다.
colors = np.array(
[[0., 0., 0.],
[0., 0., 1.],
[0., 0., 0.5],
[0.125, 0.529, 1.0],
[0.33, 0.4, 0.67],
[0.6, 0.5, 1.0],
[0., 1., 0.],
[1., 0., 0.],
[0., 1., 1.],
[1., 0., 1.],
[1., 1., 0.],
[1., 1., 1.],
[.33, .33, .33],
[.5, .5, .5],
[.66, .66, .66]])
# store the names of the colors for visualization later on
color_names = \
['black', 'blue', 'darkblue', 'skyblue',
'greyblue', 'lilac', 'green', 'red',
'cyan', 'violet', 'yellow', 'white',
'darkgrey', 'mediumgrey', 'lightgrey']
이제 매퍼 객체를 만들어봅시다. 내부에서 코호넨 레이어를 이용해서 데이터를 매핑할 겁니다. 매퍼에게 20 x 30 개의 유닛으로 이루어진 직사각형 레이어를 이용하라고 할 겁니다. 매퍼의 출력 공간이 되는 겁니다. 그리고 맞춤 학습률로 400번 반복하여 네트워크를 학습시킵니다.
som=SimpleSOMMapper((20,30),400,learning_rate=0.05)
마지막으로, 조금 전 정의한 ‘color’ 데이터 세트로 매퍼를 학습시킵니다.
som.train(colors)
코호넨 레이어의 각 유닛은 고차원 입력 공간을 가리키는 포인터라고 생각할 수 있습니다. 각 포인터는 SOM이 어떤 입력 부분 공간에서 2차원의 출력 공간의 한 부분으로 매핑할지 가리키는 용도로 사용됩니다. 이 예시 SOM에 의한 색상 매핑은 아래 matplotlib 함수의 호출로 확인할 수 있습니다.
pl.imshow(som.K, origin='lower')
이제 초기 학습용 프로토타입이 어떤 좌표로 매핑되었는지 살펴봅시다. 이 좌표를 얻기 위해서는 단순히 학습 데이터를 매퍼에 입력하고 출력 결과를 그려보면 됩니다.
mapped = som(colors)
pl.title('Color SOM')
# SOM's kshape is (rows x columns), while matplotlib wants (X x Y)
for i, m in enumerate(mapped):
pl.text(m[1], m[0], color_names[i], ha='center', va='center',
bbox=dict(facecolor='white', alpha=0.5, lw=0))
기존 학습용 색상의 텍스트 라벨은 SOM으로 ‘매핑된’ 장소에 나타날 것이고 그 곳의 색깔과 일치하겠죠.
아래 도식은 3차원 색상 공간을 2차원 SOM 노드 레이어로 SOM 매핑한 모범 예시를 보여줍니다.
계속 열심히 공부하시길 바랍니다.
참고자료
https://www.analyticsvidhya.com
http://www.pymvpa.org
https://research.cs.aalto.fi
https://github.com
http://www.pitt.edu
comment
20201005