들어가기: 선형 대수 책인 "코딩 더 매트릭스" 를 읽으면서 가장 문화 충격으로 다가왔던 개념은 벡터(vector)의 개념이었습니다. 오늘은 선형대수의 개념과 벡터에 대해서 알아보도록 하겠습니다.
저는 모르는 개념이 있을 때 (나무 위키)를 찾아보는 것을 추천합니다. 백과 사전처럼 진지하지 않지만 (누가 썻는지 모를 정도로) 방대한 내용이 잘 녹아들어 있기 때문입니다.
나무 위키에서 선형 대수학을 검색해보면 첫 문단에 다음과 같이 나와 있습니다.
덧셈과 상수곱 구조를 갖고 있는 벡터공간(vector space)과 그 위에서 정의되고 벡터공간의 연산 구조를 보존하는 함수인 선형사상(linear map)에 관한 학문.
어떤 개념의 첫 문단은 참 많은 것을 함축하고 있습니다. 마치 글을 쓸 때 나머지 90%보다 첫 문단을 쓰는게 어렵다는 얘기처럼 말이죠.
먼저 "덧셈과 상수곱 구조를 갖는" 입니다. 이 얘기는 선형대수의 세상이 덧셈과 곱셈으로 이루어져 있다는 얘기입니다. 즉, 2차 (x^2)나 3차 (x^3) 같은 곡선이나 포물선이 존재하지 않고 오직 선형(linear)으로 이루어져 있는 세상이라는 것입니다. 조금 다르게 설명드리면 선형이라는 것은 (직선)을 의미하죠. 즉, 어떤 데이터의 발전은 직선을 따라서만 (혹은 0으로 되거나..) 오르거나 내릴 수 있다고 생각하면 쉽습니다.
두번째는 "벡터 공간(vector space)"인데요. 현재까지 이해하기로는 벡터(이거.. 우리 고등학교 때 배웠자나요?) 벡터들로 이루어진 공간을 의미합니다. 예를 들어 (1,0) 벡터와 (0.1) 벡터만 가지면 모든 2차원 평면(= 공간)을 누빌 수 있는 것 처럼요.
세번째는 "선형 사상(linear map)" 입니다. 매핑하다라는 것이 좀 이해하기 어려울 수 있는데 한마디로 단위 변환 같은 것이라고 생각하시면 좋을 것 같아요. 예를 들어 (1kg, 2kg) 즉 (1,2)가 있는데 이것을 g으로 변환하려면 1000을 곱하면 되죠. 즉 벡터 a=(1,2) 이고 변환된 벡터 b는 (1000,2000) 입니다. a에서 b로의 사상(이걸 mapping이라고 하는 겁니다) 하려면 1000 이라는 함수가 필요하죠.
지금까지 실컷 선형대수를 얘기하다가 왠 함수?
제가 책을 읽으면서 충격적으로 받아들였던 것은 첫 장의 제목이 (1. 함수) 였기 때문입니다.
함수는 잘 아시죠? 수학 시간에 배운 함수의 정의입니다.
우리가 앞서 (1kg, 2kg)을 (1000g, 2000g)으로 바꾸기 위해서는 어떤 과정이 필요한데 그렇게 처리를 해주는 것이 함수라는 것입니다. 선형대수를 배울 때는 수많은 함수(= 벡터)와 마주하게 됩니다.
개인적으로 저는 (벡터는 함수다 / 3.2절 제목) 라는 말도 좀 신기했습니다 +.+
이번 글의 목표는 (선형대수의 개념과 벡터)에 대해서 알아보는 것입니다. 그리고 (벡터는 함수)다 라는 것까지 알아보았습니다.
선형대수는 2차, 3차 와 같은 곡선이 아니라 직선(1차 = 선형 = linear) 세계를 탐구하는 학문이고
데이터를 벡터 공간에서 표현하며 선형 사상(linear map)을 통해 데이터를 변환하게 됩니다.
변환이라는 말이 어려운데 1kg -> 1000g 처럼 자유자재로 바꿀 수 있다라고 생각하시면 됩니다.
여담인데 , E = mc^2 이라고 하자나요? (제가 정확하게 아는 건 아니지만 제곱 이런거 들어가면 선형 세계가 아닙니다) 오로지 변수가 1차일때만 선형대수에서 배운 것들을 활용할 수 있습니다.
벡터란 무엇인가? Khan Academy에 보면 다음과 같이 설명합니다. 저는 이게 이해하기가 편했어요.
벡터(vector) = 세기(magnitude) + 방향(direction) 이다.
갑자기 앞에서 전혀 설명하지 않았던 세기와 방향이 언급되죠?
아까는 (벡터가 함수)라메 이제는 (벡터가 세기와 방향이라고? ) 이게 무슨 소리야? @.@
이렇게 생각하실 거 같아요.
선형세상.. 직선으로만 이루어진.. 2, 3..n차항이 없는 1차 세상에서 표현할 수 있는 삼라만상이 벡터입니다.
1) (1kg, 2kg) -> (1000g, 2000g)으로 변환해주는 것도 벡터 (사실 이것은 스칼라지만.. 벡터가 조금만 커저도 벡터가 되지요)
2) (5,0) -> 5mph 로 수평으로 달리는 것을 표현재눈 것도 벡터
3) 좌표 (100,200)도 벡터
4) 예를 들어 어떤 사람의 (키, 몸무게, 성별, 나이) = (180..되고 싶다, 70, M, 35) 이런거도 벡터 입니다.
벡터가 무엇인지가 중요한게 아니라 /
벡터는 선형 세상에서 다룰 수 있는 기본 개념이라는 것을 이해하는 것이 중요합니다.
벡터로 표현할 수 있는 것은 (삼라만상)이라고 할만큼 다양합니다. 앞의 4번 예와 마찬가지로요.
사실 제 주언어는 Java입니다. 그래서 자바 언어로 벡터를 구현하면 좋겠지만 T_T
자바 보다는 파이썬이 표현력이 훨씬 좋은 것 같아요. (아쉽게도 자바에 비해 파이썬은 성능이 떨어집니다)
잘 못하긴 하지만 pandas 공부할 때는 그 표현력에 눈을 번뜩했지요.
> 이걸 한 줄에 구현할 수 있담 말인가?
파이썬에서 벡터는 리스트([])로 표현합니다. 그냥 [1,2] 이렇게 넣으면 되요.
당연히 좀더 재대로 처리하려면 클래스에 담는 것이 맞지만 현재 수준에서는 그렇게 표현해보겠습니다.
만약 앞의 (키, 몸무게, 성별, 나이)와 같은 벡터를 표현할 때는 feature(특성)을 기술해줘야 하므로 딕셔너리로 표현하는 것이 좋겠습니다.
{'키': 180, '몸무게':70, '성별':'M', '나이':35} 이렇게요.
다음엔 벡터의 연산에 대해서 알아보도록 하겠습니다.
감사합니다.
2018.10.9 @한글날