지난번 포스팅에서는 특성방정식(chacacteristic equations)을 이용하여 고유값(eigenvalue)과 고유벡터(eigenvector)를 구하는 방법에 대하여 알아보았습니다.

 

이번 포스팅에서는 행렬의 대각화(diagonalization), 그리고 고유값과 고유벡터를 이용하여 n차 정방행렬의 p제곱을 구하는 방법을 소개하겠습니다.  이번 포스팅을 보고 나시면 왜 고유값, 고유벡터가 다방면에 두루두루 쓰이는지, 왜 중요한지 그 원리가 이해되실 거예요.

 

 

먼저, 대각행렬, 대각화, 대각행렬의 p 제곱으로 시작하겠습니다. 대각성분을 제외한 모든 성분이 0인 행렬을 대각행렬(diagonal matrix) 이라고 하며 diag(a11, a22, ..., ann) 으로 표기합니다. (아래의 예시 참조).  그리고 적절한 기저변환을 통하여 주어진 행렬을 대각행렬로 변환하는 것을 대각화(diagonolization)이라고 합니다.  대각화를 하면 정말 유용한 특성이 있는데요, n차 정방행렬의 p 제곱을 구하는 것이 정말 쉽다는 점입니다!!! 그냥 대각성분을 p 제곱 해주는 것으로 끝나거든요!!! (아래의 그림 참조).  

 

 

 

 

 

그럼 다음 단계로, 고유값, 고유벡터와 대각화가 무슨 관련이 있는지로 넘어가보겠습니다.

 

지난번 포스팅에서 예로 들었던 2차 정방행렬 A=를 가지고 계를 예를 들어보겠습니다.  정방행렬 A의 고유값 λ = {7, 2} 였으며, λ1 = 7에 대응하는 고유벡터는 (2  3)^T, λ2=2에 대응하는 고유벡터는 (-1  1)^T 였습니다.

 

 

 (* 고유값, 고유벡터 구하기 자세한 내용은 ☞  http://rfriend.tistory.com/182 )

 

 

위의 2차 정방행렬 A의 고유값(eigenvalue), 고유벡터(eigenvector)를 가져다가 고유값, 고유벡터의 정의에 대입한 두 개의 식을 정리하면 아래와 같습니다.  (중간에 보면 식의 양변에 역행렬(inverse matrix)를 곱하는 것이 나오는데요, 혹시 역행렬 잘 모르시면 http://rfriend.tistory.com/142 참고하세요. 행렬식(determinant) = 2*1 - (-1)*3 = 5로서 0이 아니므로 역행렬 존재합니다)

 

제일 아래에 정리된 결과의 형태를 유심히 보시기 바랍니다.

 

 

 

 

 

위에 정리한 식의 제일 아래 식에 설명을 달아보면 아래와 같습니다.  고유값과 고유벡터가 존재하는 정방행렬의 경우는 아래와 같이 분해가 가능하답니다.

 

 

 

 

위와 같이 정방행렬 A를 고유값과 고유벡터를 사용해서 분해를 하면 p 제곱하는 것이 어떻게 진행되는지 예를 들어보겠습니다.

 

 

 

 

위의 마지막의 계산 결과를 보면 재미있지요? ^^

 

계산 해본 김에 위의 2차 정방행렬 A의 3제곱을 계산해보겠습니다.

 

 

 

 

짜잔~ 제일 마지막에 3제곱한 결과를 보면 정말 아름답지 않은가요? ^^!

 

그럼, 문제를 하나 내볼께요.  위의 2차 정방행렬 A를 100 제곱하면 결과가 어떻게 나올까요? 

....

....

...

네, 맞습니다.  짐작하셨겠지만... 아래처럼 나옵니다.   

 

 

 

 

위에서 열심히 예를 들어서 계산을 해봤는데요, 이를 일반화해보자면,

n차 정방행렬(n order square matrix) 의 p제곱은 아래와 같이 쓸 수 있습니다.

 

 

 

 

여기까지 따라 오시느라 수고 많으셨습니다.

위의 고유값(eigenvalue)과 고유벡터(eigenvector)를 이용한 n차 정방행렬의 p제곱의 정리를 이용하면 p가 매우 크더라도 연산량을 줄여서 쉽게 p제곱을 구할 수 있습니다.  이게 참 중요하게, 요긴하게 여기저기서 많이 쓰입니다.

 

 

p차 정방행렬 A는 p개의 고유값(eigenvalue)  과 각 고유값에 대응하는 p개의 고유벡터(eigenvector) 를 가집니다. 이때 아래의 6개의 식은 동치(equivalent) 관계에 있는 명제들입니다. 

 

 

 

 

다음번 포스팅에서는 이번 포스팅에서 소개한 n차 정방행렬의 p제곱하는 방법을 적용한 마르코프 과정(Markov process)에 대해서 알아보겠습니다.

 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

Posted by R Friend R_Friend

지난번 포스팅에서는 행렬의 뜻, 형태, 표기법, R로 입력하는 방법에 대해서 소개하였습니다.

 

이번 포스팅에서는 특수한 형태의 행렬, 제로행렬(zero matrix), 전치행렬 (transpose matrix), 대칭행렬 (symmetric matrix), 상삼각행렬 (upper triangular matrix), 하삼각행렬 (lower triangular matrix), 대각행렬 (diagonal matrix), 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U)의 7가지에 대하여 차례대로 알아보겠습니다.  

 

아래에 소개하는 행렬 형태와 표기법도 잘 기억해두시면 나중에 유용할 거예요. 특히 전치행렬, 대각행렬, 단위행렬, 역행렬은 자주 사용하는 편이니 잘 기억해두면 좋겠습니다.

 

 

 

 

(1) 제로행렬 (zero matrix or null matrix)

 

모든 성분이 '0'인 행렬을 제로행렬, 또는 영행렬이라고 합니다.

 

 

 
> # zero matrix
> A_zero <- matrix(c(0, 0, 0, 0, 0, 0, 0, 0, 0), byrow = TRUE, nrow = 3)
> A_zero
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
> 
> B_zero <- matrix(rep(0, 9), byrow = TRUE, nrow = 3)
> B_zero
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

 

 

 

 

 

(2) 전치행렬 (transpose matrix)

 

행이 m개, 열이 n개인 m * n 행렬 (m by n matrix) 의 행과 열을 서로 바꾼 n * m 행렬 (n by m matrix)를 전치행렬이라고 합니다. 아래에 동그라미로 표시한 행렬의 성분들이 전치를 했을 때 서로 어디로 위치가 바뀌었는지를 유심히 살펴보시기 바랍니다.

 

 

 

 

전치행렬은 행렬 우측 상단에 대문자 'T'를 표기합니다.  아래 표기 예시를 참조하세요.

 

 

 
> # transpose matrix
> A <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), byrow = TRUE, nrow = 3)
> A
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
> 
> A_t <- t(A)
> A_t
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9
> 
> 
> B <- matrix(c(4, 5,  6, 7, 8, 9), nc=3)
> B
     [,1] [,2] [,3]
[1,]    4    6    8
[2,]    5    7    9
> 
> B_t <- t(B)
> B_t
     [,1] [,2]
[1,]    4    5
[2,]    6    7
[3,]    8    9

 

 

 

 

 

 

(3) 대칭행렬 (symmetric matrix)

 

대칭행렬이란 대각성분을 중심으로 대칭인 n차정방행렬로서, 원래 행렬과 전치행렬이 동일한 경우를 의미합니다. (* wikipedia : a symmetric matrix is a square matrix that is equal to its transpose)

 

 

 

 

 

 

> # symmetric matrix
> s <- matrix(c(1:25), 5)
> s
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25
> 
> lower.tri(s, diag=FALSE)
      [,1]  [,2]  [,3]  [,4]  [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE FALSE
[3,]  TRUE  TRUE FALSE FALSE FALSE
[4,]  TRUE  TRUE  TRUE FALSE FALSE
[5,]  TRUE  TRUE  TRUE  TRUE FALSE
> s[lower.tri(s, diag=FALSE)]
 [1]  2  3  4  5  8  9 10 14 15 20
> t(s)[lower.tri(s, diag=FALSE)]
 [1]  6 11 16 21 12 17 22 18 23 24
> 
> s[lower.tri(s, diag=FALSE)] = t(s)[lower.tri(s, diag=FALSE)]
> s
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    6    7   12   17   22
[3,]   11   12   13   18   23
[4,]   16   17   18   19   24
[5,]   21   22   23   24   25

 

 

 

 

 

(4) 상삼각행렬 (upper triangular matrix)

 

 상삼각행렬은 대각성분 아래의 성분이 모두 '0'인 n차정방행렬입니다.  아래의 색깔 칠해놓은 행렬 예를 보면 금방 이해할 수 있을 거예요.

 

 

R의 base패키지 내 lower.tri(x, diag=FALSE) 함수를 이용하여 상삼각행렬(upper triangular matrix)를 아래에 만들어보았습니다.

 

 

> # upper triangular matrix
> (m_upper <- matrix(1:20, 4, 4))
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> 
> lower.tri(m_upper, diag=FALSE)
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE FALSE FALSE FALSE
[2,]  TRUE FALSE FALSE FALSE
[3,]  TRUE  TRUE FALSE FALSE
[4,]  TRUE  TRUE  TRUE FALSE
> m_upper[lower.tri(m_upper, diag=FALSE)] <- c(0)
> m_upper
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    0    6   10   14
[3,]    0    0   11   15
[4,]    0    0    0   16

 

 

 

 

 

(5) 하삼각행렬 (lower triangular matrix)

 

하삼각행렬은 대각성분 위의 성분이 모두 '0'인 n차정방행렬로서, 상삼각행렬과 '0'이 있는 위치가 대각선으로 반대임을 알 수 있습니다.

 

 

R의 base패키지 내 upper.tri(x, diag=FALSE) 함수를 이용하여 하삼각행렬(lower triangular matrix)를 아래에 만들어보았습니다. 

 

 
> # lower triangular matrix
> (m_lower <- matrix(1:20, 4, 4))
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> 
> upper.tri(m_lower, diag=FALSE)
      [,1]  [,2]  [,3]  [,4]
[1,] FALSE  TRUE  TRUE  TRUE
[2,] FALSE FALSE  TRUE  TRUE
[3,] FALSE FALSE FALSE  TRUE
[4,] FALSE FALSE FALSE FALSE
> m_lower[upper.tri(m_lower, diag=FALSE)] <- c(0)
> m_lower
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    2    6    0    0
[3,]    3    7   11    0
[4,]    4    8   12   16

 

 

 

 

 

(6) 대각행렬 (diagonal matrix)

 

대각행렬은 대각성분 이외의 모든 성분이 모두 '0'인 n차정방행렬을 말하며, 아래 예의 대각행렬의 경우 대각성분만을 따다가 diag(1, 2, 3, 4)로 표기합니다.

(* wikipedia : a diagonal matrix is a matrix (usually a square matrix) in which the entries outside the main diagonal (↘) are all zero. The diagonal entries themselves may or may not be zero.)

 

 

 

위에서 소개했던 제로행렬(zero matrix)과 바로 아래에 소개할 단위행렬(unit matrix) 또는 항등행렬(identity matrix)도 대각행렬(diagonal matrix)에 속한다고 할 수 있겠습니다.

 

그리고 대각행렬은 상삼각행렬(upper triangular matrix) 또는 하삼각행렬(lower triangular matrix)에 속한다고도 할 수 있겠습니다.

 

 

R의 diag(A) 함수를 사용해서 위의 diag(1, 2, 3, 4) 대각행렬을 만들어보겠습니다.

 

 

 

> # diagonal matrix
> A <- c(1, 2, 3, 4)
> diag(A)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    2    0    0
[3,]    0    0    3    0
[4,]    0    0    0    4
 

 

 

 

대각행렬의 곱셉, P승은 아래와 같이 각 성분의 P승이 되는 재미있는, 유용한 특성을 가지고 있습니다.

 

 

 

 

 

(7) 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U)

 

항등행렬 또는 단위행렬은 대각성분이 모두 '1'이고 그 이외의 모든 성분은 '0'인 n차정방행렬을 말하며, identity matrix 의 첫 대문자를 따서 'I' 로 표기하거나 unit matrix의 첫 대문자를 따서 'U'로 표기합니다. (일부 수학책에서는 독일어 Einheits matrix의 첫 대문자를 따서 'E'로 표기하기도 함)

 

(* wikipedia : the identity matrix or unit matrix of size n is the n × n square matrix with ones on the main diagonal and zeros elsewhere)

 

 

 

항등행렬 또는 단위행렬 In을 행렬 Amn 에 곱하면 그대로 Amn이 됩니다.  어떤 수에 '1'을 곱하면 그대로 원래의 수가 되기 때문입니다.

 

 

 

 

R의 diag(k) 함수로 k by 항등행렬 또는 단위행렬을 만들 수 있습니다.

 

 

> # identity matrix or unit matrix : diag(k) > diag(4) [,1] [,2] [,3] [,4] [1,] 1 0 0 0 [2,] 0 1 0 0 [3,] 0 0 1 0 [4,] 0 0 0 1

> 

> diag(6) [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 0 0 0 0 0 [2,] 0 1 0 0 0 0 [3,] 0 0 1 0 0 0 [4,] 0 0 0 1 0 0 [5,] 0 0 0 0 1 0 [6,] 0 0 0 0 0 1

 

 

 

 

항등행렬 또는 단위행렬의 역행렬(inverse matrix, 바로 아래에 설명)은 단위행렬입니다.  단위행렬과 역행렬은 매우 중요한 행렬이므로 꼭 잘 이해를 해두시는게 좋습니다.

 

 

다음번 포스팅에서는 역행렬(the inverse of a matrix, invertible matrix)에 대해서 소개하겠습니다.

 

많은 도움이 되었기를 바랍니다.

 

행렬, 벡터 관련 이전 포스팅은 아래 링크를 걸어놓았습니다.

 

행렬 기본 이해

가우스 소거법을 활용한 역행렬 계산

여인수를 활용한 역행렬 계산

행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums())

벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)

벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)

벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)


 

이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^

 

Posted by R Friend R_Friend