1 선형대수의 두 기본 연산
선형대수학 전체가 두 연산 위에 세워진다.
- 벡터 덧셈 \(\mathbf{v} + \mathbf{w}\)
- 스칼라 곱 \(c\mathbf{v}\)
이 두 연산만으로 행렬, 부분공간, 고유값, SVD에 이르는 모든 것을 구성할 수 있다. 단순해 보이지만, 이 두 연산이 결합된 선형결합 \(c\mathbf{v} + d\mathbf{w}\) 가 선형대수의 심장이다 (Strang, 2009, §1.1).
2 벡터의 표현
2.1 열벡터와 성분
\(n\) 개의 실수를 수직으로 쌓은 열벡터(column vector):
\[\mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} \in \mathbb{R}^n\]
\(v_i\) 는 \(i\) 번째 성분(component)이다. 스칼라 \(v_i\) 와 벡터 \(\mathbf{v}\) 를 구분하기 위해 벡터는 굵은 소문자로 쓴다.
공간 절약을 위해 행벡터 형태 \(\mathbf{v} = (v_1, v_2, \ldots, v_n)\) 으로 쓰기도 한다. 그러나 이것은 표기의 편의일 뿐, 실체는 열벡터이다. 행벡터 \([v_1\ v_2\ \cdots\ v_n]\) 은 절대적으로 다른 객체다 — 이것은 열벡터의 전치(transpose) \(\mathbf{v}^\top\) 이다.
2.2 벡터의 세 가지 표현
같은 벡터 \(\mathbf{v} = (4, 2)\) 를 세 가지 방식으로 볼 수 있다:
| 표현 방식 | 의미 |
|---|---|
| 두 숫자 \((4, 2)\) | 성분 목록 — 계산의 기반 |
| 화살표 | 원점에서 점 \((4, 2)\) 까지의 방향과 크기 |
| 평면의 점 | 좌표 \((4, 2)\) 위치 |
세 관점 모두 동등하다. 수치 계산은 성분으로, 기하학적 직관은 화살표로 생각한다.
2.3 위치 벡터: 두 점의 차이
평면 위 점 \(P\) 는 좌표 \((x, y)\) 를 갖는다. 이를 원점에서 \(P\) 까지의 화살표로 읽으면 위치 벡터(position vector) \(\mathbf{OP}\) 가 된다. 원점 \(O\) 의 위치 벡터는 영벡터 \(\mathbf{0}\) 이므로:
\[\mathbf{OP} = \mathbf{P} - \mathbf{O} = \mathbf{P}\]
두 점 \(P_1 = (x_1, y_1)\) 와 \(P_2 = (x_2, y_2)\) 를 잇는 벡터도 같은 뺄셈으로 얻는다.
\[\mathbf{P_1 P_2} = \mathbf{P_2} - \mathbf{P_1} = (x_2 - x_1, y_2 - y_1)\]
왜 중요한가: 벡터는 “위치”가 아니라 “변위(displacement)”이다. 두 점의 차이로 벡터를 구성하는 이 조작이 §벡터 방정식에서 직선·평면의 파라메트릭 표현으로 확장된다.
3 벡터 덧셈
\[\mathbf{v} + \mathbf{w} = \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} + \begin{bmatrix} w_1 \\ w_2 \\ \vdots \\ w_n \end{bmatrix} = \begin{bmatrix} v_1 + w_1 \\ v_2 + w_2 \\ \vdots \\ v_n + w_n \end{bmatrix}\]
성분별로 따로따로 더한다. 다른 방법은 없다.
“사과와 오렌지를 더할 수 없다.” Strang의 표현이다. 벡터의 각 성분은 서로 다른 단위·의미를 가질 수 있다. 성분끼리만 더하는 이유가 여기에 있다 (Strang, 2009, §1.1).
3.1 예시: 2차원
\[\mathbf{v} = \begin{bmatrix} 1 \\ 5 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} 3 \\ 3 \end{bmatrix} \implies \mathbf{v} + \mathbf{w} = \begin{bmatrix} 4 \\ 8 \end{bmatrix}\]
3.2 예시: 3차원
\[\mathbf{v} = \begin{bmatrix} 1 \\ 1 \\ -1 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} 2 \\ 3 \\ 4 \end{bmatrix} \implies \mathbf{v} + \mathbf{w} = \begin{bmatrix} 3 \\ 4 \\ 3 \end{bmatrix}\]
3.3 기하학적 해석: 평행사변형 법칙
\(\mathbf{v}\) 의 끝점에서 \(\mathbf{w}\) 를 이으면 합벡터 \(\mathbf{v} + \mathbf{w}\) 가 된다. 이것을 head-to-tail 덧셈이라 한다. 원점, \(\mathbf{v}\), \(\mathbf{w}\), \(\mathbf{v}+\mathbf{w}\) 의 네 점은 평행사변형을 이룬다.
교환 법칙 \(\mathbf{v} + \mathbf{w} = \mathbf{w} + \mathbf{v}\) 는 이 평행사변형의 두 경로가 같은 꼭짓점에 도달한다는 것이다.
3.4 영벡터
\(\mathbf{v} + (-\mathbf{v}) = \mathbf{0}\) 이다. 영벡터 \(\mathbf{0}\) 은 숫자 \(0\) 이 아니다 — 모든 성분이 \(0\) 인 벡터이다. 모든 선형공간은 영벡터를 포함한다.
3.5 뺄셈의 기하학
\(\mathbf{v} - \mathbf{w}\) 는 \(\mathbf{w}\) 의 끝점에서 \(\mathbf{v}\) 의 끝점을 향하는 벡터다. \(\mathbf{v}\) 와 \(-\mathbf{w}\) 를 더한 것이고, 평행사변형의 다른 대각선이다.
\[\mathbf{v} = \begin{bmatrix} 4 \\ 2 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} -1 \\ 2 \end{bmatrix} \implies \mathbf{v} - \mathbf{w} = \begin{bmatrix} 5 \\ 0 \end{bmatrix}\]
4 스칼라 곱
실수 \(c\) 와 벡터 \(\mathbf{v}\) 의 곱:
\[c\mathbf{v} = c \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \end{bmatrix} = \begin{bmatrix} cv_1 \\ cv_2 \\ \vdots \\ cv_n \end{bmatrix}\]
\(c\) 를 스칼라(scalar)라 부르는 이유: 벡터를 스케일링(scaling)하기 때문이다.
스칼라 \(c\) 에 따른 효과:
| \(c\) 의 범위 | 기하학적 효과 |
|---|---|
| \(c > 1\) | 같은 방향, 더 길어짐 |
| \(0 < c < 1\) | 같은 방향, 짧아짐 |
| \(c = 0\) | 영벡터 \(\mathbf{0}\) |
| \(-1 < c < 0\) | 반대 방향, 짧아짐 |
| \(c < -1\) | 반대 방향, 더 길어짐 |
벡터를 2배 하는 방법은 두 가지다: \(\mathbf{v} + \mathbf{v}\) 또는 \(2\mathbf{v}\). 두 결과는 동일하다.
4.1 덧셈·스칼라 곱의 대수 성질
모든 \(\mathbf{u}, \mathbf{v}, \mathbf{w} \in \mathbb{R}^n\) 과 스칼라 \(c, d \in \mathbb{R}\) 에 대해:
덧셈
- 교환법칙: \(\mathbf{u} + \mathbf{v} = \mathbf{v} + \mathbf{u}\)
- 결합법칙: \((\mathbf{u} + \mathbf{v}) + \mathbf{w} = \mathbf{u} + (\mathbf{v} + \mathbf{w})\)
- 항등원: \(\mathbf{v} + \mathbf{0} = \mathbf{v}\)
- 역원: \(\mathbf{v} + (-\mathbf{v}) = \mathbf{0}\)
스칼라 곱
- 스칼라와의 결합법칙: \((cd)\mathbf{v} = c(d\mathbf{v})\)
- 벡터에 대한 분배법칙: \(c(\mathbf{u} + \mathbf{v}) = c\mathbf{u} + c\mathbf{v}\)
- 스칼라에 대한 분배법칙: \((c + d)\mathbf{v} = c\mathbf{v} + d\mathbf{v}\)
- 곱셈 항등원: \(1 \cdot \mathbf{v} = \mathbf{v}\)
왜 성질을 명시하는가: 이 8가지가 바로 Ch.3에서 정의할 벡터 공간(vector space)의 공리이다. \(\mathbb{R}^n\) 의 성분별 연산이 이 공리를 자동으로 만족하기 때문에, 같은 규칙이 함수 공간·행렬 공간·다항식 공간에서도 그대로 성립한다. 한 집합에서 증명된 모든 정리를 다른 집합에 그대로 적용할 수 있다는 것이 “공리화”의 힘이다.
5 선형결합
5.1 정의
벡터 \(\mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_k \in \mathbb{R}^n\) 과 스칼라 \(c_1, c_2, \ldots, c_k \in \mathbb{R}\) 에 대해:
\[c_1\mathbf{v}_1 + c_2\mathbf{v}_2 + \cdots + c_k\mathbf{v}_k\]
를 이 벡터들의 선형결합(linear combination)이라 한다. \(c_i\) 를 계수(coefficient)라 부른다.
두 벡터의 경우, 네 가지 특수한 선형결합:
\[\underbrace{1 \cdot \mathbf{v} + 1 \cdot \mathbf{w}}_{\text{합}}, \quad \underbrace{1 \cdot \mathbf{v} - 1 \cdot \mathbf{w}}_{\text{차}}, \quad \underbrace{0 \cdot \mathbf{v} + 0 \cdot \mathbf{w}}_{\text{영벡터}}, \quad \underbrace{c \cdot \mathbf{v} + 0 \cdot \mathbf{w}}_{c\mathbf{v}}\]
5.2 예시: 구체적인 선형결합
\[\mathbf{v} = \begin{bmatrix} 1 \\ 1 \\ 0 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix}\]
\(c = 2, d = -1\) 로 선형결합을 구하면:
\[2\mathbf{v} - \mathbf{w} = 2\begin{bmatrix} 1 \\ 1 \\ 0 \end{bmatrix} - \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} 2-2 \\ 2-3 \\ 0-1 \end{bmatrix} = \begin{bmatrix} 0 \\ -1 \\ -1 \end{bmatrix}\]
3개 벡터의 선형결합:
\[\mathbf{u} = \begin{bmatrix} 1 \\ 0 \\ 3 \end{bmatrix}, \quad \mathbf{v} = \begin{bmatrix} 1 \\ 2 \\ 1 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} 2 \\ 3 \\ -1 \end{bmatrix}\]
\[\mathbf{u} + 4\mathbf{v} - 2\mathbf{w} = \begin{bmatrix} 1 \\ 0 \\ 3 \end{bmatrix} + \begin{bmatrix} 4 \\ 8 \\ 4 \end{bmatrix} + \begin{bmatrix} -4 \\ -6 \\ 2 \end{bmatrix} = \begin{bmatrix} 1 \\ 2 \\ 9 \end{bmatrix}\]
6 선형결합이 만드는 기하학적 구조
이것이 §1.1의 핵심 질문이다. “모든 \(c\) 와 \(d\) 를 취하면 \(c\mathbf{v} + d\mathbf{w}\) 가 만드는 집합은 무엇인가?”
6.1 벡터 1개의 선형결합
비영벡터 \(\mathbf{u}\) 의 스칼라 배 \(c\mathbf{u}\) (모든 \(c \in \mathbb{R}\))는 원점을 지나는 직선을 채운다.
\(c > 0\) 이면 \(\mathbf{u}\) 방향, \(c < 0\) 이면 반대 방향, \(c = 0\) 이면 원점. 이 직선은 양방향으로 무한히 뻗는다.
왜 중요한가: 모든 선형대수 문제는 결국 “어떤 벡터들이 어떤 공간을 채우는가?”로 귀결된다. 1개 벡터는 1차원(직선), 2개는 2차원(평면), \(k\) 개는 최대 \(k\) 차원 공간을 채운다.
6.2 벡터 2개의 선형결합
\(\mathbf{v}\) 가 \(\mathbf{u}\) 의 스칼라 배가 아닐 때(두 벡터가 같은 직선 위에 없을 때), 모든 \(c, d \in \mathbb{R}\) 에 대한 선형결합 \(c\mathbf{u} + d\mathbf{v}\) 는 원점을 지나는 2차원 평면을 채운다.
직관: \(c\mathbf{u}\) 직선 위의 각 점에서 \(d\mathbf{v}\) 직선을 더하면 평면이 “깔린다”.
예시: \(\mathbf{v} = (1, 1, 0)^\top\), \(\mathbf{w} = (0, 1, 1)^\top\) 의 선형결합
\[c\mathbf{v} + d\mathbf{w} = \begin{bmatrix} c \\ c + d \\ d \end{bmatrix}\]
이 평면의 특징: 두 번째 성분 = 첫 번째 + 세 번째 성분. 즉 \(v_2 = v_1 + v_3\) 을 만족하는 모든 3차원 벡터의 집합이다. \((1, 2, 3)\) 은 이 평면에 없다 (\(2 \neq 1 + 3\)).
예외 (종속 벡터): 만약 \(\mathbf{v} = 2\mathbf{u}\) 라면, \(c\mathbf{u} + d\mathbf{v} = c\mathbf{u} + 2d\mathbf{u} = (c + 2d)\mathbf{u}\) 로, 여전히 직선만 채운다. 두 벡터가 독립적이어야 평면이 만들어진다.
6.3 벡터 3개의 선형결합
\(\mathbf{w}\) 가 \(\mathbf{u}\) 와 \(\mathbf{v}\) 의 선형결합이 아닐 때, 모든 \(c, d, e \in \mathbb{R}\) 에 대한 선형결합은 3차원 전체 공간 \(\mathbb{R}^3\) 을 채운다.
직관: \(\mathbf{u}\)-\(\mathbf{v}\) 평면에 속하지 않는 \(\mathbf{w}\) 를 더하면 평면 밖으로 나갈 수 있다. 모든 방향이 열린다.
예외: \(\mathbf{w}\) 가 \(\mathbf{u}\)-\(\mathbf{v}\) 평면 안에 있으면(\(\mathbf{w} = c_0\mathbf{u} + d_0\mathbf{v}\) ), 3개 벡터의 선형결합도 평면을 벗어나지 못한다.
6.4 요약: 선형결합의 기하학
| 벡터 수 | 전형적인 경우 생성 집합 | 핵심 조건 |
|---|---|---|
| 1개 \(\mathbf{u}\) | 직선 (1차원) | \(\mathbf{u} \neq \mathbf{0}\) |
| 2개 \(\mathbf{u}, \mathbf{v}\) | 평면 (2차원) | \(\mathbf{v} \neq c\mathbf{u}\) |
| 3개 \(\mathbf{u}, \mathbf{v}, \mathbf{w}\) | 3차원 공간 \(\mathbb{R}^3\) | \(\mathbf{w} \notin \text{span}\{\mathbf{u}, \mathbf{v}\}\) |
| \(k\) 개 \(\in \mathbb{R}^n\) | 최대 \(k\) 차원 부분공간 | 벡터들이 선형독립 |
이 표의 “핵심 조건”이 나중에 배울 선형독립(linear independence)의 씨앗이다.
7 \(n\) 차원으로의 확장
2차원·3차원에서 쌓은 직관은 \(n\) 차원에서도 그대로 적용된다.
- \(n\) 차원 벡터의 덧셈: 여전히 성분별 덧셈
- \(n\) 차원의 선형결합: \(c_1\mathbf{v}_1 + \cdots + c_k\mathbf{v}_k\), 여전히 성분별 계산
- \(n\) 차원 단위 큐브의 대각선 \((1, 1, \ldots, 1)\) 의 길이: \(\sqrt{n}\)
\(n = 10\) 인 벡터를 그릴 수는 없지만, 계산 규칙은 \(n = 2\) 와 완전히 동일하다. 이것이 선형대수의 “인상적인 특징”이다 (Strang, 2009, §1.1).
ML에서의 \(n\) 차원: 이미지 하나가 \(28 \times 28 = 784\) 픽셀이면 784차원 벡터다. 텍스트 임베딩은 768차원이다. 선형결합으로 이 고차원 공간을 다루는 것이 딥러닝의 기본 구조다.
8 선형결합과 선형방정식의 연결
선형결합은 선형방정식 풀기와 본질적으로 같은 문제다.
\[c\begin{bmatrix} 2 \\ -1 \end{bmatrix} + d\begin{bmatrix} -1 \\ 2 \end{bmatrix} = \begin{bmatrix} 1 \\ 0 \end{bmatrix}\]
를 푸는 것은 두 방정식을 푸는 것과 동일하다:
\[2c - d = 1\] \[-c + 2d = 0\]
이 연립방정식의 해 \(c = 2/3, d = 1/3\) 이 선형결합의 계수다.
열 그림(Column Picture): 계수 \(c\) 와 \(d\) 를 찾는 문제는 “벡터 \(\mathbf{b} = (1, 0)^\top\) 이 두 열벡터 \((2, -1)^\top\) 와 \((-1, 2)^\top\) 의 어떤 선형결합인가?”라는 질문이다. 이것이 나중에 배울 Ax=b의 열 관점(column picture)이다 (mit-01 포스트 참조).
9 Span과 선형결합
벡터 집합 \(\{\mathbf{v}_1, \ldots, \mathbf{v}_k\}\) 의 모든 가능한 선형결합의 집합을 이 벡터들의 생성(span)이라 한다.
\[\text{span}\{\mathbf{v}_1, \ldots, \mathbf{v}_k\} = \{c_1\mathbf{v}_1 + \cdots + c_k\mathbf{v}_k \mid c_1, \ldots, c_k \in \mathbb{R}\}\]
“\(\mathbf{b}\) 가 벡터들의 span 안에 있다”는 말은 \(\mathbf{b}\) 를 그 벡터들의 선형결합으로 표현할 수 있다는 뜻이다. 이것이 선형방정식 \(A\mathbf{x} = \mathbf{b}\) 의 해가 존재하는 조건이다: \(\mathbf{b} \in \text{span}(\text{열벡터들})\).
10 벡터 방정식: 직선과 평면의 파라메트릭 표현
선형결합의 기하학을 방정식 형태로 쓰면 벡터 방정식(vector equation) 또는 파라메트릭 표현이 된다. 이는 Ch.3 §3.5 완전해 \(\mathbf{x} = \mathbf{x}_p + \mathbf{x}_n\) 의 기초 형태이기도 하다.
10.1 원점을 지나는 직선
\(y = mx\) 위의 한 점 \((1, m) = \mathbf{v}\) 을 잡으면, 직선 위의 모든 점은 \(\mathbf{v}\) 의 스칼라 배로 표현된다.
\[\mathbf{x} = t\mathbf{v}, \quad t \in \mathbb{R}\]
파라미터 \(t\) 가 실수 전체를 움직일 때 \(\mathbf{x}\) 가 직선 전체를 그린다. 이것이 1개 벡터의 span이 직선이라는 사실의 방정식 형태이다.
10.2 일반 직선
\(y = mx + b\) 는 원점을 지나는 직선을 \(b\) 만큼 평행이동한 것이다. 직선 위의 한 점 \(\mathbf{p}_0\) (예: \((0, b)\))를 출발점으로 잡고 방향 벡터 \(\mathbf{v}_1 = (1, m)\) 을 더하면:
\[\mathbf{x} = \mathbf{p}_0 + t\mathbf{v}_1\]
중요 관찰: \(\mathbf{p}_0\) 는 “직선 위의 아무 한 점”이면 족하다. 수직 이동일 필요 없다. \(\mathbf{v}_1\) 도 “직선과 평행한 아무 비영벡터”이면 된다. 이 자유도가 곧 §Reparametrization의 이유이기도 하다.
예시: \(y = 3x + 2\) 위 두 점 \((1, 5), (2, 8)\) 을 잡으면:
\[\mathbf{x} = \mathbf{p}_0 + t\mathbf{v}_1 = (1, 5) + t(1, 3)\]
10.3 평면
평면은 1개 벡터로는 부족하다. 두 벡터의 span이 평면을 만들려면 두 벡터가 선형독립이어야 한다. 평행한 두 벡터 \(\mathbf{v}_1 \parallel \mathbf{v}_2\) 라면 \(\mathbf{v}_2 = k\mathbf{v}_1\) 이어서:
\[a\mathbf{v}_1 + b\mathbf{v}_2 = (a + bk)\mathbf{v}_1\]
가 되어 여전히 직선만 그린다.
평면 위 한 점 \(\mathbf{p}_0\) 와 평행하지 않은 두 벡터 \(\mathbf{v}_1, \mathbf{v}_2\) 가 있으면:
\[\mathbf{x} = \mathbf{p}_0 + t_0\mathbf{v}_1 + t_1\mathbf{v}_2\]
예시: \(x + 2y + 3z = 4\) 위 세 점 \((1, 1, \tfrac{1}{3}), (1, 2, -\tfrac{1}{3}), (0, 0, \tfrac{4}{3})\) 을 잡아 방향 벡터 두 개를 구하면:
\[\mathbf{x} = (1, 1, \tfrac{1}{3}) + t_0(0, 1, -\tfrac{2}{3}) + t_1(-1, -1, 1)\]
10.4 연결 지점
- Ch.2 연립방정식: 위 표현을 특수해 + 영공간 벡터들의 선형결합으로 보면 \(\mathbf{x}_p + c_1\mathbf{x}_{n_1} + c_2\mathbf{x}_{n_2} + \cdots\) 형태가 된다.
- Ch.3 §3.5: \(A\mathbf{x} = \mathbf{b}\) 의 완전해가 정확히 이 파라메트릭 형태이다.
- Ch.4 직교성: \(\mathbf{v}_1, \mathbf{v}_2\) 가 직교하면 평면 위 점의 좌표 해석이 단순해진다.
11 볼록결합과 아핀결합 (연장선)
선형결합의 제약을 바꾸면 다른 개념이 나온다.
| 결합 유형 | 계수 조건 | 기하학적 의미 |
|---|---|---|
| 선형결합 | 제약 없음 | 직선/평면/공간 전체 |
| 아핀결합 | \(\sum c_i = 1\) | 점들을 지나는 초평면 |
| 볼록결합 | \(c_i \geq 0\), \(\sum c_i = 1\) | 두 점 사이의 선분 (삼각형, 다면체) |
예시: \(\mathbf{u}\), \(\mathbf{v}\), \(\mathbf{w}\) 의 볼록결합 \(c\mathbf{u} + d\mathbf{v} + e\mathbf{w}\) (\(c, d, e \geq 0\), \(c + d + e = 1\))는 세 꼭짓점 \(\mathbf{u}\), \(\mathbf{v}\), \(\mathbf{w}\) 로 이루어진 삼각형 내부를 채운다. 머신러닝의 볼록 최적화, 베이즈 추론의 혼합 모형에서 이 개념이 등장한다.
12 응용 분야
| 분야 | 선형결합의 역할 | 구체적 예시 |
|---|---|---|
| 머신러닝 | 모델 출력 = 입력의 선형결합 | \(\hat{y} = w_1x_1 + \cdots + w_p x_p\) |
| 딥러닝 | 각 레이어 = 선형결합 + 활성화 함수 | \(\mathbf{z} = W\mathbf{x} + \mathbf{b}\) |
| 자연어 처리 | 단어 임베딩의 의미 합성 | king - man + woman ≈ queen |
| 컴퓨터 그래픽스 | 색 혼합, 보간(interpolation) | RGB 혼합 = 기저색의 선형결합 |
| 통계학 | 회귀 모형의 예측값 | \(\hat{y} = \beta_0 + \beta_1 x_1 + \cdots\) |
| 신호처리 | 푸리에 분해 | 신호 = 사인파의 선형결합 |
13 코드 예시
13.1 Step 1: Low-level 구현
from typing import Union
Scalar = Union[int, float]
Vector = list[float]
def add(v: Vector, w: Vector) -> Vector:
"""벡터 덧셈: 성분별 합산"""
assert len(v) == len(w), "차원이 같아야 한다"
return [vi + wi for vi, wi in zip(v, w)]
def scalar_mul(c: Scalar, v: Vector) -> Vector:
"""스칼라 곱: 각 성분에 c를 곱한다"""
return [c * vi for vi in v]
def linear_combination(coefficients: list[Scalar], vectors: list[Vector]) -> Vector:
"""
선형결합: c1*v1 + c2*v2 + ... + ck*vk
모든 계수-벡터 쌍을 스칼라 곱한 뒤 합산한다.
"""
assert len(coefficients) == len(vectors), "계수와 벡터 수가 같아야 한다"
n = len(vectors[0])
result = [0.0] * n
for c, v in zip(coefficients, vectors):
scaled = scalar_mul(c, v)
result = add(result, scaled)
return result
# 예시 1: 두 벡터의 선형결합
v = [1.0, 1.0, 0.0]
w = [0.0, 1.0, 1.0]
print("v + w =", add(v, w)) # [1, 2, 1]
print("2v - w =", linear_combination([2, -1], [v, w])) # [2, 1, -1]
print("v =", linear_combination([1, 0], [v, w])) # [1, 1, 0]
# 예시 2: span을 격자점으로 시각화
combinations = []
for c in [-1, 0, 1, 2]:
for d in [-1, 0, 1, 2]:
comb = linear_combination([c, d], [v, w])
combinations.append((c, d, comb))
for c, d, result in combinations[:5]:
print(f" c={c}, d={d}: {c}*v + {d}*w = {result}")13.2 Step 2: NumPy 구현
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# --- 기본 연산 ---
v = np.array([1, 1, 0], dtype=float)
w = np.array([0, 1, 1], dtype=float)
add_vw = v + w # [1, 2, 1]
scaled_2v = 2 * v # [2, 2, 0]
comb = 2 * v - w # [2, 1, -1]
print("v + w =", add_vw)
print("2v =", scaled_2v)
print("2v - w=", comb)
# --- 선형결합이 만드는 평면 시각화 ---
C = np.linspace(-2, 2, 15)
D = np.linspace(-2, 2, 15)
CC, DD = np.meshgrid(C, D)
# 각 (c, d) 쌍에서 c*v + d*w 계산
v2 = np.array([1, 1, 0])
w2 = np.array([0, 1, 1])
# 결과 벡터의 3개 성분
X = CC * v2[0] + DD * w2[0] # = CC (v2[0]=1, w2[0]=0)
Y = CC * v2[1] + DD * w2[1] # = CC + DD
Z = CC * v2[2] + DD * w2[2] # = DD
fig = plt.figure(figsize=(7, 5))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, alpha=0.4, color='steelblue')
# 두 기저벡터 화살표 표시
origin = [0, 0, 0]
ax.quiver(*origin, *v2, color='red', length=1, label=r'$\mathbf{v}$', arrow_length_ratio=0.2)
ax.quiver(*origin, *w2, color='green', length=1, label=r'$\mathbf{w}$', arrow_length_ratio=0.2)
ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('z')
ax.set_title(r'모든 $c\mathbf{v} + d\mathbf{w}$ 가 만드는 평면')
ax.legend()
plt.tight_layout()
plt.show()
# --- span 포함 여부 확인 ---
def in_span_2d(target: np.ndarray, v: np.ndarray, w: np.ndarray, tol: float = 1e-9) -> tuple[bool, float, float]:
"""
target = c*v + w*d 를 만족하는 c, d 가 존재하는지 최소제곱으로 확인한다.
A @ [c, d] = target 을 풀어 잔차가 0이면 span 내부에 있다.
"""
A = np.column_stack([v, w])
coeffs, residuals, rank, _ = np.linalg.lstsq(A, target, rcond=None)
approx = A @ coeffs
is_in_span = np.linalg.norm(approx - target) < tol
return is_in_span, coeffs[0], coeffs[1]
b1 = np.array([1.0, 2.0, 1.0]) # 평면 내부 (c=1, d=1)
b2 = np.array([1.0, 2.0, 3.0]) # 평면 외부
for b, label in [(b1, 'b1=(1,2,1)'), (b2, 'b2=(1,2,3)')]:
in_s, c, d = in_span_2d(b, v2.astype(float), w2.astype(float))
print(f"{label}: span 내부={in_s}, c≈{c:.3f}, d≈{d:.3f}")13.3 Step 3: 선형결합의 계수 역추적
# cv + dw = b 를 만족하는 c, d 를 구하는 문제
# 이것이 나중에 Ax = b 풀기의 기초가 된다
import numpy as np
v = np.array([2.0, -1.0])
w = np.array([-1.0, 2.0])
b = np.array([1.0, 0.0])
# 방법 1: np.linalg.solve (2x2 연립방정식)
A = np.column_stack([v, w]) # A = [v | w], 2x2 행렬
coeffs = np.linalg.solve(A, b)
c, d = coeffs
print(f"c = {c:.4f}, d = {d:.4f}") # c = 2/3, d = 1/3
print(f"검증: {c:.4f}*v + {d:.4f}*w = {c*v + d*w}") # [1, 0] 확인14 핵심 요약
선형결합 \(c_1\mathbf{v}_1 + \cdots + c_k\mathbf{v}_k\) 에서 알아야 할 세 가지:
- 대수: 성분별 계산 — \(k\) 차원이든 \(n\) 차원이든 동일한 규칙
- 기하: \(k\) 개의 독립 벡터는 \(k\) 차원 부분공간을 생성한다 (직선 → 평면 → 공간)
- 방정식: “이 벡터들로 \(\mathbf{b}\) 를 만들 수 있는가?” = Ax = b 의 해 존재 여부
이 세 관점이 Ch.2(소거법), Ch.3(부분공간), Ch.4(직교성)로 이어지는 연결고리다.
15 관련 주제
선행 지식
후속 주제
- Ch.1 §1.2 — Lengths and Dot Products — 내적과 각도의 심화
- Lecture 1 — 선형 방정식의 기하학적 해석 — Row/Column Picture
다른 카테고리 연결
- Ch.3 — 벡터 공간과 부분공간 — span과 부분공간의 공식 정의