본문 바로가기
Data Science/문과생을 위한 딥러닝 수학

문과생을 위한 딥러닝 수학 - 핵심편 (1)

by 싸코 2018. 6. 20.


들어가며...


그동안의 바쁜 일정으로 인해서 2달 만에 포스팅을 하게 되었습니다... 다른 카테고리의 글들도 업데이트를 해야 하나 우선 가장 급하다고 생각하는 '수학'에 대해서 먼저 다루려고 합니다.


기초편에서도 말했듯이 데이터를 분석하거나 머신러닝, 딥러닝을 하기 위해서는 약간의 수학적 개념만 알아도 충분히 할 수 있지만 실무 프로젝트와 학업을 진행하면서 느낀 점은 수학적인 뒷밤침이 없다면 단순히 코드만 돌리고 결과만 확인하게 된다는 것입니다. 이는 모래 위에 쌓은 성과 같은 '사상누각'이라고 할 수 있습니다. 데이터 과학의 대부분은 우리 주변의 문제 'What'을 해결하고자 하지만 우리가 수행한 'How'에 대한 'Why'가 충분히 뒷받침 되지 않는다면 결과의 정확도나 해석의 타당성이 떨어집니다. 또 어떤 예측 모형을 구축한다고 했을 때 그 과정에서 발생하는 문제를 적절하게 해소하지 못할 수 있습니다.


그렇다면 수학을 왕창 다 배워야 하느냐? 그건 아닌 것 같습니다. 선형대수와 행렬 미분 정도만 그 기본 개념을 제대로 짚고 넘어간다면 충분하다는 생각을 했습니다. 딥러닝은 벡터의 연산 집합이라고도 할 수 있습니다. 그 유명한 PCA도 벡터 연산이 중심입니다.


최근 Coursera에서 Mathematics for Machine Learning이라는 Specialization을 오픈했습니다. 딱! 제가 필요로 하던 수학만 학습할 수 있도록 준비되어 있습니다. 제 스스로도 너무 오랫동안 수학을 안했고 필요성을 느껴 필요한 것만 되짚어 보기 위해, 다시 공부하기 위해 위 강의를 수강하며 들은 내용들을 정리하려고 합니다.


  • Linear Algebra
  • Matrix Calculus
  • PCA

세 과목에 대해서 다룰 예정이고 각 과목의 핵심 포인트는 앞으로 다루면서 다룰 예정입니다. 먼저 선형대수를 하려고 합니다. Coursera에서는 Beginner 과정으로 선행 지식이 필요없다고 하지만 기초적인 수식에 대한 이해와 배경지식을 필요로 합니다. 따라서 만약 저와 같이 문과 출신으로 수학적 배경이 전무하신 분들은 아래에 소개한 이전 포스트들을 먼저 읽으시면 좋을 것 같습니다.

  1. 문과생을 위한 딥러닝 수학 - 쌩기초편, 기본편 [Link]
  2. Python 기초 - Numpy로 선형대수 표현하기 [Link]


제가 직접 해보진 않았지만 칸 아카데미의 Linear Algebra도 굉장히 유용하다고 합니다. 칸 아카데미는 수학을 정말 쉽게 공부할 수 있도록 그것도 무료로! material을 제공하고 있습니다.







선형대수 Linear Algebra


1. 데이터 과학에서 벡터란 Vector in Data Science

대부분의 현실 세계의 문제를 해결하기 위해서 우리는 시스템을 만들고 어떤 모형을 만듭니다. 일명 머신러닝이라는 방법으로 구축하는 추상화된 수학적 모형을 통해서 예측을 하거나 분류를 하거나 합니다. 그런데 데이터 분석을 하고자 하는 저와 같은 사람들에게 엄청난 장벽이 있습니다. 바로 수학입니다... 대부분의 자료나 강의들은 우리가 당연히 수학이나 컴퓨터과학적인 지식이 있다고 가정하고(강의마다 이 가정의 편차가 극심합니다...) 진행되기 때문에 겉핥기로도 공부하기가 굉장히 힘듭니다.

이 수학적 모형이라는 것이 결국 벡터(Vector), 벡터 공간(Vector Space)으로 표현(representation)되며 대부분의 연산(operation)은 이러한 벡터 공간들간의 연결(mapping)을 통해서 이루어지기 때문에 가장 먼저 이를 다루는 선형대수를 알아야 합니다. 유명한 구글의 Page Rank는 이러한 벡터, 행렬 연산을 통해 만든 하나의 예시입니다.


행렬 연산은 우리가 아는 연립방정식에서도 발견할 수 있습니다. 연립방정식은 문과생을 위한 수학 기본편에서 확인하실 수 있습니다. 어쨌든 2x + 3y = 8 이라는 방정식과 3x + 2y = 7이라는 두 방정식을 통해서 우리는 x와 y의 값을 구할 수 있습니다. 머신러닝에서 fitting한다는 것은 이 x와 y를 찾아가는 것이라고도 할 수 있습니다. coursera 강의에서 연립방정식에 대해 이해하고 있는지 먼저 테스트를 하였습니다.

Python으로 아래의 test 문제를 풀 때는 NumPy의 linalg.solve 메소드를 사용하여 연립방정식의 해를  구할 수 있습니다.

5x - 2y = -13
4x +5y = -6

In [1]: import numpy as np
In [2]: a = np.array([[5,-2],[4,5]])
In [3]: b = np.array([-13, -6])
In [4]: x = np.linalg.solve(a, b)
In [5]: x
Out[5]: array([-2.33333333,  0.66666667])


아래의 분포 그래프는 사람들의 신장(height)에 대한 히스토그램을 분포 그래프로 표현한 것입니다. 신장이 큰 사람부터 작은 사람까지 정규분포 모양으로 모집단(population)이 존재할 지 모릅니다. f(x)은 신장에 대한 분포를 표현한 함수로 μ와 σ 두 개의 파라미터로 구성 되어 있습니다. 이 파라미터를 적합(fitting)시켜서 모집단에 대한 적절한 분포를 찾아갈 수 있습니다. μ가 움직인다면 분포 전체가 왼쪽, 오른쪽으로 이동할 것이고, σ가 변한다면 분포의 종모양이 얇게 올라가거나 또는 평평하게 내려 앉을 수 있습니다.

오른쪽의 등고선 모양은 μ와 σ 두 개의 파라미터가 존재할 수 있는 영역을 표시한 것이고 이 값을 변화시키면서 최적의 파라미터 값을 찾아나가게 됩니다.(value of goodness) 이렇게 실제로 표현/추정하기 위해 파라미터를 적합하는 것은 머신러닝을 아는 이들에게는 많이 익숙한 개념입니다. 벡터는 이를 도와줍니다. 단순히 Physics에서만 다루어지는 것이 아닌 우리의 현실 세계에 대해서 표현하는 방법이 되고 우리는 이를 통해 많은 문제를 해결해볼 수 있습니다.



다음은 벡터에 대한 정의입니다.

2. 벡터(vector)의 정의

1) A list of numbers

 - 컴퓨터에서 보듯이 단순히 일련의 숫자 리스트로 볼 수 있고, 숫자이기때문에 연산이 가능한 것

2) Position in three dimensions of space and in one dimension of time

 - 아이슈타인은 '시간(time)'도 하나의 차원(dimension)이라고 했다. 3차원의 우리 세계에 시간이라는 차원이 추가된 4차원으로 세상을 볼 수 있다. 

3) Something which moves in a space of fitting parameters

 - 이 모든 것은 벡터 공간(vector space)로 표현이 가능하고 벡터공간 안에서 값을 변경해가며 파라미터 최적화를 통해 우리가 얻고 싶은 solution을 얻을 수도 있다.

As we will see, vectors can be viewed as a list of numbers which describes some optimisation problem.





3. 벡터 연산 Vector Operation

벡터는 크기와 방향을 가지고 있습니다. 어떤 벡터 공간 안에서 이것이 표현 가능하며 머신러닝에서는 보통 위에서 다룬 연립방정식에서처럼 벡터로 만들고 벡터 공간안에서 적절한 parameter를 찾기 위해 fitting하는 과정을 갖습니다. parameter를 최적화하는 과정이 Vector Space에서 크기와 방향을 바꿔가면서 움직이는 것과 같으며 사람이 조금씩 수정하면서 찾는 것이 아닌 알고리즘을 통해 자동적으로 최적의 해를 찾아가는 것이 차이입니다.

3.1 벡터의 합연산은 순서와 관계가 없다




3.2 벡터의 스칼라(넘버) 곱연산은 scalar 만큼 반복하는 것이고 -(minus)는 반대로 방향이 바뀐다




3.3 벡터는 크기(size/length)와 방향(direction)을 가졌다.

벡터의 크기와 방향을 표현할 때는 이렇게 계산해서 구할 수 있다. 피타고라스 정리를 사용한 것입니다.



# Simple Python code for Calculation of vector size

In [1]: import numpy as np

In [2]: a = np.array([1, 3, 4, 2])

In [3]: size_of_a = np.sqrt(np.sum(np.square(a)))

In [4]: size_of_a

Out[4]: 5.4772255750516612


3.4 Dot Product ★★★

무슨무슨 법칙으로 보통 설명하지만 쉬운 이해를 위해서 풀어서 설명합니다. 아래는 벡터 내적의 법칙입니다.

1) commutative : 순서를 바꿔도 결과는 동일합니다.  rs=sr
2) distributive : 괄호 안의 벡터를 풀어서 계산할 수 있습니다. r(s+t) = rs+rt
3) associative : 순서가 상관이 없기 때문에 결합이 자유롭게 됩니다. r(as) = a(rs), r(iasi)+rj(asj) = a(risi+rjsj)




# Simple Python code for dot product

In [1]: import numpy as np

In [2]: a = np.array([-5, 3, 2, 8])

In [3]: b = np.array([1, 2, -1, 0])

In [4]: np.dot(a, b)

Out[4]: -1


Dot Product : Its simply the projection of one vector onto the other multiplied by the magnitude of other vector . The dot product tells you what amount of one vector goes in the direction of another (Thus its a scalar ) and hence do not have any direction .

a.b= ||a|| ||b|| cos(θ). Alternatively if a=(x1,y1) and b=(x2,y2) (Position vectors) the dot product is x1.x2+y1.y2 .







3.5 Cosine Rule을 벡터로 바꾸어봅시다


삼각형의 세 변 a, b, c는 벡터 r, s. r-s로 표현됩니다. 각도는 θ입니다. 코사인 법칙 을 벡터로 바꾸면 

가 됩니다. cos 90도 일때는 이 값이 0이 되므로 rs=0이 되고 아래의 그림처럼 직각인 상태에서는 전체가 0이 됩니다. cos 0도일 때는 그 값이 1이며 rs=1이 됩니다. 이 때는 r과 s 벡터가 같은 방향을 가집니다.


이미 딥러닝을 공부하신 분들은 아시는 내용이지만 cos 90도로 벡터 간 각도가 90인 것은 벡터가 서로 직교(Orthogonal)함을 의미합니다. 다른 딥러닝 포스팅에서도 이 내용을 다루었습니다. one-hot encoding 방식은 벡터간의 내적이 0이 되므로 interaction이 고려되지 않음을 말하고 그래서 확률적 표현(probabilistic representation)을 통해 이를 극복하고자 하기도 하였습니다.


직교한다는건 서로 만날 일도 없고 연관되지 않는다고도 볼 수 있는데 방금 증명하였듯이 90도일 때는 두 벡터의 내적(dot product)이 0이 되기 때문에 이를 뒷받침해줍니다. 직교에 대한 자세한 내용은 이후에 더 다룰 것으로 보입니다. cosine 180도라면 -1이므로 두 벡터간의 관계가 반대방향으로 될 것입니다. ←→ 이런식으로.


벡터의 내적을 통해서 벡터간의 관계를 확인할 수 있었습니다. 우리가 통계시간에 배운 interaction term은 이것과 관련있습니다. (임의의 변수 a와 변수 b를 곱해 변수 ab를 만들어 interaction을 분석해 보셨을 것입니다...  사회과학에서 자주 사용하는 방법입니다)




3.6 Projection ★★

강의에서는 Shadow라는 표현을 사용해서 벡터끼리 투영되는 것을 설명하였습니다. 이는 하나의 벡터와 또 다른 벡터는 각도θ 만큼 벌어져 있는 삼각형 모양으로 되어 있다고 했을 때 두 벡터가 직교하지 않는 이상 하나의 벡터에서 다른 벡터로 내렸을 때 만나는 지점이 이 생깁니다. 그 지점으로 부터 처음의 벡터까지의 length를 projection이라고 부릅니다. 한국말로는 투영되었다고 하는데 투영投影이라 함은 '물체의 그림자를 어떤 물체 위에 비추는 일 또는 그 비친 그림자'를 의미합니다. 또 다른 말로는 투영投影이라고 하며 다른 공간에서 곧은 선을 쏜다는 의미도 가지고 있습니다. 보통 직각이 되도록 곧은 선을 투영합니다.

벡터의 내적(dot product)은 투영되는 벡터의 크기와 나머지 투영을 시작하는 벡터의 크기 곱하기 cosθ로 표현됩니다. 
If \mathbf{r} and \mathbf{s} are perpendicular, the scalar projection is .

그래서 두 벡터가 직교했을 때 서로 투영하는 부분이 전혀 없기 직각으로 선을 내렸을 때 겹치는 부분이 0이 됩니다. 이렇게도  설명할 수 있습니다. 아래의 판서는 앞의 내용들을 정리한 것이며 아래 |s|cosθ는 인접한 영역의 투영을 의미하는 것으로 벡터 s가 벡터 r에 얼마만큼 투영되는지를 보여주는 것입니다. 결과적으로 두 벡터 r, s의 내적(dot product)은 한 벡터와 그에 투영되는 다른 벡터에 대한 관계가 표현된다고 볼 수 있습니다.


한 벡터의 변화를 다른 벡터가 얼마만큼 설명할 수 있는가가 Projection의 핵심이다




Scalar projection

그리고 이는 역으로 투영되는 정도가 얼마나 되는지 볼 수 있다는 의미이기도 합니다. scalar projection으로 이를 계산할 수 있습니다. 두 벡터의 내적에서 한 벡터의 크기 만큼 나눠주면 인접하는 벡터의 투영 정도를 계산할 수 있습니다. 결과 값은 scalar(숫자)입니다.


☞ 투영되는 정도 = |s|cosθ = r.s / |r|


# Simple Python code for Scalar Projection

In [1]: import numpy as np

In [2]: r = np.array([3, -4, 0])

In [3]: s = np.array([10, 5, -6])

In [4]: np.dot(r, s) / np.sqrt(np.sum(np.square(r)))   # r.s / |r|

Out[4]: 2.0


Vector projection

☞  r (r.s / |r| |r|) 



# Simple Python code for Vector projection

In [1]: import numpy as np

In [2]: r = np.array([3, -4, 0])

In [3]: s = np.array([10, 5, -6])

In [4]: def size_of_vector(vector):                                 # function for calculating length of vector

   ...:     return np.sqrt(np.sum(np.square(vector)))

In [5]: (np.dot(r,s)/(size_of_vector(r)*size_of_vector(r)))*r    # Calculation of  r (r.s / |r| |r|)

Out[5]: array([ 1.2, -1.6,  0. ])

 


Summary of Projection

  • The scalar projection of a vector u onto a vector v is qu, where q is the unit vector in the direction of v

  • The vector projection of u onto v is the scalar projection of u onto v times q, where q is the unit vector in the direction of v.

  • The vector projection of u onto v is the best approximation of u in the direction of v, in the sense that the difference between u and its vector projection onto v is orthogonal to v.

  • The work done by a force that is applied at an angle to the displacement vector can be computed by projecting the force vector onto the displacement vector, and then multiplying the magnitudes of the force and displacement vectors.


Sample Quiz solving by python

|a|+|b|의 결과가 더 크게 나왔습니다. 우리가 피타고라스의 정리를 생각해보면 간단합니다. 빗변 c의 제곱은 양변 a와 b의 각 제곱을 합친 값과 같다는 사실을 떠올려보면 쉽게 이해가 될 것입니다. 이것을 "Triangle Inequality"라고 부르는데 삼각형을 만들기 위해서는 양변의 길이의 합이 빗변보다 길어야 삼각형을 만들 수 있다는 것을 의미합니다. 아래의 코드로 문제를 풀었습니다.


# Simple Python code for 'triangle inequality'

In [1]: import numpy as np

In [2]: def size_of_vector(vector):

   ...:     return np.sqrt(np.sum(np.square(vector)))

In [3]: a = np.array([3, 0, 4])

In [4]: b = np.array([0, 5, 12])

In [5]: res1 = size_of_vector(a+b)

In [6]: res2 = size_of_vector(a) + size_of_vector(b)

In [7]: print(res1, res2)

17.0293863659 18.0




4. Changing basis (co-ordinate system)

딥러닝에서 많이 하는 것이 어떤 문제를 다른 고밀도의 벡터로 표현하는 방법이 많은데 수학적으로는 하나의 coordinate system에서 다른 coordinate system으로 바꾸는 것과 비슷하다고 합니다. 대부분의 머신러닝 문제가 이것과 상당히 밀접한 관련이 있습니다. 


좌표계(coordinate system)

 "숫자나 좌표를 이용해서 유클리디안 공간안에서 기하학적으로 문제를 표현하는 시스템"


앞에서 다루었던 projection product를 통해서 basis space에서 새로운 space로 데이터의 표현이 가능해진다고 합니다. 

그리고 기저 벡터(basis vector)를 알아야 새롭운 벡터를 정의할 수 있다. 아래 그림을 보면 re라는 벡터는 청므의 기저벡터인 e1과 e2 벡터를 통해서 [3, 4]라는 새로운 벡터를 만들어 냈는데 여기서 새로운 기저 벡터 b1, b2를 사용해 rb라는 새로운 벡터를 만들어내었다. 기존의 re 벡터와 b1, b2 각 벡터와의 projection을 구하여 2b1, 0.5b2로 벡터 rb를 표현할 수 있었다.


다른 축을 사용해서 데이터를 새롭게 표현한 것이다. 이를 dot / projection product를 통해서 통해서 간단하게 해볼 수 있었다. 아래는 dot product가 깔끔하고 빠르게 되는 벡터의 직교(orthogonal) 사례입니다. 다르게 생각해보면 computation을 빠르게 하려면 벡터들을 직교로 만들어주는게 좋은데 기저변환(changing basis)을 통해서 직교 상태로 basis axis를 만들어 놓고 새롭게 벡터를 구할 수도 있습니다.





In [1]: import numpy as np

In [2]: def sov(vector):  #size of vector

   ...:     return np.sqrt(np.sum(np.square(vector)))

In [3]: re = np.array([3, 4])

In [4]: b2 = np.array([-2, 4])

In [5]: np.dot(re, b2) / np.square(sov(b2))

Out[5]: 0.4999999999999999


위의 코드는 re 벡터에 대해서 새로운 basis(기저)로 표현하고자 할때 그 projection을 구하는 문제였습니다. 결과는 0.5가 나왔고 b2에 대해서는 0.5 선형결합(;곱하기)을 해주면 re 벡터를 새로운 기저로 표현 가능합니다. 동일한 방식으로 계산했을 때 b1에 대해서는 2가 나왔습니다. 결과적으로 벡터 re는 기존의 e1, e2벡터에서 [3,4]로 표현됐으나 새로운 기저 b1, b2에서는 re = [2, 0.5] 로 새로운 기저에서 표현이 가능합니다.




In [1]: v = np.array([5, -1])

In [2]: b1 = np.array([1,1])

In [3]: b2 = np.array([1,-1])

In [11]: np.dot(v, b1) / np.square(sov(b1))

Out[4]: 1.9999999999999996    ## == 2

In [5]: np.dot(v, b2) / np.square(sov(b2))

Out[5]: 2.9999999999999996    ## == 3

### vb = [2, 3]


#귀찮아서 기저변환하는 함수를 만들었다.

In [6]: def sov(vector):  #size of vector

   ...:     return np.sqrt(np.sum(np.square(vector)))

In [7]: def change_basis(v, b1, b2):

    ...:     vb1 = np.dot(v, b1) / np.square(sov(b1))  #  vector projection 구하는 부분

    ...:     vb2 = np.dot(v, b2) / np.square(sov(b2))

    ...:     print(vb1, ',', vb2)

    ...:     return np.array([vb1, vb2])

In [8]: v = np.array([10, -5])

In [9]: b1 = np.array([3, 4])

In [10]: b2 = np.array([4, -3])

In [11]: vb = change_basis(v, b1, b2)

### vb = [0.4 , 2.2]






5. Basis, Vector space, Linear independence

Basis is a set of n vectors that:

  • basis are not linear combinations of each other (linearly independent)
  • basis span the space
  • The space is then n-dimensional
만약 c1x1 + c2x2 와 같이 선형결합(linear combination) 조합으로도 0을 만들 수 없을 때 벡터 x1, x2는 독립이라고 말합니다. c1과 c2가 0아닌 조건아래일때.

벡터 b3가 벡터 b1과 벡터 b2에 대해서 선형적으로 독립적(linearly independent)이라고 하려면

b3 does not lie in the plane spanned by b1 and b2. b1과 b2의 선형결합과 같은 방식으로 확장된 다른 평면에 b3가 존재하면 안된다는 이야기입니다. 그리고 algebraic way로 표현했을 때 b3 != a1b1+a2b2이어야 합니다. 다른 차원(평면)에 존재해야 독립적이라고 할 수 있습니다.

예를 들어서,
a = [1, 1] ,  b1 = [2, 1],  b2= [2, 2] 라는 벡터가 있다고 합시다. a를 span(넓혀서)해서 b1과 b2를 만들 수 있다면 a와 b1, b2 간에는 dependency가 있는 것입니다. b1은 a에서 scalar multiplication을 해도 만들기 어려워 보입니다. 반면에 b2는 a에 scalar 2를 곱하면 만들 수 있습니다. 따라서 b1은 독립적이고, b2는 종속적이라고 할 수 있습니다.
이런식으로 기존의 basis에서 span이 된다면 그 벡터는 linearly dependent하다고 볼 수 있습니다.

제가 정리한 내용들은 캐주얼한 설명이므로 조금 더 공학적으로 정확하게 이해하길 원하시는 분들은 여기 블로그에서 자세한 내용을 보시면 좋습니다. 




6. Applications of changing basis = Changing reference frame

지금까지 dot product와 projection 그리고 basis와 change of basis(기저변환)에 대해서 다루었습니다. 이제 데이터 과학에서 왜 이러한 것들을 배워야 했는지 조금은 이해한 것 같습니다. 아래와 같이 X, Y 축에 데이터를 매핑하였다고 봅시다. 붉은 색 데이터 포인트들에 가장 잘 fit하는 선을 그리는 것이 일반적인 선형회귀의 문제입니다. 저 선으로부터 직교(orthogonal)하는 선을 그렸을 때 저 선으로부터 데이터까지 떨어지는 것은 noise 입니다. 저 noise를 가장 적게 하는 것이 데이터를 가장 올바르게 표현하는 방법이 될 것입니다. noise에 대한 정보가 모인 noise vector에 직교하는 선이되는 것입니다. 아래의 그림을 보면 위에서 우리가 보았던 형태의 직교하는 선이 추가로 그려졌고 이를 통해서 우리는 vector projection과 같은 방법으로 transformation이 가능합니다. 기존에 X-Y에 찍혔던 데이터를 새로운 선으로 표현할 수 있게 되는 것입니다. 



머신러닝과 인공신경망을 이미 알고 있는 분들은 이미지를 분석할 때 이미지로 들어온 픽셀pixel 데이터가 새로운 basis에서 코나 피부 형태, 눈 사이의 거리 같은 것들을 묘사하기 위해 기존의 basis에서 바뀌는 것을 자주 보았을 것입니다. 우리가 보통 weight vector라고 말하는 vector에서 transformation이 일어나게 됩니다. 이 weight vector를 조정하기 위한 다른 vector space인 parameter function에 대한 space도 존재하게 됩니다. 자세한 건 앞으로 차차 다루도록 하겠습니다.



지금까지 배운 내용들은 하나의 공간에서 다른 공간으로 새롭게 데이터가 표현되는 것을 이해하기 위해서 선형대수(Linear Algebra)를 다루었습니다.








7. Matrices in Linear Algebra

머신러닝 또는 딥러닝에서 매트릭스는 vectors를 transform하기 위한 것으로서 많이 사용된다.


Linear Algebra is a mathematical system for manipulating vectors in the spaces described by vectors.



How matrices transform space

고등학교 때 배웠던 행렬연산으로 아래의 [[2, 3], [10, 1]] * [a b] 문제를 풀 수 있습니다. vector space를 transform한다는 관점에서는 조금 다르게 볼 수 있다. 앞에서 다루었던 basis를 관점으로 풀이해볼 수도 있다. 원래의 기저 벡터인 e1_hat = [1, 0], e2_hat = [0, 1] 두 기저벡터로부터 e1', e2'을 계산해볼 수 있다. 

그 아래 [[2, 3], [10, 1]] * [3, 2]에서 [3, 2] 부분을  3*[1, 0] + 2*[0, 1]으로 볼 수 있고 이는 3*e1_hat, 2*e2_hat의 형태이다. 아래의 matrix multiplication을 통해 구한 결과는 기존의 기저에서 이동(transform)한 결과라고 볼 수 있는 것이다.




Types of matrix transformation

기존의 기저(basis)를 변경해서 새로운 기저로 표현하는 것이 matrix transformation이라고 볼 수 있는데


[ [1, 0], [0, 1] ] 의 행렬이 있다고 했을 때 1을 -1로 바꿔주면 matrix rotation이 발생하게 되고 matrix가 변하게 된다(transformation).


shears, stretches and inverses 등의 방식으로 matrix가 rotation되기도 하고 combination되기도 하면서 변화하게 된다. 


transformation이라는 것이 다른 곳으로 매핑(mapping)한다고 봐도 되는데 coordinate system이 바뀌게 되는 것이다. 

그중에서도 선형 변환(linear transformation)은 하나의 벡터 안에 있는 각 element를 다른 벡터의 각 element에 사상(mapping)하는 것이다.

행렬 변환(matrix transformation)은 


shear

 : 고정된 방향으로 각 포인트를 그 방향과 평행한 라인에서 부호가 있는 거리에 비례하는 양만큼 이동시키는 선형 맵 (출처: 위키백과) 

Mesh Shear 5/4


 


참고자료









http://www.math.usm.edu/lambers/mat169/fall09/lecture22.pdf


























댓글