인지야공/강의 요약/11번째 글
선형대수로 배우는 빅데이터 — 네 번째 도전에서 열린 문
선형대수에는 늘 아쉬움이 있었다. 잘해 보고 싶은데 이해하려 들면 맞게 가고 있는지 모르겠고, 어느 순간 졸고 있었다. 이번이 네 번째 수강이었고 역시 어려웠다.
왜 저렇게 해야 할까, 왜 저렇게 해도 되는 거지 — ‘왜’에 집착하는 사람에게 선형대수는
이유와 쓸 곳이 보이지 않는, 넘을 수 없는 성벽 같은 것이었다. 그러다 안 되겠어서 처음부터
다시 보자며 1주차를 되감았다. 거기서 차원 축소와 주성분 분석을 활용 예로 설명하는 대목에
정신이 번쩍 들었다.
그 시점부터 모든 강의를 이건 결국 차원을 다루는 이야기라고 놓고 다시 들었다. 완전히 이해했다고는 못 하겠지만, 몇 년째 제자리이던 것이 한 발 나갔다.
| 주차 | 주제 |
|---|---|
| 1 | 선형대수학의 개요 — 응용 분야, 기본 개념, 선형이란 무엇인가 |
| 2 | 연립선형방정식과 풀이법, 파이썬·넘파이 실습 |
| 3 | 행렬의 연산, 역행렬, 특별한 행렬 |
| 4 | 역행렬의 계산과 활용, LU 분해 |
| 5 | 행렬식 — 정의, 성질, 기하학적 의미 |
| 6 | 벡터, 벡터의 연산, 벡터공간과 기저 |
| 7 | 벡터의 내적과 외적, 벡터와 기하학 |
1주차 — 이걸 어디에 쓰는지부터
첫 시간을 응용 사례로 채운다. 이 순서가 이 강의의 가장 큰 미덕이었다.
| 분야 | 선형대수가 하는 일 |
|---|---|
| 데이터의 표현과 처리 | 흑백 이미지도, 측정값 묶음도 결국 행렬 |
| 웹페이지 중요도 평가 | 구글 PageRank — 링크 구조를 행렬로 두고 푼다 |
| 컴퓨터 그래픽스 | 모델링과 변환. 이동·회전이 전부 행렬곱 |
| 로보틱스 | 관절 각도로부터 말단 위치 결정. 변환행렬의 연쇄 |
| 전기회로 분석 | 키르히호프 법칙 → 연립선형방정식 |
| 푸리에 변환 | 로 표현된 신호를 로 바꿔 해석 |
| 차원 축소 | 고차원 데이터를 저차원으로. PCA 가 대표 — 고윳값과 고유벡터 |
| 다변량 정규분포 | 공분산 행렬 의 역행렬과 행렬식이 식 안에 들어 있다 |
| 칼만 필터 | 로봇·미사일의 위치 추정. 예측과 갱신이 행렬 연산 |
일곱 번째 줄이 내 강의를 바꿨다. 현장의 센서 데이터는 항상 열이 너무 많다. 그 많은 열을 줄이는 일에 이 과목이 쓰인다는 걸 알고 나니 나머지가 전부 도구로 보이기 시작했다.
선형이란 무엇인가
집합 → 사상(≈함수) → 행렬 → 벡터 순으로 기초 용어를 정리한 뒤, 선형성을 정의한다.
이 두 줄을 만족하는 사상이 선형변환이다. 그리고 강의는 우리가 이미 아는 것들을 이 틀에 넣어 보여 준다.
| 연산 | 합의 보존 | 상수배의 보존 |
|---|---|---|
시그마도, 극한도, 미분도, 적분도 전부 선형이다. 곱의 미분과 몫의 미분이 유독 복잡한 것도 같은 이유에서 설명된다 — 곱셈은 선형이 아니다. 선형대수가 왜 이렇게 넓게 쓰이는지에 대한 답이 여기 있다. 선형이라는 성질 하나만 공유하면 같은 도구로 다룰 수 있다.
연립선형방정식 — 풀이를 절차로 만들기
선형방정식은 최고차항이 1차인 방정식이다. , , 가 끼면 아니다. 다만 은 가 상수라서 여전히 선형이라는 퀴즈가 좋았다. 미지수가 어디에 들어 있는지를 보라는 얘기다.
연립방정식을 바꿔도 해가 그대로인 연산은 세 가지뿐이다.
- 두 행(방정식)의 위치를 바꾼다
- 한 행에 0이 아닌 상수를 곱한다
- 한 행의 상수배를 다른 행에 더한다
“열에 상수를 곱한다”는 여기 없다. 퀴즈에서 오답으로 나오는 항목인데, 열을 건드리면 그건 다른 문제가 된다.
가우스-조단 소거법은 이 세 연산으로 계수행렬을 단위행렬까지 밀어붙이는 절차다.
손으로 풀 때 요령이 아니라 기계가 따라 할 수 있는 절차라는 점이 핵심이다. 그래서 3주차에 파이썬과 넘파이가 나온다. 미지수 여섯 개짜리 연립방정식을 손으로 풀 이유가 없다.
import numpy as np
A = np.array([[ 1.0, 2.1, 2.6, -1.6, -2.0, -5.9],
[-1.8, 5.9, 1.9, -0.7, 1.4, -3.6],
[ 5.3, 2.3, -0.8, 4.8, 3.4, -6.9],
[-1.7, -6.4, 0.9, 2.1, -1.8, 8.3],
[ 4.2, -2.9, 1.4, -8.4, 1.4, -1.3],
[ 1.2, 7.8, -4.5, -0.7, 4.5, 5.2]])
b = np.array([10.2, 5.7, -13.2, 0.5, -6.0, 9.2])
x = np.linalg.solve(A, b)
np.linalg.solve 한 줄이 하는 일이 앞에서 손으로 밀던 그 절차다. 도구를 쓰기 전에 절차를
한 번은 손으로 밀어 봐야 한다는 게 이 과목의 태도였고, 실제로 그렇게 하고 나니
데이터프레임의 연산 과정이 조금 보이기 시작했다.
행렬 — 곱셈부터 다시
덧셈·뺄셈·스칼라배는 성분끼리 하면 되는데, 곱셈만 다르다.
강의가 성분끼리 곱하는 오답을 (잘못된 풀이 주의) 라고 못 박아 둔 게 인상적이었다.
넘파이에서 A * B 와 A @ B 가 다른 이유가 정확히 이 지점이다.
| 성질 | 성립 여부 |
|---|---|
| 성립 | |
| 성립 | |
| 성립 | |
| 성립하지 않는다 |
역행렬은 를 만족하는 행렬이고, 있는 행렬을 가역이라 한다. 2차 정사각행렬은 공식이 짧다.
분모의 가 0이면 역행렬이 없다. 5주차의 행렬식이 이미 여기 나와 있다.
특별한 행렬들 — 전치행렬 , 대칭행렬(), 반대칭행렬(), 대각행렬. 공분산 행렬이 대칭이라는 사실이 나중에 고유분해에서 좋은 성질로 돌아온다.
역행렬의 계산과 LU 분해
기본행렬(단위행렬에 행연산 하나를 적용한 것)을 왼쪽에 곱하면 그 행연산이 수행된다. 그래서 를 나란히 놓고 쪽을 단위행렬로 만들면, 오른쪽이 이 된다.
기본행렬의 역행렬은 그 연산을 되돌리는 연산이라는 게 퀴즈로 나온다. 1행의 2배를 3행에 더한 기본행렬의 역은, 1행의 배를 3행에 더하는 것이다. 당연한데 막상 물으면 헷갈린다.
LU 분해는 로 아래삼각행렬과 위삼각행렬의 곱으로 쪼개는 것이다. 둘리틀법은 의 주대각을 전부 1로 고정해 나머지를 차례로 결정한다.
왜 쪼개는가 — 는 그대로인데 우변 만 계속 바뀌는 상황 때문이다. 삼각행렬은 전진대입·후진대입으로 바로 풀리므로, 한 번 분해해 두면 가 몇 개든 싸게 풀 수 있다. 설비 하나에 대해 조건만 바꿔 가며 반복 계산하는 상황이 딱 이 모양이다.
행렬식 — 부피가 얼마나 늘었는가
여인수 전개로 정의하고 성질을 나열한 뒤, 3주차에서 기하학적 의미를 준다. 이 순서 덕분에 행렬식이 계산 규칙이 아니라 양(量)으로 남았다.
3차에서는 세 벡터가 만드는 평행육면체의 부피다. 그래서 행렬식은 부피 확대율이다.
| 뜻 | |
|---|---|
| 가역. 부피가 살아 있다 | |
| 차원이 무너졌다 — 벡터들이 한 평면(또는 직선) 위에 있다 | |
| 음수 | 방향이 뒤집혔다 |
을 “역행렬이 없다”로만 외우면 아무 느낌이 없는데, 세 벡터가 납작하게 눌려 부피가 0이 된 상태라고 보면 왜 정보를 잃었는지가 보인다. 열이 서로 종속인 데이터 — 현장에서 같은 값을 두 번 측정해 열로 넣은 경우 — 가 정확히 이 상태다.
활용 두 가지도 정리해 둔다.
- 동차 연립방정식 은 이면 자명해 만 갖는다
- 딸림행렬로 역행렬을 쓸 수 있다 —
벡터공간 — 데이터가 사는 곳
벡터공간은 덧셈과 스칼라배에 대해 닫힌 집합이다(, ). 그 안의 부분집합이 다시 벡터공간이면 부분공간이다.
| 개념 | 정의 |
|---|---|
| 선형결합 | |
| 일차독립 | 의 해가 모두 0뿐일 때 |
| 일차종속 | 그 외 — 어떤 벡터를 나머지의 선형결합으로 쓸 수 있다 |
| 생성(span) | 의 모든 벡터를 의 선형결합으로 표현할 수 있을 때 |
| 기저 | 일차독립이면서 공간을 생성하는 집합 |
| 차원 | 기저에 있는 벡터의 개수 |
의 표준기저는 이고, 는 다.
여기가 1주차에서 본 차원 축소와 이어지는 자리다. 기저를 몇 개로 잡느냐가 곧 차원이고, 차원을 줄인다는 것은 더 적은 기저로 데이터를 충분히 설명하겠다는 뜻이다. 일차종속인 열은 새 정보를 주지 않으니 버려도 되고, PCA 는 남길 방향을 데이터가 가장 많이 퍼진 순서로 고른다. 이 문장이 성립하려면 여기까지의 용어가 전부 필요했다.
내적과 외적 — 각도와 넓이
내적은 각도를 재는 도구다. 직교하면 0이고, 같은 방향이면 크기의 곱이 된다. 여기서 사영이 나온다.
를 방향으로 눌러 그림자를 만든 것 — 최소제곱법과 회귀가 결국 이 그림자 이야기다.
외적은 두 벡터에 동시에 수직인 벡터이고, 그 크기가 두 벡터가 만드는 평행사변형의 넓이다.
내적이 , 외적이 이라는 대비가 깔끔하다. 나란할수록 내적이 크고, 수직일수록 외적이 크다. 그리고 외적은 행렬식으로 계산된다 — 5주차의 넓이·부피 이야기가 여기서 다시 만난다.
남는 것
강의를 다 듣고도 “이제 선형대수를 안다”고는 말 못 한다. 다만 바뀐 게 있다.
- 행렬은 표가 아니라 변환이다. 곱한다는 건 공간을 바꾼다는 뜻이다
- 행렬식은 숫자가 아니라 부피다. 0이면 차원이 무너진 것이다
- 차원 축소는 기저를 다시 고르는 일이다
- 손으로 한 번 밀어 본 절차만 도구로 넘길 수 있다
직접 손으로 문제를 풀면서 행렬 연산을 처음부터 다시 고민한 덕에, 데이터프레임 연산이 무엇을 하는지, 주효과·요인 분석의 원리가 어디서 오는지, 특이값 분해가 왜 필요한지를 이론적으로 조금은 붙잡을 수 있게 되었다. 네 번째 도전의 소득이 그것이다.
같은 시기에 들은 확률과 통계 정리, 데이터 시각화 정리와 한 묶음이고, 고윳값· 고유벡터가 딥러닝에서 어떻게 쓰이는지는 딥러닝 정리에 이어 두었다.