본문 바로가기

Dev/AI 인공지능

[AI] 벡터와 행렬 | Vector | Matrix | 역행렬 | 유사역행렬 | 무어펜로즈 역행렬

728x90
반응형

벡터 (Vector)

  • 숫자를 원소로 가지는 리스트 또는 배열
  • 세로로 놓여있는 경우 - 행벡터 (numpy로 주로 다룰 때 사용)
  • 가로로 놓여있는 경우 - 열벡터
  • 코드로 구현하기 위해서는 numpy 라이브러리를 주로 사용

 

 

벡터는 n차원 공간 내 원점으로부터(영벡터) 상대적인 위치에 있는 한 점 표현

- 숫자를 곱해주면 길이만 변한다 (스칼라곱)

- 같은 모양을 가지면 성분간 덧셈, 뺄셈, 곱셈(Element-wise) 등의 연산이 가능하다

- 두 벡터의 덧셈: 다른 벡터로부터 상대적 위치이동

 

 

벡터의 노름(norm): 원점에서부터의 거리 - 구성성분의 개수 상관없이 계산 가능

  • L1 Norm: 임의의 차원 d에 대해서 구성성분의 절대값을 모두 더하는 것 (=좌표평면에서 좌표축에 따라 움직이는 거리)
  • L2 Norm: 임의의 차원 d에 대해서 피타고라스 정리를 이용해 계산하는 유클리드 거리

👉 사용하는 노름의 종류에 따라서 기하학적 성질이 달라짐!

 

 

두 벡터 사이의 거리(벡터의 뺄셈 : y-x)를 계산 - L1 Norm, L2 Norm 모두 가능

두 벡터 사이의 각도를 계산 : L2 Norm만 가능 - 제 2 코사인 법칙에 의해 두 벡터 사이의 각도 계산 가능

👉 각도 계산을 위한 코사인값 계산시, 분자에서의 연산이 '내적(Inner Product)'을 의미

 

 

그렇다면 내적은 무엇인가?!

내적은 정사영된 벡터(Proj(x))의 길이와 관련이 있다!

Proj(x)의 길이 = ||x|| x (x)

내적은 정사영의 길이를 벡터 y의 길이 ||y||만큼 조정한 값임

그에 따라, 내적은 두 벡터의 유사도(similarity)를 측정하는데 사용할 수 있음

 

 

행렬이란?

  • 벡터(Vector)를 원소로 가지는 2차원 배열 (n X m 행렬)
  • n X m 행렬: 행렬 X는 n개의 벡터 x로 이루어짐 & 벡터 x는 m개의 원소로 이루어짐
  • numpy에서는 행(row)이 기본 단위임에 유의
  • 벡터는 공간에서 한 점을 의미한다면, 행렬은 여러 점들을 나타냄
  • 행렬은 벡터를 원소로 가지는 2차원 배열이기 때문에, 같은 모양을 가지면 덧셈, 뺄셈, 성분곱이 가능함
  • 행렬의 스칼라곱 또한 벡터의 스칼라곱과 동일함
  • 벡터 공간에서 사용되는 연산자로도 이해할 수 있음
  • 행렬곱을 통해 패턴을 추출할 수 있고, 데이터를 압축할 수도 있음

 

전치행렬(transpose matrix): 행과 열의 인덱스가 바뀐 행렬 (nXm 행렬 👉 mXn 행렬)

 

 

행렬 곱셈 

  • i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 연산
  • 따라서 행벡터의 원소 개수와 열벡터의 원소 개수가 동일해야 함! 
  • 둘 간의 순서가 바뀌면 전혀 다른 곱셈이 됨! 순서가 매우 중요!
  • numpy에서 @ 연산 이용
  • numpy.inner은 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 연산임!
    (두 행벡터의 크기가 같아야 함! 또한 수학에서 말하는 내적과는 다르므로 주의)

 

 

역행렬: 어떤 행렬A의 연산을 거꾸로 되돌리는 행렬 (A^-1로 표기)

  • 순서 상관없이 원본행렬과 역행렬을 곱한다면 항등행렬(Identity Matrix)이 생성됨
  • (항등행렬의 역할: 임의의 벡터 혹은 행렬을 곱했을 때, 자기 자신이 나오게 되는 행렬) 
  • 즉, 역행렬을 사용한다면 자기 자신을 구하는 항등행렬까지 구할 수 있기 때문에 잘 알아두면 좋음
  • np.linalg.inv() 를 사용하여 역행렬을 구할 수 있음
  • 역행렬을 만들 수 있는 조건은 무엇인가?
    • 단, 행과 열의 숫자가 같아야 함
    • non-determinent
  • 만약 역행렬을 계산할 수 없다면?
    • 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose) 역행렬 A^+ 이용
    • numpy.linalg.pinv() 함수를 사용하여 유사역행렬을 구할 수 있음
    • 여기서는 굳이 행과 열의 숫자가 같을 필요가 없음
    • 단, 행의 개수가 더 많을 때와 열의 개수가 더 많을 때에 대한 계산 방식이 달라짐
    • 행의 개수가 많을때: A^+ = (A^tA)^-1A^t
    • 열의 개수가 많을때: A^+ = A^t(A^tA)^-1
    • 절차 예시 (원본 행렬이 nxm)
      • 전치 행렬인 mXn과 원본 행렬인 nXm을 곱함 👉 mXm행렬 생성
      • 역행렬을 만들 수 있는 행렬인 mXm로 역행렬을 생성
      • mXm로 생성한 역행렬과 전치행렬인 mXn을 곱함
      • mXn의 유사 역행렬 생성 완료

 

 

유사역행렬의 활용

  • 연립방정식은 행렬을 사용하면 Ax = b 와 같이 나타낼 수 있음 (np.linalg.pinv)
    • A는 계수, x는 변수, b는 값
    • 만약 연립방정식의 식의 개수(n)보다 구해야하는 변수의 개수(m)가 더 많다면, 무어펜로즈 역행렬을 이용하면 해를 하나 구할 수 있음
  • 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있음 (np.linalg.pinv)
    • 데이터가 변수의 개수보다 많다면?!
    • 선형회귀분석: 기존에 있는 다양한 데이터(y)를 잘 나타내도록 하는 X*beta 를 찾는 것
    • Moore-Penrose 역행렬과 L2노름을 이용하면 y에 근접하는 y^(y hat)를 찾을 수 있음 - L2 Norm값을 최소화
    • sklearn의 LinearRegression과 같은 결과를 찾을 수 있음
      • 하지만 결과값이 살짝 다름
      •  그이유는 y절편(intercept)항을 직접 추가해야하기 때문

 

 

본 포스트는 부트코스 내 네이버 부스트캠프 AI Tech 5기 강의를 토대로 작성되었습니다

 

728x90
반응형