매일공부

[AI 기초 다지기] 행렬matrix이란? 본문

IT/기초 다지기

[AI 기초 다지기] 행렬matrix이란?

aram 2022. 7. 25. 19:12

1) 행렬matrix 이란?

- "행(row)벡터"를 원소로 가지는 2차원 배열
   >> 배열(array)이란? 동일한 데이터 타입의 하나 이상의 값을 저장하는 구조, 1차원 구조
   >> 2차원 배열 : 1차원 배열들의 집합, 1차원 벡터들의 집합

- 행(row)열(column)이라는 인덱스index를 가짐

- 표기 순서 : 행row - 열col

- 행렬의 특정 행(열)을 고정하면 행(열)벡터라 부름

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

 

- 파이썬 스타일 코드로 표현한 벡터

  • 각 데이터의 이름을 함께 표현 >> 딕셔너리로 표현
  • 데이터의 위치나 순서가 바뀌지 않아야 한다면 >> 튜플로 저장
vector_a = [1, 2, 10]             #리스트로 표현
vector_b = (1, 2, 10)             #튜플로 표현
vector_c = {'x':1, 'y':2, 'z':10} #딕셔너리로 표현

 

- 전치행렬transpose matrix

: 행n과 열m의 인덱스가 바뀐 행렬

 : X의 상단에 T표시

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

matrix_a = [[1,2,3], [4,5,6]]
result = [[element for element in t] for t in zip(*matrix_a)] 
print(result) #[[1, 4], [2, 5], [3, 6]]
*로 행렬 언패킹 
 >> zip()으로 같은 인덱스끼리 묶음 == [1,4], [2,5], [3,6] 
 >> 그대로 리스트에 들어감 == 전치행렬

 

2) 행렬 이해하기

- 벡터  = 공간에서의 한 점

- 행렬 = 여러 점들

- 행렬의 행벡터 Xi는 i번째 데이터

- 행렬의 Xij = i번째 데이터의 j번째 변수의 값 > 행렬은 데이터의 모임

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

- 행렬은 벡터공간에서 사용되는 연산자operate로 이해

- m차원과 n차원을 연결시켜주는 것으로 생각해볼 수 있음

  > 즉, 행렬곱을 통해 벡터X를 다른 차원의 공간 벡터Z으로 보내주는 연산자

  > 행렬A와 벡터X를 곱해서 새로운 벡터Z 생성

- 행렬곱을 통해 패턴 추출데이터 압축 가능

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

          # [1행]   [2행]  
matrix_a = [[3,6], [4,5]]
matrix_b = [[1,1], [1,1]]
matrix_c = {(0,0):3, (0,1):6, (1,0):4, (1,1):5} 
#(0,0):3, (0,1):6
#(1,0):4, (1,1):5

 

3) 행렬의 덧셈, 뺄셈, 성분곱, 스칼라곱

- 행렬끼리 같은 모양(크기)을 가지면 덧셈, 뺄셈 가능
  (벡터의 덧뺄셈과 유사 - 각 인덱스 값이 같은 위치에 있는 값끼리 연산)

- 성분곱은 벡터와 동일 > 각 인덱스 위치끼리 곱함

- 스칼라곱도 벡터와 차이 없음 > 모든 성분에 똑같이 숫자 곱함 : 분배 법칙

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

u = [2, 2]
v = [2, 3]
z = [3, 5]
result = [sum(t) for t in zip(u, v, z)]
print(result)   ##zip() > [2,2,3], [2,3,5] 반환 >> [2+2+3], [2+3+5]
#[7, 10]

matrix_a = [[3,6], [4,5]]
matrix_b = [[5,8], [6,7]]
result = [[sum(row) for row in zip(*t)] for t in zip(matrix_a, matrix_b)]
#zip() : ([3, 6], [5, 8]), ([4, 5], [6, 7])
# > zip(*t) : ((3,5), (6,8)), ((4, 6), (5, 7)) 
# >> sum : [3+5, 6+8], [4+6, 5+7]
print(result)
#[[8, 14], [10, 12]]

## 스칼라곱-벡터 ##
u = [1, 2, 3]
v = [4, 4, 4]
alpha = 2
result = [alpha * sum(t) for t in zip(u,v)]
print(result) #[7, 10]

 

4) 행렬의 동치

2개의 행렬이 서로 같은지를 나타냄

- A = B : 2개의 행렬이 동치

- all() 함수 : and 조건, 모든 값이 참일 경우에만 True

- any() 함수 : or 조건, 하나라도 참이 있으면 True, 모두가 거짓일 때만 False

matrix_a = [[3,6], [4,5]]
matrix_b = [[1,1], [1,1]]
all([row[0] == value for t in zip(matrix_a, matrix_b) for row in zip(*t) for value in row])
#False

## 코드 이해하기 ##
matrix_a = [[3,6], [4,5]]
matrix_b = [[1,1], [1,1]]
for t in zip(matrix_a, matrix_b): 
    print("t:", t, type(t))   #t: ([3, 6], [1, 1]) <class 'tuple'>
    for row in zip(*t):
         print("row:", row, type(row)) #row: (3, 1) <class 'tuple'>
         for value in row:
            print("value: ", value)    #value: 3  value:  1
            print(row[0] == value)     #True      False #False가 최종
            
# >> 이렇게 반복되면서 전체 같아야 True 반환

 

5) 행렬 곱셈 matrix multiplication

- i번째 행벡터j번째 열벡터 사이의 내적을 성분으로 가지는 행렬 계산

- 행렬곱은 X의 열의 개수와 Y의 행의 개수가 같아야함

- XY != YX : X와 Y의 순서 달라지면, 계산하는 값들도 달라짐 > 즉, 순서 매우 중요

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

matrix_a = [[1,1,2], [2,1,1]]
matrix_b = [[1,1], [2,1], [1,3]]
result = [[sum(a*b for a,b in zip(row_a, column_b)) for column_b in zip(*matrix_b)] for row_a in matrix_a]
print(result) #[[5, 8], [5, 6]]

 

6) 역행렬inverse matrix 이해하기

- 어떤 행렬 A의 연산을 거꾸로 되돌리는 행렬

- 곱하는 순서와 상관없이 항등행렬로 돌아옴

  > 항등행렬 : 임의의 벡터(또는 행렬)을 곱해줬을 때, 자기 자신이 나오게 되는 행렬

- 행과 열 숫자가 같고[n = m]행렬식determinant이 0이 아닌 경우에만 계산 가능

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

- 역행렬 계산 불가일 때 : 유사역행렬pseudo-inverse OR 무어펜로즈Moore-Penrose 역행렬 A+ 이용

n = 열 // m = 행

<출처> 인공지능(AI) 기초 다지기 / 부스트코스

 

> 파이썬의 numpy 계산 & 행렬의 내적 & 응용은 추후에 numpy를 배운 뒤에 링크 or 내용 추가 예정

Comments