벡터와 행렬

Heath_Jeong·2021년 3월 5일
0

Ustage Week2 - AI Math

목록 보기
1/9
post-thumbnail

벡터가 뭐에요?

벡터

  • 벡터는 숫자를 원소로 가지는 리스트 또는 배열
  • 차원이 존재
  • 벡터는 공간에서 한 점을 나타냄
    • 1 차원 [x], 2 차원 [x, y], 3 차원 [x, y, z] ...
  • 원점으로부터 상대적 위치를 표현함
  • 벡터에 숫자를 곱하면 방향은 그대로고 길이만 변함 → 스칼라곱
  • 스칼라곱에서 스칼라가 음수이면 반대 방향으로 진행됨
  • 같은 모양을 가진 벡터끼리 덧셈, 뺄셈, 성분곱 (elementry-wise) 가능
  • 두 벡터의 덧셈은 다른 벡터로부터 상대적 위치 이동을 표현

벡터의 노름 (norm)

  • 벡터의 노름은 원점에서부터의 거리, 임의의 차원 d 에 대해 성립
  • 여러 노름 공식이 있지만 두 가지 소개

L1L_1 노름은 각 성분의 변화량의 절대값을 모두 더함

def l1_norm(x):
	x_norm = np.abs(x)
	x_norm = np.sum(x_norm)
	return x_norm

L2L_2 노름은 피타고라스 정리를 이용해 유클리드 거리를 계산, np.linalg.norm 으로 구현 가능

def l2_norm(x):
	x_norm = x*x
	x_norm = np.sum(x_norm)
	x_norm = np.sqrt(x_norm)
	return x_norm
  • 노름의 종류에 따라 기하학적 성질이 달라짐
    • L1 노름 상의 길이가 1 인 원은 마름모
      • Robust 학습, Lasso 회귀 등에 사용
    • L2 노름 상의 길이가 1 인 원은 원
      • Laplace 근사, Ridge 회귀 등에 사용

두 벡터 사이의 거리

  • 두 점 사이의 거리 구하는 것과 동일, L1, L2 노름을 이용해 계산할 수 있음
  • 벡터의 뺄셈 이용!
  • ||x - y||

두 벡터 사이의 각도 구하기

  • L2 노름으로 구할 수 있음
  • 제 2 코사인 법칙 사용
  • 내적 (np.inner) 을 사용하여 분자를 쉽게 구할 수 있음
def angle(x, y):
	v = np.inner(x, y) / (l2_norm(x) * l2_norm(y))
	theta = np.arccos(v)
	return theta

내적은 어떻게 해석할까?

  • 내적은 정사영(orthogonal projection) 된 벡터의 길이와 관련 있다.
  • Proj(x) 의 길이는 코사인법칙에 의해 ||x||cosθ 가 된다.
  • 내적은 정사영의 길이를 벡터 y 의 길이 ||y|| 만큼 조정한 값이다.
  • 내적은 두 벡터의 유사도를 측정하는데 사용 가능

행렬이 뭐에요?

행렬

  • 벡터를 원소로 가지는 2 차원 배열
  • numpy 는 행벡터를 기본 단위로 가짐
  • n x m 행렬 : m 개의 원소지닌 벡터를 n 개 가진 행렬
  • X = (xij)(x_\mathit{ij}) 로 표기하기도 함

전치 행렬

  • XT=(xji)X^T = (x_\mathit{ji}), Transpose of X
  • n x m 행렬 → m x n 행렬
  • 행렬의 연산을 위해 많이 사용!
  • 벡터에도 적용 가능. 행벡터 → 열벡터

행렬의 이해 (1)

  • 벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 의미
  • 행렬의 행벡터 xix_i 는 i 번째 데이터를 의미
  • 행렬의 xijx_\mathit{ij} 는 i 번째 데이터의 j 번째 변수 값

행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱

  • 같은 모양을 가진 행렬끼리 덧셈, 뺄셈, 성분곱 가능 (element-wise)

행렬 곱셈

  • maxtrix multiplication : i 번째 행벡터와 j 번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산
  • XY=(kxikykj)XY = (\sum_k{x_\mathit{ik}y_\mathit{kj}})

행렬의 내적

  • 일반 수학에서는 XTYX^TY 이지만, numpy 의 np.inner 는 행벡터 기준이므로 XYTXY^T (중요)
  • XYT=(kxikyjk)XY^T = (\sum_k{x_\mathit{ik}y_\mathit{jk}})

⇒ 행렬곱에서는 X 의 열의 개수와 Y 의 행의 개수가 같아야하고, 행렬의 내적에서는 X 의 열의 개수 (행벡터 크기) 와 Y 의 열의 개수가 같아야 함!

행렬의 이해 (2)

  • 데이터를 저장하는게 아니라, 서로 다른 두 데이터를 연결시키는 연산자로 이해 할 수 있음
  • 행렬곱을 통해 벡터다른 차원의 공간으로 보낼 수 있음
    • m x n 행렬과 n x 1 벡터를 곱하면 벡터는 n → m 차원으로 이동이 됨 (Linear Transform)
  • 행렬곱을 통해 패턴을 추출하거나 데이터를 압축할 수 있음

역행렬

  • 어떤 행렬 A 의 연산을 거꾸로 되돌리는 행렬을 역행렬 (inverse matrix) 라고 부르고 A1A^\mathit{-1} 라고 표기함
  • 역행렬은 행과 열 숫자가 같고 행렬식 (detA) 가 0 이 아닌 경우에만 가능
  • AA1=A1A=IAA^\mathit{-1} = A^\mathit{-1}A = I
  • np.linalg.inv(X)

유사 역행렬

  • 무어-펜로즈 역행렬 (유사역행렬) 은 행과 열의 숫자가 달라도 역행렬 구할 수 있음
  • A+A^+ 로 표현
  • 행의 개수가 열의 개수보다 많은 경우 A+=(ATA)1ATA^+ = (A^TA)^\mathit{-1}A^T
  • 열의 개수가 행의 개수보다 많은 경운 A+=AT(AAT)1A^+ = A^T(AA^T)^\mathit{-1}
  • np.linalg.pinv(Y)
  • 조심할 점
    • 행이 열보다 많은 경우, A+A=IA^+A = I 만 성립
    • 열이 행보다 많은 경우, AA+=IAA^+ = I 만 성립
  • 응용 1 : 변수 개수와 식의 개수가 같지 않은 연립방정식 풀기
    ⇒ Ax = b 에서 양 변의 앞에 A+A^+ 곱하기
  • 응용 2 : 선형회귀분석에서 데이터가 변수 개수보다 많거나 같을 때 사용 (행이 더 많기 때문에 방정식을 푸는 것은 불가능 → L2 norm 을 최소화하는 웨이트 찾기 가능), 양 변 앞에 XTX^T 곱함
    • sklearnLinearRegression 과 같은 결과를 가져올 수 있음
    # Scikit Learn 을 활용한 회귀분석
    from sklearn.linear_model import LinearRegression
    model = LinearRegression()
    model.fit(X, y)
    y_test = model.predict(x_test)

    # Moore-Penrose 역행렬
    X_ = np.array([np.append(x, [1]) for x in X]) # y 절편 (1) (intercept) 항을 직접 추가해야함
    beta = np.linalg.pinv(X_) @ y # @ 는 행렬곱
    y_test = np.append(x, [1]) @ beta

⇒ 딥러닝을 이해하려면 행렬 연산에 대한 완벽한 이해가 필요!


참조

  • BoostCamp AI Tech
profile
데이터로 문제를 해결하는 엔지니어를 꿈꿉니다.

0개의 댓글