2016/02/26

구글 검색 차트에 대한 잡상


구글이 언제부터 검색창에서 함수를 검색했을 때 차트를 보여 주었는지는 정확히 모르지만 대략 1~2년 되지 않았나 싶다. 마침 내가 만드는 장난감도 차트 프로그램(일명 Zapary Chart)이기 때문에 함수를 몇개 검색해 보고, 내 장난감 차트와 비교해 보았다. 물론 내 장난감은 혼자서 틈틈이 깔작대는 수준이라 아직 구글 차트하고 비교하기는 이르다. 더구나 최근에 구글 검색해 보고 놀란 것은 3차원 함수는 3차원 차트로 보여 주더라. 아직, 2차원에 살고 있는 내가 3차원 얘기까지는 하고 싶지 않다.

다만, Mathematica를 만든 회사인 Wolfram에서 제공하는 wolframalpha 사이트에서도 차트나 수식을 비롯한 다양한 서비스를 예전부터 제공해 왔는데, 구글이 이런 분야까지 파고들고 있는게 아닌가 싶기도 하다.

여기서는 2차원 구글 검색 차트에 대한 감상을 몇가지 끄적이려고 한다.  구글 검색에서  1/(x*x*cos(x))를 입력해서 검색하거나 이 링크를 누르면 구글 검색 결과가 차트로 나타난다. 일단, 아래에 올린 내가 만든 장난감 차트 결과와 비교해서 설명하면 좋을 것 같다.


구글 검색 차트에서 마우스 움직이면 그래프 따라가면서 x, y 좌표가 보이는 것도 대단하진 않지만, 구글스러운 자잘한 서비스이다. 물론, 확대/축소도 되고, 3차원의 경우 회전도 지원한다.

여기서는 이런 것들보다 차트 자체에 대한 기본적인 테크닉이랄까 머 그런 것만 얘기하려고 한다.

x 축과 y 축 범위 설정 문제

함수를 검색해서 차트로 보여줄 때 가장 문제가 되는 부분이 자동 범위 설정 문제이다. 사용자가 어떤 함수를 입력할지 모르기 때문에 함수만 입력 받고서 자동으로 범위를 지정해서 보여주는 것은 쉽지 않은 일이다. 가령, 1/x은 쉽게 보여 줄수 있지만 1/(x-1e+20) - 1e30은 어떻게 처리할까? 사용자 입력 내용을 어차피 parsing 할 수 있으니 그 정보를 활용하면 도움이 될 수 있기는 하다. 차트의 중심점과 x 절편, y 절편 등을 알면 범위 지정이 한결 쉬워지니까. 하지만, 1/(x-1e+20*cos(x)*x) - 1e30*sin(x)를 검색한다면 문자열 parsing 하는 것이 해결책이 되기는 어려울 것이다. 몇가지 테스트 해봤더니 기본적인 수학 지식만으로도 범위를 지정할 수는 있겠더라.

범위 자동 Scaling

어느 범위를 보여 줄지 결정하고 나면 사용자가 보기 쉽도록 설정된 범위를 자동으로 Scaling 해 주어야 한다. 이런 기법은 옛날 옛적 Excel 초창기 시절부터 제공해 왔던 기능이기 때문에 새로울 건 없다. 데이터가 정해지면 범위를 적당히 조정해 주는 로직이다. DOS 시절에 Turbo C로 만들어 봤던 기억을 장난감 차트에도 적용했다.

점근선 경계 부분 연결선 처리

구글 검색 차트를 보면 데이터라기 보다 사람이 차트를 그린 것처럼 직선을 이어서 차트를 그렸다. 실제로 두 가지 문제가 발생하는데, 첫째는 위의 차트에서와 같이 +/- 무한대로 뻗어 나가는 부분에서 직선으로 차트를 그리면 선들이 이어져서 보기 흉하게 된다. 내 장난감 차트의 경우에도 데이터는 점으로 표시하고 이 들을 직선으로 연결했는데 이 문제를 해결함으로써 원하는 차트를 얻게 된다. 이 역시 고딩 수학을 제대로 배운사람이면 해결 가능한 문제이다.

그렇지만, 컴퓨터에서는 수학적이라기 보다는 수치적으로 처리하기 때문에 완벽할 수 없는 문제들이 생긴다. 실제로 확대 축소를 몇번 해 보면 구글 차트도 깔끔하게 연결선을 정리하지 못하는 경우를 발견하게 된다. 어쨌든 wolframalpha 사이트에서 위의 차트에 대한 함수를 검색해서 그래프를 비교해 보면 구글이 얼마나 자잘한 부분까지 신경쓰고 있는지를 알게 될 것이다.

무한대 부분 처리

그런데, 두번째 문제는 점근선 부근에서는 급격히 y값이 변하기 때문에 다른 곳보다 더 많은 데이터가 필요하다. 즉, 장난감 차트에서는 모든 선들이 위 아래로 쭉쭉 뻗지 못하고 있는데 구글 검색 차트에서는 자로 그은 듯이 쭉쭉 뻗고 있다. 데이터 량이 많아 지는 것은 성능 문제로 이어지기 때문에 샘플링을 많이 하는 것이 좋은 해결책은 아니다. 사실, 이미 해결책을 제시했다. 내 장난감 차트에서도 사실 구글 검색차트처럼 보여 줄 수 있다.

맺음말

구글 검색 차트가 완벽한 건 아니다. 몇가지 어려운 함수를 검색해 봤더니 차트를 못 보여 주더라. 하지만 구글이 무서운 건 모르는 사이에 조금씩 진화해 있다는 것이다. 이세돌과 알파고의 대국이 3월 초에 있으니 기대된다. 소시적 인공신경망은 학습 능력이 그닥이었는데 딥러닝이 얼마나 발전한 알고리즘인지 궁금하긴하다.  예전의 Backpropagation 망의 경우엔 알고보니 Steepest Descent더라는 것도 이미 소시적에 다 밝혀진 사실들이었다. 알고리즘 자체가 좋아진 것도 있겠지만 컴퓨터 처리 속도나 저장 용량의 발전도 알파고를 똑똑하게 만드는 요인이 되긴 할 것이다.

이세돌 lol

댓글 없음:

댓글 쓰기