카테고리 없음

[데이터 사이언스]NumPy로 배우는 선형대수

내일을 따라잡다 2023. 11. 6. 21:43
728x90

넘파이 패키지를 사용하기 위해선 다음은 항상 임포트 되어있어야 한다.

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} \]