[TIL] 21.05.21 numpy 행렬

Seung Joo·2021년 5월 21일
1

TIL

목록 보기
9/31
post-thumbnail

1. 행렬의 기본 연산

# 기본적인 2x2 numpy array 만들기 
a = np.array(range(1, 5)).reshape(2, 2)
b = np.array(range(11, 15)).reshape(2, 2)

print(a, '\n')
print(b, '\n')

# out
#
# a : 
#  [[1 2]
#  [3 4]] 

# b : 
#  [[11 12]
#  [13 14]] 
# 행렬의 기본연산
print('a + b : \n', np.add(a, b), '\n')
print('a - b : \n', np.subtract(a, b), '\n')
# 스칼라 값별 나눗셈 연산
print('a / b : \n', np.divide(a, b), '\n')
# 행렬 곱셈 연산
print('a @ b : \n', np.matmul(a, b), '\n')
# 스칼라의 값별 곱셈 연산
print('a * b : \n', np.multiply(a, b), '\n')


# out
#
# a + b : 
#  [[12 14]
#  [16 18]] 

# a - b : 
#  [[-10 -10]
#  [-10 -10]] 

# a / b : 
#  [[0.09090909 0.16666667]
#  [0.23076923 0.28571429]] 

# a @ b : 
#  [[37 40]
#  [85 92]] 

# a * b : 
#  [[11 24]
#  [39 56]] 

2. Norm

Norm 은 벡터의 크기(혹은 길이)를 측정하는 방법 혹은 함수

주어진 벡터에 대한 Norm 정의

L1 Norm

v=x0+x1+...+xn|v| = |x_0|+|x_1|+...+|x_n|

L2 Norm

v=x02+x12+x22+...+xn2||v|| = \sqrt{x_0{^2}+x_1{^2}+x_2{^2}+...+x_n{^2}}
# L1 Norm 식 구현
l1 = abs(vector).sum()

# L2 Norm 식 구현
l2 = np.sqrt((vector**2).sum())

# np.linalg.norm 함수로 구현되어 있음 
# ord=1 == L1 Norm | ord=2 == L2 Norm
# (axis와 ord 파라미터를 입력하지 않을 시 기본값은 L2 Norm임)
# l1 = np.linalg.norm(v, ord=1) 
# l2 = np.linalg.norm(v, ord=2)

3. 평균제곱오차(MSE), 평균절대오차(MAE)

MSE = Mean Squared Error

MSE=1ni=1n(Y^iYi)2MSE = {1 \over n}\sum_{i=1}^n(\hat{Y}_i-Y_i)^2

MAE = Mean Absolute Error

MAE=1ni=1nxixMAE = {1 \over n}\sum_{i=1}^n|x_i - x|
# MSE 식 구현
MSE = np.square(np.subtract(x, y)).mean()
# MAE 식 구현
MAE = np.abs(np.subtract(x, y)).mean()

# sklean.metrics 에 아주 잘 구현이 되어있다.
# 우리는 가져다 쓰면 된다^^
# from sklearn.metrics import mean_squared_error as mse
# MSE = mse(x, y)
# from sklean.metrics import mean_absolute_error as mae
# MAE = mae(x, y)      

4. 행렬식

import copy

# (2x2) ~ (3x3) 까지 가능한 행렬식 함수
def determinant(matrix, n):
    # 2x2 행렬식 계산
    if n == 2:
        return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]
   
   # 3x3 행렬식 계산
   if n == 3
       det = 0
       # 1열 빼고 복사
       new_matrix = copy.deepcopy(matrix[:, 1:])
       # 0~2 까지 루프
       for i in range(n):
           # 2차원 행렬연산에 필요한 행만 추출
           temp = copy.deepcopy(np.delete(new_matrix, i, axis=0))
           # 수식의 +,-구분을 위해 -1에 i를 제곱해주고, 
           # 1열에 원소 차례대로 뽑아서, 2차원 행렬식과 곱
           det += (-1)**i * matrix[i][0] * determinant(temp, n-1)
       return det

# 하지만 np.linalg.det() 함수로 가능하다는 것
# 주의 float 연산에 약간의 오차가 있어서 소수점 아주 작은 수가 나올 수 있음

# ex
a = np.array([[1, 0, 2],
             [-3, 4, 6],
             [-1, -2, 3]])
print(np.linalg.det(a))
# 위 함수 사용
print(determinant(a, 3))

#
# out
# 44.000000000000014
# 44
profile
조금씩 천천히

0개의 댓글