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
반응형