선형대수와 행렬미분의 기초를 배우고 간단한 머신러닝 알고리즘(PCA)을 유도해보고자 한다.
1. 기본 표기법 (Basic Notation)
- A∈Rm×n는 m개의 행과 n개의 열을 가진 행렬을 의미한다.
- x∈Rn는 n개의 원소를 가진 벡터를 의미한다.
- n차원 벡터는 n개의 행과 1개의 열을 가진 행렬로 생각할 수 있다. 이것을 열벡터(column vector)로 부르기도 한다.
- 만약, 명시적으로 행벡터(row vector)를 표현하고자 한다면, xT(T는 transpose를 의미)로 쓴다.
- 벡터 x의 i번째 원소는 xi로 표시한다.
- aij(또는 Aij,Ai,j)는 행렬 A의 i번째 행, j번째 열에 있는 원소를 표시한다.
- A의 j번째 열을 aj 혹은 A:,j로 표시한다.
A=⎣⎢⎡∣a1∣∣a2∣⋯∣an∣⎦⎥⎤
- A의 i번째 행을 aiT 혹은 Ai,:로 표시한다.
A=⎣⎢⎢⎢⎢⎡a1Ta2T⋮amT⎦⎥⎥⎥⎥⎤
- Python에서의 벡터, 행렬 표현방법
import numpy as np
A = np.array([
[10,20,30],
[40,50,60]
])
A.shape
j = 1
A[:, j]
i = 1
A[i, :]
2. 행렬의 곱셈 (Matrix Multiplication)
두 개의 행렬 A∈Rm×n, B∈Rn×p의 곱 C=AB∈Rm×p는 다음과 같이 정의된다.
Cij=∑k=1nAikBkj
벡터 × 벡터 (Vector-Vector Products)
- 내적(inner product)
두 개의 벡터 x,y∈Rn이 주어졌을 때 내적(inner product 또는 dot product) xTy는 다음과 같이 정의된다.
xTy∈R=[x1x2⋯xn]⎣⎢⎢⎢⎢⎡y1y2⋮yn⎦⎥⎥⎥⎥⎤=i=1∑nxiyixTy=yTx
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
x.dot(y)
y.dot(x)
- 외적(outer product)
두 개의 벡터 x∈Rm,y∈Rn이 주어졌을 때 외적(outer product) xyT∈Rm×n는 다음과 같이 정의된다.
xyT∈Rm×n=⎣⎢⎢⎢⎢⎡x1x2⋮xm⎦⎥⎥⎥⎥⎤[y1y2⋯yn]=⎣⎢⎢⎢⎢⎡x1y1x2y1⋮xmy1x1y2x2y2⋮xmy2⋯⋯⋱⋯x1ynx2yn⋮xmyn⎦⎥⎥⎥⎥⎤
x = np.expand_dims(x, axis=1)
y = np.expand_dims(y, axis=0)
x.shape, y.shape
np.matmul(x,y)
- 외적을 이용하여 모든 열들이 동일한 벡터를 가진 행렬 표현하기
아래 행렬 A는 모든 열들이 동일한 벡터 x를 가지고 있다. 외적을 이용하면 간편하게 x1T로 나타낼 수 있다(1∈Rn는 모든 원소가 1인 n차원 벡터).A=⎣⎢⎡∣x∣∣x∣⋯∣x∣⎦⎥⎤=⎣⎢⎢⎢⎢⎡x1x2⋮xmx1x2⋮xm⋯⋯⋱⋯x1x2⋮xm⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡x1x2⋮xm⎦⎥⎥⎥⎥⎤[11⋯1]=x1T
x = np.expand_dims(np.array([1, 2, 3]), axis=1)
ones = np.ones([1,4])
A = np.matmul(x, ones)
A
행렬 × 벡터 (Matrix-Vector Products)
행렬 A∈Rm×n와 (열)벡터 x∈Rn의 곱인 벡터 y=Ax∈Rm를 몇 가지 측면에서 바라볼 수 있다.
- 열벡터를 오른쪽에 곱하고(Ax), A가 행의 형태로 표현되었을 때
amT와 벡터 x의 dot producty=Ax=⎣⎢⎢⎢⎢⎡a1Ta2T⋮amT⎦⎥⎥⎥⎥⎤x=⎣⎢⎢⎢⎢⎡a1Txa2Tx⋮amTx⎦⎥⎥⎥⎥⎤
A = np.array([
[1,2,3],
[4,5,6]
])
ones = np.ones([3,1])
np.matmul(A, ones)
- 열벡터를 오른쪽에 곱하고(Ax), A가 열의 형태로 표현되었을 때
합의 형태로 벡터가 표현됨y=Ax=⎣⎢⎡∣a1∣∣a2∣⋯∣an∣⎦⎥⎤⎣⎢⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎥⎤=⎣⎢⎡∣a1∣⎦⎥⎤x1+⎣⎢⎡∣a2∣⎦⎥⎤x2+⋯+⎣⎢⎡∣an∣⎦⎥⎤xn
A = np.array([
[1,0,1],
[0,1,1]
])
x = np.array([
[1],
[2],
[3]
])
np.matmul(A, x)
for i in range(A.shape[1]):
print('a_'+str(i)+':', A[:,i], '\tx_'+str(i)+':', x[i], '\ta_'+str(i)+'*x_'+str(i)+':', A[:,i]*x[i])
- 행벡터를 왼쪽에 곱하고(xTA), A가 열의 형태로 표현되었을 때
A∈Rm×n, x∈Rm, y∈Rn일 때, yT=xTA
yT=xTA=xT⎣⎢⎡∣a1∣∣a2∣⋯∣an∣⎦⎥⎤=[xTa1xTa2⋯xTan]
- 행벡터를 왼쪽에 곱하고(xTA), A가 행의 형태로 표현되었을 때
행렬 × 행렬 (Matrix-Matrix Products)
-
일련의 벡터 × 벡터 연산으로 표현하는 경우
- A가 행으로, B가 열로 표현되었을 때
A∈Rm×n, B∈Rn×p, ai∈Rn, bj∈Rn이기 때문에 내적값들이 자연스럽게 정의된다.
C=AB=⎣⎢⎢⎢⎢⎡a1Ta2T⋮amT⎦⎥⎥⎥⎥⎤⎣⎢⎡∣b1∣∣b2∣⋯∣bp∣⎦⎥⎤=⎣⎢⎢⎢⎢⎡a1Tb1a2Tb1⋮amTb1a1Tb2a2Tb2⋮amTb2⋯⋯⋱⋯a1Tbpa2Tbp⋮amTbp⎦⎥⎥⎥⎥⎤
- A가 열로 B가 행으로 표현되었을 때
AB는 모든 i에 대해서 ai∈Rm와 bi∈Rp의 외적의 합이다.
aibiT의 차원은 m×p이다 (C의 차원과 동일).
C=AB=⎣⎢⎡∣a1∣∣a2∣⋯∣an∣⎦⎥⎤⎣⎢⎢⎢⎢⎡b1Tb2T⋮bnT⎦⎥⎥⎥⎥⎤=i=1∑naibiT
-
일련의 행렬 × 벡터 연산으로 표현하는 경우
- B가 열로 표현되었을 때
C=AB=A⎣⎢⎡∣b1∣∣b2∣⋯∣bp∣⎦⎥⎤=⎣⎢⎡∣Ab1∣∣Ab2∣⋯∣Abp∣⎦⎥⎤
- A가 행으로 표현되었을 때
C=AB=⎣⎢⎢⎢⎢⎡a1Ta2T⋮amT⎦⎥⎥⎥⎥⎤B=⎣⎢⎢⎢⎢⎡a1TBa2TB⋮amTB⎦⎥⎥⎥⎥⎤
3. 중요 연산과 성질들 (Operations and Properties)
-
정방행렬(square matrix): 행과 열의 개수가 동일
-
상삼각행렬(upper triangular matrix): 정방행렬이며 주대각선 아래 원소들이 모두 0
-
하삼각행렬(lower triangular matrix): 정방행렬이며 주대각선 위 원소들이 모두 0
-
대각행렬(diagonal matrix): 정방행렬이며 주대각선 제외 모든 원소가 0
np.diag([4, 5, 6])
D = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
])
np.diag(D)
- 단위행렬(identity matrix): 대각행렬이며 주대각선 원소들이 모두 1인 행렬, I로 표시
np.eye(3)
내용이 길어지는 관계로 다음 게시글에 이어서 작성하겠다.