넘파이 패키지를 사용하기 위해선 다음은 항상 임포트 되어있어야 한다.
import numpy as np
데이터 유형 : 스칼라, 벡터, 행렬, 텐서
선형대수에서 다루는 데이터는 크게 네가지 유형으로 나뉜다.
- 스칼라(scalar) : 하나의 숫자로 이루어진 데이터이다.
- 벡터(vector) : 여러 개의 숫자 또는 문자가 특정한 순서대로 모여 있는 것이다.
\[ \mathbf{x} = (x_1, x_2, \dots, x_n) \in R^n \]
n-차원 벡터(n-dimensional vector)
* 데이터 벡터가 예측 문제에서 입력 데이터로 사용되면 이때, 이를 특징벡터(feature vector)라 한다.
import numpy as np
X_1 = np.array([[1,2],[3,4],[5,6]])
>>> array([[1, 2],
[3, 4],
[5, 6]])
- 행렬(matrix) : 복수 차원을 가지는 데이터 레코드가 여러개이고 이 데이터를 합쳐 표기한 것이다.
* 데이터 행렬이 예측 문제에서 입력 데이터로 사용되면 이때, 이를 특징행렬(feature matrix)라 한다.
* 스칼라와 벡터도 행렬이다.
import numpy as np
A = np.array([[11,12,13],[21,22,23]])
>>> array([[11, 12, 13],
[21, 22, 23]])
- 텐서(tensor) : 같은 크기의 행렬이 여러개 묶여 있는 것을 말한다.
전치(Transpose)
행(row)과 열(coloumn)을 바꾸는 연산이다.
import numpy as np
A = np.array([[11,12,13],[21,22,23]])
A.T
>>> array([[11, 21],
[12, 22],
[13, 23]])
영벡터(zero-vector)
모든 원소가 0인 벡터이다.
np.zeros((3, 1))
>>> array([[0.],
[0.],
[0.]])
일벡터(one-vector)
모든 원소가 1인 벡터이다.
np.ones((3, 1)) # np.ones((행의 수, 열의 수))
>>> array([[1.],
[1.],
[1.]])
정방행렬(square matrix)
어떤 행렬 A의 행의 개수와 열의 개수가 같은 행렬이다.
대각행렬(diagonal matrix)
대각 성분을 제외하고 나머지 원소 모두 0인 행렬이다.
np.diag([1, 2, 3]) # np.diag([대각성분])
>>> array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
항등행렬(identity matrix)
대각 성분이 1인 정방행렬이다.
np.identity(3) # np.identity(차원의 수)
>>> array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
np.eye(4) # np.eye(차원의 수)
>>> array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
대칭행렬(symmetric matrix)
행렬 S의 전치 행렬과 행렬 S가 같다면, 이때 행렬 S를 대칭행렬이라 한다.
if $S^T$ = $S$, then the matrix $S$ is symmetric matrix
벡터와 행렬의 곱
- 벡터의 곱 : 벡터의 곱은 내적(inner product)라고 한다.
두 벡터의 내적이 성립하기 위해선 i) 두 벡터의 길이가 같아야 하고, ii) 앞의 벡터는 행벡터, 뒤의 벡터는 열벡터야 한다.
\[ \mathbf{x} \cdot \mathbf{y} = <\mathbf{x}, \mathbf{y}> = \mathbf{x}^T \mathbf{y} \]
x = np.array([[1], [2], [3]])
y = np.array([[4], [5], [6]])
x.T @ y # np.dot(x.T,y)
>>> array([[32]])
- 행렬의 곱
행렬의 곱을 구하고자 할때도 @나 np.dot( )을 사용한다.
행렬의 곱에는 몇가지 성질있는데, 다음과 같다.
\[ i) AB \neq BA \quad \quad ii) A(B + C) = AB + AC \]
\[ iii) (A + B)C = AC + BC \quad iv) (A + B)^T = A^T + B^T \quad v) (AB)^T = B^T A^T\]
선형회귀 모형(linear regression model)
독립변수 x에서 종속변수 y를 예측하는 방법의 하나로 독립변 수 벡터 x와 가중치 벡터 w와의 가중합으로 y에 대한 예측값 yˆ를 계산하는 수식을 말한다.
\[ \hat{y} = w_1 x_1 + \dots + w_nx_n = \mathbf{w}^T \mathbf{x} \]
선형회귀 모형은 가장 단순하면서도 가장 널리 쓰이는 예측 모형이지만, 비선형적인 현실데이터를 예측하지 못하는 단점이 있다.
이때, 예측치와 실젯값(target) y_i의 차이를 오차(error) 혹은 잔차(residual) e_i라고 한다.
\[ e_i = y_i - \hat{y_i} = y_i - \mathbf{w}^T x_i \]
잔차제곱합(RSS; Residual Sum of square)
\[RSS = \Sigma e_i^2 \]
이차형식(Quadratic Form) : 행벡터 * 정방행렬 * 열벡터의 형태이다.
\[ \mathbf{x}^T A \mathbf{x} \]
영벡터가 아닌 모든 벡터 x에 대하여, 다음과 같은 부등식이 성립하면 그때 우리는 행렬 A를 양의 정부호(positive definite)라 한다.
If $\mathbf{x}^T A \mathbf{x} > 0$, then $A$ is 'positive definite'.
If $\mathbf{x}^T A \mathbf{x} \geq 0$, then $A$ is 'semi-positive definite'.
항등행렬(identity matrix)는 양의 정부호 행렬이다.
행렬 놈(norm)
행렬 A에 대해 정의 되는 숫자이다.
\[ ||A||_p = (\Sigma_{i=1}^n \Sigma_{j=1}^m |a_{ij}|^p)^{1/p} \]
이때 p는 자연수를 사용하는데, 주로 p=2인 경우가 가장 많이 쓰이므로 p값 표시가 없는 경우 p=2인 놈(norm)이라고 생각하면 된다. p=2인 놈을 프로베니우스 놈(Frobenius norm)이라고 부른다.
벡터의 놈(norm)에서 중요한 성질은 벡터의 놈의 제곱이 벡터의 제곱합과 같다는 것이다.
\[ ||\mathbf{x}||^2 = \Sigma_{i=1}^n x_i^2 = \mathbf{x}^T \mathbf{x} \]
import numpy as np
A = np.array([[-4, -3, -2],
[-1, 0, 1],
[ 2, 3, 4]])
np.linalg.norm(A)
>>> 7.745966692414834
놈의 정확한 정의는 다음 4가지 성질을 만족하는 행렬 연산이다.
\[ i) ||A|| \geq 0 \quad \quad ii) ||cA|| = c||A|| \]
\[ iii) ||A + B|| \leq ||A|| + ||B|| \quad iv) ||AB|| \leq ||A|| ||B|| \]
대각합(trace)
정방행렬에 대해서만 정의되며 다음처럼 대각원소의 합으로 계산된다.
\[ tr(A) = a_{11} + a_{22} + \dots + a_{nn} = \Sigma_{i=1}^n a_{ii} \]
대각합에는 몇가지 성질이 있는데, 다음과 같다.
$c$ : scalar $A, B, C$ : matrix
\[ i) tr(cA) = ctr(A) \quad ii) tr(A^T) = tr(A) \quad iii) tr(A + B) = tr(A) + tr(B) \]
\[ iv) tr(AB) = tr(A)tr(B) \quad \quad v) tr(ABC) = tr(BCA) = tr(CAB)\]
np.trace(np.eye(3))
>>> 3.0
행렬식(determinant)
정방행렬 A의 행렬식(determinant)은 det(A), det A, |A| 기호로 표기한다.
\[ det(A) = \Sigma_{i=1}^n C_{i_0, j}a_{i_0,j} \]
$C_{i, j} = (-1)^{i + j}M_{i, j}, C_{i, j}$는 여인수(cofactor)
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
np.linalg.det(A)
>>> -9.51619735392994e-16
행렬식에 세가지 성질이 있다.
\[ i) det(A^T) = det(A) \quad ii) det(AB) = det(A)det(B) \quad iii) det(A^{-1} = \frac{1}{detA} \]