728x90
1. Matrix(1) : 데이터를 저장
- 행렬
- 행렬은 vector를 원소로 가지는 2차원 배열
- numpy에서는 row(행)가 기본 단위 : 행벡터를 원소로 가지는 2차원 배열
- 행(row, i)과 열(column, j)이라는 index를 가짐 : X = (x_ij)
- i번째 행과 j번째 열에 위치한 원소, i번째 행벡터의 j번째 원소 : x_ij
- 특정 행(열)을 고정하면 행(열)벡터라 부름
- 전치 행렬
- Transpose : 행과 열의 index가 바뀐 행렬
- 행벡터 <-> 열벡터
- 행렬을 이해하는 방법
- 벡터가 공간에서 한 점을 의미한다면 행렬은 '여러 점'들을 나타냄
- 행렬의 행벡터 X_i는 i번째 데이터를 의미함
- x_ij : i번째 데이터의 j번째 변수의 값을 의미함
2. Addition, Subtraction, hadamard product, scalar product
3. Products
1) 행렬의 성분곱 : 아다마르 곱(hadamard product) = 성분곱 > : *연산
- -벡터/행렬끼리 같은 모양을 가지면 성분곱을 계산할 수 있음
- 성분끼리의 곱셈으로 표현가능
- [m X n] * [m X n] = [m X n] (상-상-상)
- X * Y = (x_ij * y_ij) : 각 행렬의 원소끼리의 곱을 성분으로 갖는 행렬을 반환
2) 행렬의 곱셈 : @연산 / a.dot(b) : method / 붙여서 쓰기
- 결과 행렬의 사이즈를 미리 정하기
- 상 - 우 - 상 순서로 내적 결과를 손으로 작성
- i번째 행벡터와 j번째 열벡터 사이의 내적을 성분으로 가지는 행렬
- [m X n] * [n X p] = [m X p] (상-우-상)
- XY = sigma((k~) (x_ik * y_kj) )
3) 행렬의 내적 : np.inner(X,Y) / X @ Y.T or X.dot(Y.T)
- X o Y (내적) = XY^T(전치 후 행렬 곱) : X 열의 갯수 = Y^T 행의 갯수 = Y행의 갯수
- np.inner(X,Y) : X 열의 갯수 = Y 열의 갯수 (X을 기준으로 두고 Y에서 하나씩 상-상-상)
- 1st 수학적 내적, 2nd 컴퓨터적 내적
- numpy의 dot은 일반 행렬곱과 같음 : dot 연산 = @ 연산
- numpy의 np.inner는 i번째 행벡터와 j번째 행벡터 사이의 내적을 성분으로 가지는 행렬을 계산
- 수학에서는 두 행렬의 사이의 내적을 계산 후 trace를 적용함 : numpy에서 말하는 내적과는 다르다
- np.inner : 일반 행렬곱과 다르게 아다마르 성분곱을 사용
- vector 끼리 내적할 경우 scalar을 반환
3. Matrix(2) : 두 데이터를 연결하는 연산자
- 행렬은 벡터공간에서 사용되는 연산자(operator)로 이해한다
- 행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수 있음
- 행렬의 차원 : 행(열)의 개수로 인식하기
- 행렬곱을 통해 패턴을 추출할 수 있고, 데이터를 압축할 수도 있음
- 모든 선형변환(linear transform)은 행렬곱으로 계산할 수 있음
- [n x 1] = [n x m] * [m x 1] : m차원 공간 -> n차원 공간
- z = Ax
4. Inverse Matrix
- 역행렬 이해하기
- 어떤 행렬A의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라 부름 : A^-1표기
- 역행렬 존재조건 <-> 정사각행렬 & 행렬식!=0 이여야만 존재
- AA^-1 = A^-1A = I (항등행렬 = identical matrix)
- Ax = B <-> x = A^-1B (A^-1를 앞에 곱해준다 or x에 A^-1이 들어가야 해당 식이 성립)
- (AB)^-1 = B^-1A^-1
- np.linalg
- numpy의 linear algebra 라이브러리 사용
- np.linalg.inv(x) : 역행렬을 계산
5. Moore-Penrose (pseudo-inverse)
- 역행렬이 존재하지 않을 때 : 유사역행렬, 무어-펜로즈 역행렬
- 역행렬을 계산할 수 없다면 유사역행렬(pseudo-inverse) 또는 무어-펜로즈(Moore-Penrose)역행렬 A^+을 이용한다
- Ax = z <-> x = A^ +z
- n>=m : A^+ = (A^TA)^-1A^T <-> A^+A = I 만 성립
- n<=m : A^+ = A^T(AA^T)^-1 <-> AA^+ = I 만 성립
- 곱하는 순서에 주의할 것
- 외우는 방법 : TAT 순서는 동일한데, n>=m일 경우는 앞에 (괄호), n<=m 일 경우는 뒤에 (괄호)
6. Linear equations / Linear regression
- 행렬에서 변수, 데이터
- 데이터 개수 = 행 개수(-y)
- 변수 개수 = 열 개수(+x)
- 연립방정식 풀기
- np.linalg.pinv를 이용하면 연립방정식의 해를 구할 수 있다
- n(식의 개수) <= m(변수 개수) 인 경우 : Ax = b (해가 무한히 많다, 부정 : 그 해 중 하나를 구하는 방법)
- x = A^+b = A^T(AA^T)^-1b
- 양변에 A^+를 행렬곱 하는 것이 아니라, x = A^+b를 대입하는 것으로 이해
- 선형회귀분석
- np.linalg.pinv를 이용하면 데이터를 선형모델(linear model)로 해석하는 선형회귀식을 찾을 수 있음
- n >= m 이므로 데이터가 변수 개수보다 많거나 같아야 함
- 선형회귀분석 연립방정식과 달리 행의 개수(식의 개수) > 열의 개수(변수의 개수)이므로 방정식을 푸는 것은 불가능함
- 선형회귀분석은 X 와 y 가 주어진 상황에서 계수 β 를 찾아야 한다
- Xβ != y
- Xβ = yˆ ~= y
- y : True target
- y^ : Predicted output
- β = X^+y = (X^TX)^-1X^Ty : Moore-Penrose 역행렬을 이용하면 y에 근접하는 yˆ을 찾을 수 있음 -> L2-norm을 최소화하는 β를 찾는 것이 목표 (min||y-yˆ||_2)
728x90