선형대수학
선형대수학(linear algebra): 벡터 공간, 벡터, 선형 변환, 행렬, 연립 선형 방정식 등을 연구하는 대수학의 한 분야이다. 현대 선형대수학은 그중에서도 벡터 공간이 주 연구 대상이다.
선형대수학은 수학, 통계, 운용 과학, 데이터 과학 및 머신러닝의 여러 응용 분야에 기초를 형성하는데, 머신러닝과 통계 라이브러리를 사용하면 선형대수학을 무조건 배워야 하는 것은 아니지만 이러한 라이브러리 이면의 작동 방식에 대한 직관을 기르고, 데이터를 더 효율적으로 다루려면 선형대수학의 기본을 아는 것이 좋다.
벡터(vector)란 무엇인가?
벡터는 공간상에서 특정 방향과 길이를 가진 화살표이며 종종 데이터의 한 조각을 나타낸다. 벡터는 선형대수학의 핵심 구성요소로 여기에는 행렬과 선형 변환도 포함된다. 벡터의 기본 형태에는 위치에 대한 개념이 없으므로 항상 꼬리가 데카르트 좌표계의 원점(0, 0)에서 시작한다.
벡터의 용도는 무수히 많다.
- 물리학: 방향과 크기로 간주
- 수학: xy 평면에서의 방향과 스케일 (어떤 움직임과 같은 개념 표시)
- 컴퓨터과학: 데이터를 저장하는 숫자 배열
벡터의 시각적 이해 없이는 선형 종속 및 행렬식과 같은 기본적인 선형대수학 개념을 이해할 수 없으므로, 벡터를 난해한 숫자 그리드로 생각하지 않도록 시각적인 측면을 잊지 말아야 한다.
★ 데카르트 좌표계(Cartesian coordinate system): 임의의 차원의 유클리드 공간(혹은 좀 더 일반적으로 내적 공간)을 나타내는 좌표계 중 하나이다. 천장을 날아다니며 옮겨붙는 파리를 통해 영감을 얻어 해당 좌표계를 발명한 프랑스의 철학자이자 수학자인 르네 데카르트의 이름을 따서 지어졌다.
2차원 데카르트 좌표계는 좌표평면(coordinate plane), 3차원 데카르트 좌표계는 좌표공간(coordinate space)이라고도 한다.
벡터는 수학적으로 다음과 같이 선언한다.
[파이썬으로 벡터 선언하기]
파이썬 리스트와 같은 간단한 컬렉션을 사용해 벡터를 선언한다. 하지만 벡터로 수학 연산을 수행할 때, (특히 머신러닝 등) 일반 파이썬보다 더 효율적인 넘파이 라이브러리를 사용하는 것이 좋다. 물론, 심파이를 사용해 선형대수학 연산을 수행할 수도 있으나, 실전에서는 넘파이를 더 많이 사용한다.
넘파이로 벡터를 선언하려면 넘파이의 array() 함수를 사용한 숫자 컬렉션을 전달한다.
# 파이썬 리스트로 벡터 선언하기
v_1 = [3, 2]
print(v_1)
# 넘파이를 활용하는 것이 더 효율적
import numpy as np
v_2 = np.array([3, 2])
print(v_2)
<여러 가지 벡터 시각화 예시>
# 벡터 시각화 예시
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
plt.arrow(0, 0, 3, 4, head_width = 0.1, head_length = 0.5, color = 'red')
plt.show
음수 방향의 벡터는 나중에 벡터를 결합할 때 더하지 않고 빼야 한다.
◆ 3차원 벡터
벡터는 2차원 이상을 가질 수 있다. 다음은 x, y, z 축을 따라 3차원 벡터를 선언한다.
[파이썬에서 넘파이로 3차원 벡터 선언하기]
# 파이썬에서 넘파이로 3차원 벡터 선언하기
import numpy as np
v = np.array([4, 1, 2]) # x, y, z
print(v)
3차원 이상의 벡터를 파이썬에서 선언하는 것 역시 간단하다.
# 5차원 벡터
import numpy as np
v = np.array([6, 1, 5, 8, 3])
print(v)
◆ 덧셈과 결합
벡터는 공간상의 이동처럼 방향과 크기를 표현한다.
벡터 덧셈(vector addition)을 통해 두 벡터의 이동을 하나의 벡터로 효과적으로 결합한다.
두 개의 벡터가 있다고 가정할 경우, 이를 더하는 방법은 수치적으로는 간단하다.
이를 파이썬에서 계산하면
[파이썬에서 넘파이로 두 개의 벡터 더하기]
#파이썬에서 넘파이로 두 개의 벡터 더하기
from numpy import array
v = array([3,2])
w = array([2,-1])
# 벡터 더하기
v_plus_w = v + w
# 출력하기
print(v_plus_w)
교환 법칙이 성립하여 덧셈 기호 전에 v 를 놓는지 w를 놓는지는 중요하지 않고, 연산 순서도 중요하지 않다. (v 와 w 를 바꿔도 값은 동일하다)
◆ 스케일링(scaling)
스케일링은 벡터의 길이를 늘이거나 줄이는 것이다. 벡터에 스칼라라는 값을 곱하거나 스케일링해서 벡터를 늘이거나 줄인다.
★ 스칼라(scalar): 벡터 공간에서 벡터를 곱할 수 있는 양
[넘파이로 숫자 크기 조정하기]
# 넘파이로 숫자 크기 조정하기
from numpy import array
v = array([3, 1])
#벡터 스케일링
scaled_v = 2.0 * v
print(scaled_v)
물론, 절반으로 축소(0.5 곱하기) 할 수도 있다.
from numpy import array
v = array([3, 1])
#벡터 스케일링
scaled_v = 0.5 * v
print(scaled_v)
벡터의 크기를 조정해도 벡터의 방향은 변하지 않고 크기만 변한다. 다만, 벡터에 음수를 곱하면 벡터의 방향이 뒤집혀버린다.
# 벡터 시각화 예시
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
plt.arrow(0, 0, 3, 1, head_width = 0.1, head_length = 0.5, color = 'red')
plt.arrow(0, 0, 1.5, 0.5, head_width = 0.1, head_length = 0.5, color = 'blue')
plt.arrow(0, 0, -1.5, -0.5, head_width = 0.1, head_length = 0.5, color = 'green')
plt.show
하지만 음수로 스케일을 조정해도 여전히 같은 선상에 존재하므로 실제로 방향이 바뀌지는 않았다. 이는 선형 종속이라는 개념으로 이어진다.
◆ 스팬과 선형 종속
벡터를 더하고 크기를 조정하는 이 두가지 연산을 사용하면 두 벡터를 결합하고 크기를 조정해 원하는 결과 벡터를 만들 수 있다. 다른 두 방향으로 고정된 v와 w 의 스케일을 변경하고 더하면 새로운 벡터 v+w 를 얼마든지 만들 수 있다.
여기에서도 음수 스칼라로 뒤집는 것만 빼고는 v와 w 방향이 고정되어 있지만, 스케일링을 사용해 v+w로 어떤 벡터도 만들 수 있다. 이렇게 가능한 벡터의 전체 공간을 스팬(span) 이라고 하는데, 대부분의 경우 스팬은 두 벡터를 스케일링하고 더해 벡터를 무한하게 만들 수 있다.
서로 방향이 다른 벡터 두 개가 있을 때, 두 벡터는 선형 독립이며 스팬이 무한하다.
그러나 만약 두 벡터가 같은 방향으로 존재하거나 같은 선상에 존재하면, 이러한 벡터를 조합해도 같은 선 위에 고정되므로 스팬이 제한된다. 스케일을 어떻게 조정하든 만들어진 벡터도 같은 선 위에 놓인다. 이를 선형 종속(linearly dependent)이 된다고 한다.
앞의 이미지를 보면, 두 벡터가 동일한 기본 선 위에 있기 때문에 스케일링을 통해 여러 가지 새로운 벡터를 만들 수 없다.
두 벡터가 선형 종속인지 독립인지 신경써야 하는 이유는 선형 종속이면 많은 문제가 풀기 어렵거나 풀 수 없기 때문이다. 하지만 선형 독립이면 두 개 이상의 벡터에서 필요한 어떤 벡터도 만들어내는 유연성 덕분에 해를 쉽게 구할 수 있다.
선형 변환(linear transformation)
방향이 고정된 두 개의 벡터를 더하고 스케일링을 조정해 다른 결합 벡터를 얻는 이 개념은 선형 종속의 경우를 제외하면 원하는 방향과 길이를 가질 수 있다. 따라서 함수와 같은 방식으로 한 벡터를 다른 벡터로 변환하는 선형 변환을 떠올려 볼 수 있다.
◆ 기저 벡터
특정한 벡터 공간을 스팬(구성)해주는 선형 결합 벡터들의 최소 개수, 모든 벡터를 만들거나 변환하기 위한 구성 요소.
벡터 공간 V의 basis는 V라는 공간을 채울 수 있는, 선형 관계에 있지 않은 벡터들의 모음이다. 즉, 서로 독립인 벡터들을 의미하며, 다른 벡터의 변환을 설명하는 데 사용되는 벡터이다. 일반적으로 길이가 1이고 서로 수직이며 양의 방향을 가리킨다.
◆ 행렬(matrix)
벡터의 모음. 여러 개의 행과 열을 가질 수 있으며 데이터를 묶는 편리한 방법이다.
i(i햇)과 j(j햇)을 스케일링하고 더하면 어떤 벡터도 만들 수 있다.
예를 들어, 길이가 1인 벡터 v가 [3, 2] 위치에 도달하길 원하여 i을 3배, j을 2배로 늘이면 v는 어떻게 될까?
먼저 개별적으로 벡터의 스케일을 조정한다. (벡터 v는 i과 j의 덧셈으로 구성된다.)
이 두 방향으로 늘이면 v는 i과 j을 따라 늘어날 것이며, 이를 선형 변환이라고 한다. 즉, 기저 벡터의 움직임을 이용해 벡터를 늘이고, 줄이고, 비틀고, 회전하는 것을 말한다.
- 벡터의 크기 조정: 늘이남, 줄어듦
- 회전: 벡터 공간 돌림
- 반전: 벡터 공간을 뒤집어 i과 j의 위치를 바꿈
- 전단: 특정 방향의 직선과의 거리에 비례하여 각 포인트를 이동 시킴
비선형 변환을 사용하면 직선이 아닌 휘거나 구불구불한 변환을 만들기 때문에 사용할 수 없다는 점에 유의.
<도움이 되는 글>
다음 내용
[출처]
개발자를 위한 필수 수학
위키백과
도토리커피한잔 - 네이버 블로그
yuns_u.log - velog
서윤아빠의 Space of Thinking - 네이버 블로그
'[파이썬 Projects] > <파이썬 - 수학 | 통계학>' 카테고리의 다른 글
[개발자를 위한 수학] 선형대수학: 연립 방정식과 역행렬 (0) | 2024.10.07 |
---|---|
[개발자를 위한 수학] 선형대수학: 행렬 (3) | 2024.10.07 |
[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.3)-2 (1) | 2024.10.07 |
[파이썬+통계학] 현대통계학 연습문제 파이썬 구현(ch.3)-1 (1) | 2024.10.06 |
[개발자를 위한 수학] 추론통계: 가설 검정 (+파이썬) (0) | 2024.10.06 |