티스토리 뷰

boostcamp AITech

[6일차] 벡터와 행렬

라이크나우 2021. 1. 26. 00:14

 

벌써 6일차네 담주면 11일차네

난 항상 행과 열을 구별을 힘들어했다.....창피하고 머쓱하지만...

하튼 이번 기회에 확실히 뇌에 새겨야겠다.

 

내용이 나누기 좀 애매해서 중요한 부분은 글씨를 조금 크게 하는 방식으로 정리했다~

 

vertor

벡터란 숫자를 원소로 가지는 list이다. 아주 간단명료.

 

열벡터와 행벡터로 나눌 수 있는데, 

이렇게 표현된다~ 이건 코드상의 표현을 위한거고,

 

사실 좌표평면 위에서는 한 점까지의 상대적인 위치를 표현한다.

방향을 의미한다는거지,

 

같은 모양을 가질 경우 덧셈/뺄셈/성분곱이 가능하다.

 

벡터의 노름(norm)

노름은 원점에서부터의 거리를 뜻한다. 기호는 || x || <- 이렇게 짝대기 두개 두쌍

두가지 종류가 있다.

뭐 데이터분석때문에 무언갈 배울땐 항상 거리 구하는 방법이 참 여러개이다. 이번엔 두개밖에 없으니 잘 알아보자.

 

먼저 L1 노름이다.

👆단순히 요소들의 절대값을 더한거다.

d는 임의의 차원에 대해서 가능하다는 의미이다.

x=[3,-4,1,3,4] 이런 벡터가 있다면 L1 거리는 15

 

L2 노름은 유클리드 거리이다.

👆각 요소들의 제곱의 합을 나눈거~ 이정도는 거뜬하지~

 

벡터 사이의 거리와 각도

거리는 두 벡터 사이의 뺄셈을 이용!

👆이걸 보면 바로 이해가 되겠지?

 

이번엔 각도를 구해보자. 참고로 L2 노름에서만 가능하다.

 

제2코사인 법칙으로 각도를 계산해 볼 수 있는데, 여기서 옛날 옛적에 배운 제2코사인법칙을 한번 살피고 넘어가자.👇

이런 친구이다. 👆

여기서 다른 점은 음 cosA를 기준으로 보자,

 a^2의 값을 구할 수 있다는 점이 다르다.

A가 원점이라고 하면 a의 노름은 ||b-c||이다. 왜? 벡터의 거리는 뺄셈으로 구할 수 있다고 위에서 말했으니까!

그러니까 정리하자면 이런 식이 완성된다~👆

위의 분자를 쉽게 계산하는 방법이 있다는데 바로바로 내적이다.

👆즉 이렇게 식을 간단하게 만들 수 있다! 여기서 내적의 연산은 

이렇게 가능하다는 점! 

 

참고로 내적은 정사영한 길이를 곱하는거다 겁나 오랜만이다 진짜 나 고삼때 기하와 벡터 진짜 잘했었는데;;;

좋아했던 담임쌤의 과목 + 지금은 네카라쿠배간 수학과 오빠친구 과외쌤 버프로,,

 

하튼 벡터는 여기까지 이제 행렬을 다뤄볼거다.

 

행렬

행렬은 벡터를 원소로 가지는 2차원 배열이다!

row 행이 기본 단위이니 참고하자

 

👆이 그림을 참고하면 이해가 쉽다.

사실 이렇게 보니까 어려운거지 그냥 이차원배열로 생각하면 된다.

 

전치행렬은 여기서 행과 열이 바뀐다!

 

행렬의 연산

같은 모양을 가지면 덧셈, 뺄셈, 성분곱, 스칼라곱이 가능하다.

성분곱은 같은 인덱스 끼리 위치를 곱하는거고, 이게 바로 벡터와 똑같다!

스칼라곱은 똑같은 숫자를 곱해서 크기만 바꿔주는거니까 당연히 가능!

 

그리고 행렬의 곱셈은 수학에서 배운 그 곱셈이다.

i번째 행벡터와 j번쨰 열벡터를 곱해준다.

행과 열을 곱해주는 그거.👇

👆요거! 이건 @로 표현한다.

 

저 위에서 성분곱은 벡터와 똑같다고 했는데,

성분곱은 행렬의 shape가 같을 때만 가능하다(당연하다)

사실 여기서 벡터는 더 넓은 범위이다.

 

여기서 벡터는 저 위의 곱셈과는 조금 다른데, i번째 행벡터와 j번째 행벡터 사이의 곱을 구해준다!

👆이걸 보면 이해가 될거다. np.inner로 구하면 된다!

 

여기서 수학에서 말하는 내적과 np.inner는 다르다! 헷갈리면 안된다!

수학에서 말하는 스칼라이다. 그래서 tr(XYT) 로 계산한다. tr은 행렬의 대각합으로 대각선에 위치한 값들을 전부 더해주어 최종적으로 스칼라 결과를 낸다! 

하지만 numpy에서 제공하는 inner연산은 trace없이 XYT만 계산해준다. 즉 행벡터와 행벡터간의 내적만 수행할 뿐 따로 trace는 하지 않는다.

 

역행렬

마지막으로 역행렬은

곱해서 항등행렬이 되게 하는 행렬이다.

👆넘파이에서 역행렬을 구하는 방법은 np.linalg.inv()

역행렬은 행과 열의 숫자가 같아야하고 행렬식이 0이 아닌 경우에만 계산할 수 있다.

기호는 이렇게 생겼다.

 

그래서 역행렬을 계산 할 수 없을 때도 역행렬이 필요하다면 다른 대안이 있다.

 

바로 유사 역행렬 혹은 무어펜로즈 역행렬인데!

뭐..두가지 수식이 지나갔지만. 가뿐하게 넘기고 코드를 보자.

이런식으로 구현이 가능하다~

기호는

에이쁠이다

 

 

행렬을 이렇게 자세히 배우는건 

행렬이 벡터공간에서 사용되는 연산자로 이해할 수 있기 때문이다.

행렬곱을 통해 벡터를 다른 차원의 공간으로 보낼 수도 있고, 패턴을 추출하거나 데이터를 압축할 수도 있다!

 

 

이러한 행렬로 할 수 있는 일이 뭐길래 이렇게 배우는걸까?

방정식을 행렬로 나타낼 수 있다.

이거 영상정보 처리할 때 OpenCV 다루면서 잠시 했었다

위의 방정식을 아래의 행렬곱으로 나타낼 수 있다!

그럼 앞의 abc어쩌구 행렬의 (유사)역행렬을 양쪽 항에 모두 곱해주면 x시리즈를 구할 수 있겠지?

 

두번째로는 참 중요한 선형회귀분석이 가능하다.

선형 회귀 분석은 빨간 점들을 가장 잘 표현할 수 있는 선을 찾는거다.

최대한 잘 표현하는 선을 찾기 위해 점과 선 사이의 노름을 최소화 하는 행렬을 찾는게 목표이다!

여기서 우리가 구해야하는 weight 은 두개인데 주어진 데이터가 너~무 많아서 연립방정식 풀이처럼 풀리지가 않는다. 모두를 만족하는 weight가 존재할 수 없기 때문이다. 이에 우리는 선형회귀분석을 통해 가장 적절한 값을 찾아야한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함