[chapter 1] 벡터, 파트1 : 벡터와 벡터의 기본 연산
1. 벡터 크기
벡터의 크기(기하학적 길이 또는 norm)는 벡터의 꼬리부터 머리까지의 거리이다.
크기는 표준 유클리드 거리 공식으로 구한다.
벡터 크기(노름)는 벡터 양 옆에 이중 수직 막대로 표시한다.( $\left\| v\right\|$ )
$$ \left\| v\right\| = \sqrt{\sum_{i=1}^{n}v_{i}^{2}} $$
- 수학에서의 벡터의 차원은 벡터의 원소 수이고 길이는 기하학적인 거리이다.
- 파이썬에서는 함수 len()은 배열의 차원을 반환하고, np.norm()은 기하학적 길이(크기)를 반환한다.
v = np.array([1,2,3,7,8,9])
v_dim = len(v) # 수학의 차원
v_mag = np.linalg.norm(v) # 수학적 크기, 길이 또는 노름
2. 단위벡터
단위벡터(unit vector)는 기하학적인 길이가 1인 벡터를 말하며, 회전 행렬 등 응용 분야에서 사용된다.
단위벡터는 $\left\| v\right\| = 1$ 로 정의한다.
모든 비단위벡터는 하나의 단위벡터와 연관되어 있다. 즉, 비단위벡터와 같은 방향의 단위벡터를 만들 수 있다.
(영벡터는 길이는 0이지만 연관된 단위벡터가 없다 . 0이 아닌 길이로 늘릴 수 없기 때문)
연관된 단위벡터는 벡터 노름의 역수를 스칼라 곱셈하면 구할 수 있다.
$$ \widehat{v} = \frac{1}{\left\| v\right\|}v $$
3. 벡터-내적
내적(dot product)은 선형대수학에서 가장 중요한 연산이다.
두 벡터 사이의 내적은 이 책에서는 $a^{T}a$로 표기한다. ( a∙b 나 <a, b>로도 나타낸다)
내적은 하나의 숫자로 두 벡터 사이의 관계를 나타낸다.
내적을 계산하는 법
내적을 계산하려면 두 벡터에서 대응되는 원소끼리 곱한 다음 모든 결과를 더한다.
내적은 동일한 차원의 두 벡터 사이에서만 성립한다.
$$ \partial = \sum_{i=1}^{n}a_{i}b_{i} $$
파이썬에서는 아래와 같이 구현한다.
v = np.array([1,2,3,4])
w = np.array([5,6,7,8])
np.dot(v,w) # np.int64(70)
# 벡터에 스칼라를 곱하면 내적도 그만큼 커진다.
s = 10
np.dot(s*v,w) # np.int64(700)
내적의 의미
내적은 두 벡터 사이의 유사성 또는 매핑의 척도로 해석할 수 있다.
내적의 크기는 데이터의 단위에 따라 달라지는데, 이러한 단위의 차이는 정규화 계수로 제거할 수 있다.
(예. 그램과 센티미터로 측정된 데이터의 내적이 미터로 측정된 내적보다 크다.)
실제로 두 변수 사이의 정규화된 내적을 피어슨 상관계수(Pearson correlation co-efficient)라고 한다.
🤔궁금했던 점 with ChatGPT
내적은 길이가 커지면 커지는 값인데, 이걸로 어떻게 유사도를 알 수 있는거지?가 궁금했다.
벡터의 내적을 기하학적으로 구하면 아래와 같이 구할 수 있다.(a, b는 각 벡터의 길이, $ \theta$는 두 벡터 사이의 각도)
$$ a\bullet b=\left | a\right |\left | b\right |cos\theta $$
즉, 내적은 두 벡터의 길이와 그 사이 각도의 관계를 담고 있는 값이다.
- 두 벡터가 완전히 같은 방향이면 $\theta=0^{\circ }$ , $cos(0^{\circ })=1$ 이므로 내적이 최댓값
- 두 벡터가 완전히 다른 방향이면 $\theta=180^{\circ }$ , $cos(180^{\circ })=-1$ 이므로 내적이 음수
- 두 벡터가 서로 수직이면 $\theta=90^{\circ }$ , $cos(90^{\circ })=0$ 이므로 내적이 0
즉, 아래처럼 정리할 수 있다.
- 크기가 같고 방향이 비슷할수록 내적 값이 크다.
- 방향이 완전히 다르면(수직이면) 내적이 0
- 반대 방향이면 내적이 음수
따라서 내적은 두 벡터가 얼마나 같은 방향을 향하는가를 나타내는 유사성의 척도로 쓰인다.
여기서 한 가지 더, 벡터 원소 값이 단순히 커지면 내적이 커지는데 그럼 유사성을 나타낸다고 볼 수 없지않나?가 궁금했다.
그래서 '비슷하다'는 방향의 유사성을 알고 싶을 때는, 내적 자체를 보지 않고 크기의 영향을 제거한 버전을 쓴다.
이걸 코사인 유사도라고 한다.
4. 내적의 분배 법칙
$$ a^{T}(b+c)= a^{T}+b^{T} $$
벡터 덧셈의 내적은 벡터-내적의 덧셈과 같다.
아래는 분배 법칙을 파이썬으로 구현한 코드이다.
a = np.array([0,1,2])
b = np.array([3,5,8])
c = np.array([13,21,34])
# 내적 분배 법칙
res1 = np.dot(a, b+c)
res2 = np.dot(a,b) + np.dot(a,c)
print(f'res1: {res1}') # res1: 110
print(f'res2: {res2}') # res2: 110
5. 그 외 벡터 곱셈
아다마르곱
아다마르곱(Hardamard product)은 원소별로 곱하는 것을 뜻한다. 즉, 두 벡터의 대응되는 각 원소를 곱하면 된다.
곱의 결과는 두 벡터와 같은 차원의 벡터이다.
$$ \begin{bmatrix}
5 \\
4 \\
8 \\
2
\end{bmatrix} \odot \begin{bmatrix}
1 \\
0 \\
.5 \\
-1
\end{bmatrix} = \begin{bmatrix}
5 \\
0 \\
4 \\
-2
\end{bmatrix}$$
파이썬에서 별표는 두 벡터나 행렬에서 원소 사이의 곱을 나타낸다.
a = np.array([5,4,8,2])
b = np.array([1,0,.5,-1])
a*b # array([ 5., 0., 4., -2.])
아다마르곱은 여러 스칼라를 곱할 때 편리하다.
외적
외적은 열벡터와 행벡터를 이용해 행렬을 만든다.
외적 행렬의 각 행은 행벡터 스칼라에 대응되는 열벡터 원소를 곱한 것이고, 외적 행렬의 각 열은 열벡터 스칼라에 대응되는 행벡터 원소를 곱한 것이다.
$$ \begin{bmatrix}
a \\
b \\
c
\end{bmatrix} \begin{bmatrix}
d & e \\
\end{bmatrix} = \begin{bmatrix}
ad & ae \\
bd & be \\
cd & ce \\
\end{bmatrix}$$
외적은 내적과 달리 스칼라가 아닌 행렬을 생성한다.
외적의 두 벡터는 차원이 달라도 되지만, 내적의 두 벡터는 차원이 같아야 한다.
외적은 $vw^{T}$로 나타낸다.(내적은 $v^{T}w$)
브로드캐스팅은 덧셈, 곱셈, 나눗셈 등 산술 연산을 벡터로 확장한 일반적인 코딩 연산이나, 외적은 두 벡터를 곱하는 특수한 수학적 기법이다.
파이썬으로는 아래처럼 구한다.
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
outer_result = np.outer(a, b)
print(outer_result)
# [[ 4 5 6]
# [ 8 10 12]
# [12 15 18]]'수학 > 선형대수' 카테고리의 다른 글
| [개발자를 위한 실전 선형대수학] Chapter 1 연습문제 (0) | 2025.11.16 |
|---|---|
| [개발자를 위한 실전 선형대수학] 1.6. 직교벡터 분해 (0) | 2025.11.13 |
| [개발자를 위한 실전 선형대수학] 1.2 벡터 연산 (0) | 2025.11.11 |
| [개발자를 위한 실전 선형대수학] 1.1 NumPy로 벡터 생성 및 시각화하기 (0) | 2025.11.10 |
| [한 걸음씩 알아가는 선형대수학] 1.1 연립일차방정식 (0) | 2025.11.05 |