차원의 문제

기계학습 2014.09.12 10:37

차원(dimensionality)에 대한 두 가지 상반된 시각에 대해 다뤄봅니다.


그 한가지는 어떤 문제를 접할 때 차원을 낮추어서 해결하고자 하는 것이고, 다른 한 가지는 오히려 차원을 높여서 문제를 풀고자 하는 것입니다.


먼저 이 글은 어떤 기존의 이론을 정리한 글이 아니라 차원의 문제에 대한 개인적인 생각, 단편적인 지식 등을 정리한 글임을 밝힙니다.



1. 차원이란?


0차원, 1차원, 2차원, 3차원, ...


기하학적으로 보면 0차원은 점의 세계, 1차원은 선의 세계, 2차원은 면의 세계, 3차원은 공간의 세계이다.


보통 3차원까지는 머리 속으로 쉽게 상상이 가지만 4차원 이상부터는 잘 형상화가 되지 않는다.


하지만 4차원도 형상화가 가능하며 이를 그림으로 나타내면 아래와 같다.


<그림 1> 출처: 위키피디아(차원)


4차원은 한 예로 우리가 알고있는 3차원 공간에 시간축을 하나 더 더한 것을 상상하면 된다.


우리 눈앞의 어떤 지점은 3차원 공간에서 (x,y,z)로 표현할 수 있다. 하지만 여기에 시간축을 더하면 동일한 지점도 어제의 그 지점, 오늘의 지점, ... 과 같이 시간에 따라 서로 다른 지점이 될 수 있다. 즉, (x,y,z,t)와 같이 4차원의 세계에서의 한 점으로 표현할 수 있다.


앞서 기하학적 관점 외에도 어떤 시스템의 독립변수의 개수로 차원을 정의할 수도 있다. 이 경우에는 4차원 뿐만 아니라 얼마든지 그 이상의 고차원의 세계를 상상할 수 있다. 예를 들어, 헬리콥터의 움직임이 프로펠러 축의 회전속도, 4개의 프로펠러 날개 각각의 경사각도, 꼬리날개의 회전속도 이 6가지 요인에 의해 결정된다고 가정하면 헬레콥터의 움직임을 결정하는 파라미터 공간은 6차원 공간으로 볼 수 있다.



2. 첫번째 시각: 차원의 저주(curse of dimensionality)


차원과 관련된 문제에 대한 대부분의 접근은 어떻게든 차원을 낮춰서 문제를 단순화시키고자 하는 것이 일반적일 것이다.


차원의 저주(curse of dimensionality)...


기계학습(machine learning), 데이터 마이닝(data mining) 등에서 사용하는 용어로 '차원의 저주'란 말이 있다. 데이터의 차원(dimensionality)이 증가할수록 해당 공간의 크기(부피)가 기하급수적으로 증가하기 때문에 동일한 개수의 데이터의 밀도는 차원이 증가할수록 급속도로 희박(sparse)해진다. 따라서, 차원이 증가할수록 데이터의 분포 분석 또는 모델추정에 필요한 샘플 데이터의 개수가 기하급수적으로 증가하게 되는데 이러한 어려움을 표현한 용어가 '차원의 저주'이다.


따라서 데이터 분석 등의 차원에 관계된 문제에 있어서는 어떻게든 핵심이 되는 파라미터만을 선별하여 문제의 차원을 낮추고자 하는 것이 일반적이다.


데이터의 차원을 낮추는 기계적인 방법으로는 주성분분석(Principal Component Analysis, PCA) 등이 있겠지만 다른 직접적인 예로는 영상처리 분야의 패턴인식 문제를 들 수 있다.


이미지의 경우 픽셀값 하나 하나가 차원을 형성하는 것으로 볼 수 있기 때문에 이미지 한 장은 w*h 차원의 엄청난 고차원 데이터로 볼 수 있다. 이 고차원의 데이터를 직접 다루는 것은 쉽지 않기 때문에 보통 주요 특징(feature)를 선별한 후 선별된 특징을 가지고 패턴을 인식하는 것이 일반적이다. 이 때, 선별된 특징(feature)을 이용하여 패턴을 식별하는 것은 원래의 전체 픽셀값을 이용하는 것에 비해 데이터의 차원을 현저하게 낮춘 것으로 볼 수 있다 (우리가 영상인식에서 흔히 사용하는 히스토그램도 이러한 차원감소의 대표적인 예이다).


즉, 차원의 문제에 대한 첫번째 접근은 인간의 머리로 이해하거나 흐름, 규칙을 발견하기 어려운 고차원의 문제를 우리가 다룰 수 있는 저차원의 문제로 단순화시켜서 처리하고자 하는 것으로 정리할 수 있다.



3. 두번째 시각: 차원의 확장


차원의 문제에 대한 정 반대의 접근은 복잡한 문제를 오히려 새로운 차원을 추가함으로써 단순화시키고자 하는 것이다.


예를 들어 아래 그림에서 빨간색 점과 파란색 점을 구분지을 수 있는 규칙을 발견해 보자.


<그림 2>


대부분 어떤 규칙을 발견하기는 힘들 것이며 그저 노이즈(noise)처럼 보일 것이다.


하지만,


...


여기에 새로운 차원(z축) 하나를 추가하여 아래 그림과 같이 빨간색 점과 파란색 점이 완벽히 분리되는 경우를 생각해 보자.


<그림 3>


즉, 원래의 데이터는 <그림 3>처럼 명확한 규칙을 가지고 분리되는 데이터들이었으나 이 데이터들이 투영된 2차원의 세계에서는 아무런 규칙도 없는 노이즈같은 존재로 비춰진 것일 수도 있다.


이와 같이 현재 우리 눈에는 너무나 복잡하고 무질서해 보이는 문제일지라도 이보다 한차원 더 높은 관점에서 바라봤을 때는 매우 단순한 규칙, 원리에 의해 설명되고 움직이는 문제일 수도 있다.


예전에는 가도 가도 끝이 없는 면의 세계였던 지구가 사실은 입체를 가진 구의 표면이며 나아가 우주속의 수많은 행성 중의 하나임을 깨닫게 된 것처럼 우리가 풀지 못하는 여러가지 문제들은 사실은 우리가 현재의 차원 속에 갇혀 있기 때문에, 그리고 그 차원의 틀 안에서만 현상을 바라보기 때문일 수도 있다.


실제로 기계학습(machine learning) 기법 중에도 데이터의 차원을 증가시켜서 문제를 단순화시키는 방법이 존재한다. SVM(support vector machine)에서 비선형 분류(classification) 문제를 처리할 때 사용하는 기법이 여기에 해당한다. SVM에서는 현재 차원에서 데이터를 선형적으로 분류(classification)하기 힘든 경우에 데이터의 차원을 고차원(무한차원)으로 확장한 후 경계평면(thresholding hyperplane)을 찾는 원리가 사용된다. 데이터의 차원을 확장하는 것은 손쉬운 예로 (x,y)를 (xy, x^2y, xy^2, ... ) 등과 같이 확장하는 것을 생각하면 된다.



4. 마무리


우리가 하는 대부분의 연구는 어떻게 하면 효과적으로 차원을 낮출까에 관한 것이 대부분이다. 좋은 feature를 찾아서 식별력을 높이고, 데이터의 분포를 단순한 모델로 근사시키고, ... 하지만 차원을 낮추다 보면 원래 데이터가 가지고 있던 정보는 기본적으로 소실되기 마련이다.


어쩌면 불가능할지도 모르겠지만 눈에는 드러나지 않는 현상 속에 숨겨진 차원을 발견할 수 있다면 오히려 여러 불가능해 보이는 문제들이 쉽게 풀릴지도 모른다.


by 다크 프로그래머


  • 수제자 2014.09.13 04:45 신고 ADDR 수정/삭제 답글

    정말 쉽고 재밌게 잘 풀어 설명해 주셨네요..^^
    PCA와 SVM을 차원의 측면에서 보니 이해가 더 잘 갑니다.
    좋은 글 감사합니다.

    • BlogIcon 다크pgmr 2014.09.13 07:01 신고 수정/삭제

      약간은 뜬구름 잡는 얘기인데 재밌게 읽으셨다니 다행입니다 ^^
      건강도 잘 챙기시기 바라며 항상 감사합니다.

  • BlogIcon 갱님 2014.09.16 14:25 신고 ADDR 수정/삭제 답글

    오랜만에 놀러와서 너무 재밌게 잘 읽고 갑니다. ^^
    PCA 공부할 때는 수식과 개념이해로 이렇게 멀리서 생각해보지 못했네요.
    좋은글 감사합니다.

  • 어떤문제든 다양한 측면에서 고려해보면
    답이 꼭 있는것 같아요!
    너무 쉽게 잘 설명해주셔서 감사합니다^^

  • 두서없이 2014.10.03 11:28 신고 ADDR 수정/삭제 답글

    왠지 도움이 될 것 같아서 url을 적어놓고 갑니다.
    cymatics 가 눈에는 드러나지 않는 현상 속에 숨겨진 차원을 발견하려고 하는 학문같아여~
    저는 양자물리학 관련 책을 보다가 알게 되었고, 구체적으론 잘 모릅니다.
    그저 문화센터에서 교양과목 듣는 아줌마처럼 공부하고 있거든요~ ^^


    1. 구글링으로 검색하면 이미지와 함께 좋은자료 많더라구여~
    http://www.ted.com/talks/evan_grant_cymatics
    evan grant라는 사람이 전문가인것 같아요~


    2. 네이버전문정보 학술자료
    "싸이매틱스(Cymatics)에 의한 단음의 그래픽 패턴"
    참고 url :
    http://academic.naver.com/view.nhn?dir_id=0&unFold=false&sort=0&query=%EC%8B%B8%EC%9D%B4%EB%A7%A4%ED%8B%B1%EC%8A%A4&gk_qvt=0&citedSearch=false&field=0&gk_adt=0&qvt=1&doc_id=41548537&page.page=1&ndsCategoryId=110

    자율적으로 탐구하는 마음으로, 올려주시는 글들을 학습하고 있습니다. 감사합니다. ^^

    • BlogIcon 다크pgmr 2014.10.04 07:53 신고 수정/삭제

      소개와 링크 감사합니다. 동영상 잘 보았습니다. 신기하네요 ^^

  • thinkpad 2014.10.16 09:51 신고 ADDR 수정/삭제 답글

    차원에 대해 알게 쉽게 풀어쓴 글 감사드립니다.

    SVM을 이해해보려고 하다가 항상 그렇지만 수학적인 부분에서 좌절을 느꼈는데... 혹시 SVM을 한번 소개해 주실 수 있으신지요...

    매번 배우고 가고 이번에는 부탁까지 드려서 죄송합니다.

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

      안녕하세요. svm에 대한 내용은 참고토록 하겠습니다. 요즘은 여유가 없어서 글을 쓸 엄두를 못내고 있습니다.. 12월 이후에나 시간이 날지 모르겠습니다.

    • thinkpad 2014.10.17 18:39 신고 수정/삭제

      다크pgmr님 정말 감사합니다.

      이렇게 배우는 것만으로도 좋은데 시간 여유가 있을 때 부탁드리겠습니다.

  • 김진팔 2014.10.19 12:01 신고 ADDR 수정/삭제 답글

    안녕하세요. 지난번에 CV++2010 에러 문제 알려주셔서 잘 쓰고 있습니다.
    새로운 질문이 있습니다.
    제가' 라즈베리파이+ 웹캠+ HAARCASCADE_FRONTALFACE_ALT.XML'으로 얼굴에 사각형 그리는 것을 해 봤습니다.
    그런데 라즈베리 파이의 사양이 너무 낮아서 15초에 한 프레임씩 출력이 됩니다.
    소스 코드를 바꿔서 1초에 1프레임씩 나오도록 해도 마찬가지입니다.

    그러던 차에 haarcascade가 아닌 lbpcascade를 쓰면 정확도는 떨어지지만 속도가 빨라진다는 글을 인터넷에서 읽었습니다.
    그래서 #include "highgui.h"
    #include "cv.h"
    int main(void)
    {
    double wsize = 320;
    double hsize = 240;

    cvNamedWindow("FaceDetection", CV_WINDOW_AUTOSIZE);
    CvCapture* capture = NULL;
    capture = cvCreateCameraCapture(0);
    cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, wsize);
    cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, hsize);

    IplImage* frame;
    CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*) cvLoad("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml");
    CvMemStorage* cvMStr = cvCreateMemStorage (0);
    CvSeq* face;

    while (1)
    {
    frame = cvQueryFrame(capture);
    if (!frame) break;
    face = cvHaarDetectObjects(frame, cvHCC, cvMStr);
    for (int i = 0; i < face->total; i++)
    {
    CvRect* faceRect = (CvRect*)cvGetSeqElem(face,i);
    cvRectangle (frame,cvPoint(faceRect->x, faceRect->y),
    cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
    CV_RGB(255,0,0),
    2,CV_AA);
    }
    cvShowImage("FaceDetection",frame);
    if (cvWaitKey(30)==27) break;
    }

    cvReleaseMemStorage(&cvMStr);
    cvReleaseHaarClassifierCascade(&cvHCC);
    cvReleaseCapture( &capture);
    cvDestroyWindow("FaceDetection");
    }

    이런 코드를 써서 haarcascade를 썼던 것을 lbp cascade로 바꾸려고,
    중간에 있는
    IplImage* frame;
    CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*) cvLoad("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml");

    이 부분을
    IplImage* frame;
    CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*) cvLoad("/usr/share/opencv/lbpcascades/lbpcascade_frontalface.xml");
    라고 바꾸어 주었습니다.

    lbpcascade_frontalface.xml 가 있는 실제의 폴더를 지정해 준 것입니다.
    그러나 이것만 가지고는 되지가 않았습니다.
    어떻게 해야 haar 대신 lbp를 쓸 수 있을까요?
    lbpcascade_frontalface.xml 는 이미 제 라즈베리파이에 들어 있습니다.

    • BlogIcon 다크pgmr 2014.10.20 07:17 신고 수정/삭제

      사용하신 함수들은 모두 Haar feature를 처리하는 함수들이기 때문에 LBP를 입력으로 주면 동작하지 않습니다. LBP 함수들로 모두 바꾸거나 아니면 Haar와 LBP를 동시에 지원하는 CascadeClassifier 란 클래스를 사용해야 합니다. CascadeClassifier 클래스 사용법은 http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html을 참조하시기 바랍니다.

    • 김진팔 2014.10.20 10:29 신고 수정/삭제

      감사합니다.^^
      가 봤는데.... 봐도 잘.....쩝...연구 좀 해 봐야겠군요.^^ 제가 초보라서.

  • 곰돌이만세^^ 2014.10.29 14:50 신고 ADDR 수정/삭제 답글

    쉽게 풀어쓰시는 능력은 제가 봤던 어떤 분 보다 좋으신듯 해요~
    저는 지난 주말로 올해 과제를 거의 마무리하고 지금은 한가하게 서핑중입니다.ㅎㅎ
    블로그와 댓글 달아주심이 도움이 많이 되었습니다. 감사드립니다.

    • BlogIcon 다크pgmr 2014.10.29 16:44 신고 수정/삭제

      벌써 올해 과제를 다 마무리 하셨다니 부럽습니다 ^^

    • 곰돌이만세^^ 2014.10.29 17:27 신고 수정/삭제

      제가 능력이 좋아서가 아니라 그냥 일정상 10월 말까지라서요.
      11월에는 또 새롭게 시작됩니다. 호호호

  • 우낀사자 2014.11.03 13:51 신고 ADDR 수정/삭제 답글

    궁금한게 있습니다.
    왜 픽셀 하나를 하나의 차원으로 해석하나요?

    • BlogIcon 다크pgmr 2014.11.03 16:32 신고 수정/삭제

      일순 어떻게 답변을 드려야 하나 막막합니다.
      이미지를 구성하는 픽셀들은 각각 서로 독립된 값을 가질 수 있으며 각각의 픽셀이 가질 수 있는 값의 범위가 각각 하나의 축을 형성합니다. 그리고 이렇게 생성된 고차원의 공간속의 한 점이 이미지라고 볼 수 있습니다. 답변이 될지는 모르겠습니다..

  • Summer 2014.12.18 19:37 신고 ADDR 수정/삭제 답글

    테일러 급수 보고 감탄하다가 차원에 대한 내용 발견! 흥미롭습니다 감사합니다^^

  • BlogIcon 학미니 2015.02.20 18:07 신고 ADDR 수정/삭제 답글

    데이터 마이닝을 공부하며 개념적으로 잘 이해가 안되었는데 잘 정리되었습니다 감사합니다

  • BlogIcon joshuabhk 2015.03.14 15:06 신고 ADDR 수정/삭제 답글

    우연히 블로그 글을 읽게 되었다가 감동받고 글을 올립니다. 제 페북에 공유하였는데 혹시 싫으시다면 링크 삭제토록 하겠습니다.

  • Ha's 2015.04.03 17:44 신고 ADDR 수정/삭제 답글

    혹시 한정된 원 데이타로도 차원의 저주를 피할 방법이 없을지? ㅎㅎ

    • BlogIcon 다크pgmr 2015.04.04 05:56 신고 수정/삭제

      데이터가 많으면 좋겠지만 정 안되면 pca 등을 이용하여 데이터의 차원을 낮추면 좋을 것 같습니다.

  • Ha's 2015.04.07 11:26 신고 ADDR 수정/삭제 답글

    네? PCA?

    • BlogIcon 다크pgmr 2015.04.07 13:33 신고 수정/삭제

      네, PCA(principal component analysis, 주성분분석)를 이용하면 데이터의 차원을 낮출 수 있습니다. 그리고 PCA를 이용해서 데이터를 새로운 저차원의 데이터로 변환시키는 것을 Karhunen-Loeve Transform (KLT)이라고 부릅니다. 관련 내용에 대해 찾아보시면 도움이 되리라 생각합니다.

  • 2015.08.12 00:45 ADDR 수정/삭제 답글

    비밀댓글입니다

  • 곰돌이만세^^ 2015.08.24 15:52 신고 ADDR 수정/삭제 답글

    매번 도움만 받고 가는 것 같지만... 염치 없지만 또 질문남겨봅니다.
    한 30여 차원이 되는 특징 벡터에서 특정 컬럼(차원)이 분류 결과와 무관하다는 것을 알아낼 방법이 있을까요?
    모든 분류 문제에서 이런 점을 미리 제거하고 훈련시킨다면, 상당히 시간절약+좋은 결과가 도출이 될 것 같아서요.
    아니면 반대로, 이런 컬럼이 있음에도 불구하고 분류결과가 훌륭한 알고리즘은 무엇이라고 부르는 지요. 혹은 그런 기법이 있는가 싶네요.
    책을 몇권 읽어봐도, 이에 대한 내용은 잘 찾기가 어려워서 다크님께 왔습니다.

    • BlogIcon 다크pgmr 2015.08.26 10:58 신고 수정/삭제

      안녕하세요. Fisher criterion 또는 LDA(Linear Discriminant Analysis)로 검색해 보시기 바랍니다.

  • 마호 2015.10.09 14:53 신고 ADDR 수정/삭제 답글

    안녕하세요 기계학습을 전공하는 대학원생입니다.

    저도 차원에 대한 생각에 대해서 자주 하는 편인데, 근거가 되는 자료를 찾지 못해서 헤매고 있는데요, 혹시 이 생각을 뒷받침 해줄만한 공신력있는 논문이나 자료가 있는지 궁금합니다.

    • BlogIcon 다크pgmr 2015.10.09 16:08 신고 수정/삭제

      그냥 생각을 정리한 것일뿐 따로 자료는 없습니다. 과거에는 컴퓨팅 파워의 제약으로 인해 어떻게 하면 구분력 있는 좋은 feature를 뽑을 것인가가 주 관심사였다면 최근에는 feature를 따로 선별하지 않고 데이터 전체를 이용해서 프로세싱을 하는 것이 추세인 것 같습니다.

  • 석사 2016.02.05 11:22 신고 ADDR 수정/삭제 답글

    와 재미있는 글입니다
    차원의 확장이 인상적이에요

  • BlogIcon 코스 2016.02.14 21:25 신고 ADDR 수정/삭제 답글

    항상 많이 배워감니다. 감사합니다.

  • dfdsf 2018.05.27 22:18 신고 ADDR 수정/삭제 답글

    SVM의 차원확장에 대해서 피상적으로 이해하고이썼는데 이런 이유가 있었군요.

    예시중 4차원을 3차원에 + 시간축을 떠올려서 쉽게 이해한것 처럼 파란점과 빨간점의 예시에도 사실 파란점은 모두 100년전에 얻은 데이터이고 빨간점은 현재에 얻은 데이터였다!라고 예시를 들어도 좋을꺼같네요.