선형대수 · 텐서와 행렬
기말 범위 9–10주차 요약. 데이터를 담는 그릇인 텐서부터, 벡터의 크기·내적·사영·외적, 그리고 정방행렬의 행렬식·역행렬·고윳값까지 정리한다.
스칼라, 벡터, 행렬, 텐서
- 스칼라scalar는 하나의 성분component만을 가진 수치이다.
, , 등이 스칼라이며, 관습적으로 처럼 표기한다. - 벡터vector는 여러 성분으로 이루어진 배열array이다. 명시하지 않는 한 벡터는 열벡터column vector를 의미하며
로 표기하고, 번째 성분을 로 쓴다. 행과 열을 바꾸는 연산( )을 전치transpose라 한다.
- 기하적으로 벡터의 각 성분은 좌표축을 따라 나아간 거리로 해석된다. 기계학습에서는 각 성분이 데이터의 특징feature을 나타내며, 이런 벡터를 특징 벡터feature vector라 한다. 가능한 특징들이 모인 집합을 특징 공간feature space이라 한다.
- 행렬matrix은 수치들의 2차원 배열이다.
로 표기하고, 번째 행· 번째 열의 원소를 로 쓴다. 열벡터는 열이 하나, 행벡터는 행이 하나인 행렬로 볼 수 있다. - 랭크rank가 셋 이상인 수학적 객체를 텐서tensor라 한다.
텐서의 랭크
스칼라는 랭크 0-텐서, 벡터는 랭크 1-텐서, 행렬은 랭크 2-텐서이다. 즉 텐서는 스칼라·벡터·행렬을 일반화한 개념이다.
텐서 산술 연산
크기와 단위 벡터
- 기하적으로 벡터는 방향과 길이를 가지며, 그 길이를 크기magnitude라 한다.
개의 성분을 가진 벡터의 크기는 피타고라스의 정리와 연관되며 다음과 같다.
- 벡터를 그 크기로 나누면 방향은 같고 크기가
인 단위 벡터unit vector가 된다.
내적과 사영
- 두 벡터
, 의 내적inner product, dot product은 다음과 같이 정의된다( 는 두 벡터 사이의 각).
- 각도가
이면 내적은 이고, 이때 두 벡터가 직교orthogonal한다고 한다. 내적은 교환법칙·분배법칙은 성립하나 결합법칙은 성립하지 않는다. - 사영projection은 한 벡터가 다른 벡터 방향으로 얼마나 나아가는지를 계산한다.
에 대한 의 사영은 다음과 같으며, 직교인 벡터들의 사영은 항상 이다.
외적과 성분별 곱
- 내적은 스칼라지만 외적outer product은 행렬이 되며, 두 벡터의 차원이 달라도 정의된다. 성분이
개인 와 개인 의 외적( )은 다음과 같다.
- 차원이 같은 두 행렬
, 에 대해 성분별 곱인 아다마르 곱Hadamard product 는 로 정의된다.
python
import numpy as np
x = np.array([4.0, 1.0])
y = np.array([3.0, 4.0])
dot = x @ y # 내적 x·y
mag_x, mag_y = np.linalg.norm(x), np.linalg.norm(y)
cos_t = dot / (mag_x * mag_y) # cosθ = x·y / (||x|| ||y||)
proj = (dot / (y @ y)) * y # y에 대한 x의 사영
outer = np.outer(x, y) # 외적 xy^T (행렬)
print(f"내적 x·y = {dot:.1f}")
print(f"||x||={mag_x:.3f}, ||y||={mag_y:.3f}, cosθ={cos_t:.3f}")
print(f"사영 proj_y x = {proj}")
print("외적 x y^T =")
print(outer)행렬곱과 정방행렬
- 행렬곱
는 왼쪽 행렬의 열 수와 오른쪽 행렬의 행 수가 같아야 하며, 의 행벡터를 의 열벡터와 내적한 것이다. 결과 는 이다. 행렬곱은 결합·분배법칙은 만족하나 교환법칙은 성립하지 않는다( ). - 행렬에 열벡터를 곱하면 또 다른 열벡터가 나온다. 즉 행렬은 한 공간의 점을 다른 공간으로 사상mapping하는 수단이다. 행과 열의 크기가
으로 같은 정방행렬square matrix은 에서 으로의 사상이다. - 행렬 변환
와 이동translation 로 직선을 직선으로 보내는 상관변환affine transformation 를 정의할 수 있다. 뉴럴 네트워크의 각 층이 바로 상관변환이다. - 정방행렬에서는 대각합trace
과 거듭제곱 이 정의된다. 대각 성분이 이고 나머지가 인 단위행렬identity matrix 은 행렬 곱셈의 항등원이다.
행렬식과 역행렬
- 정방행렬의 행렬식determinant은 행렬을 하나의 스칼라로 사상하는 함수
이다. 주요 성질은 다음과 같다.- 모두
인 행/열이 있거나 동일한 두 행이 있으면 . - 삼각행렬·대각행렬이면
이고, 단위행렬은 . , .
- 모두
- 소행렬minor matrix
( 행· 열 제거)와 여인수cofactor 를 이용한 여인수 전개cofactor expansion로 행렬식을 구한다.
역행렬과 특이행렬
행렬식의 주요 용도는 역행렬inverse matrix의 존재 판정이다. 역행렬
python
import numpy as np
A = np.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 10.0]]) # det≠0 이 되도록 (7,8,10)
det = np.linalg.det(A)
inv = np.linalg.inv(A)
print(f"det(A) = {det:.4f} (0이 아니므로 비특이 → 역행렬 존재)")
print("A^-1 =")
print(np.round(inv, 4))
print("A·A^-1 = I 확인:", np.allclose(A @ inv, np.eye(3)))
print(f"det(A^-1) = {np.linalg.det(inv):.4f} vs 1/det(A) = {1/det:.4f}")특수 정방행렬과 부호
이면 대칭행렬symmetric matrix, 이면 직교행렬orthogonal matrix이다. 직교행렬은 이고 이다.- 임의의
에 대해 대칭행렬 가 이면 양의 정부호positive definite, 이면 양의 준정부호positive semidefinite이다. 부등호를 뒤집으면 음의 (준)정부호가 된다.
고윳값과 고유벡터
- 정방행렬
는 벡터를 같은 공간의 다른 벡터로 사상한다. 영벡터가 아닌 와 스칼라 가
를 만족하면,
특성 방정식
python
import numpy as np
A = np.array([[2.0, 0.0],
[0.0, 3.0]]) # 대각행렬: 고윳값이 대각 성분 2, 3
vals, vecs = np.linalg.eig(A)
print("고윳값 :", np.round(vals, 4))
print("고유벡터(열):")
print(np.round(vecs, 4))
for i in range(len(vals)):
v = vecs[:, i]
lhs, rhs = A @ v, vals[i] * v # Av 와 λv 비교
print(f"λ={vals[i]:.1f}: Av={np.round(lhs,3)} λv={np.round(rhs,3)} ->",
np.allclose(lhs, rhs))벡터 노름과 거리
- 벡터 노름vector norm은 벡터를
이상의 실수로 사상한다. -노름은 로 정의된다.- 벡터의 크기는
-노름 이며, 그 밖에 , 가 있다. 를 로 대체하면 거리가 된다. 는 유클리드 거리Euclidean distance, 은 맨해튼 거리Manhattan distance, 는 체비셰프 거리Chebyshev distance이다. · 노름은 딥러닝의 정칙화regularizer로 자주 쓰인다.
- 벡터의 크기는
- 여러 특징의 상호 변동은 공분산covariance으로 본다. 데이터 행렬
(행=샘플, 열=특징)의 공분산 행렬 는 다음과 같다.
- 공분산으로 마할라노비스 거리Mahalanobis distance
를 정의한다. 두 확률 분포의 거리로는 쿨백-라이블러 발산Kullback-Leibler divergence 을 쓰며, 대칭적이지 않다.