'matrix by cbind()'에 해당되는 글 1건

  1. 2015.11.27 R (1) 행렬의 기본 개념 2

경영과학/최적화, 다변량 통계분석, 머신러닝을 제대로 이해하고 활용하려면 선형대수(linear algebra)와 미적분(differential and integral)에 대한 이해가 필요합니다. 상호 연결되어 있고 영향을 미치는 복잡한 세상에서 단변량만을 가지고 문제를 풀기에는 역부족이기 때문에 다수의 변수를 가진 문제를 풀어야 하는 경우가 대부분입니다.

 

따라서, 경영과학/최적화에 들어가기 전에 그 기초가 되는 행렬(matrix)에 대한 기초와 행렬 연산에 대해서 알아보도록 하겠습니다.  행렬을 사용하면 1차 연립방정식을 시각적으로 보기에 깔끔하고 편리하게 나타낼 수 있으며, 최적화 기법 중에 선형계획법을 풀 때 이를 사용할 수 있고, 컴퓨터로 해를 찾을 때도 행렬식으로 목적함수와 제약조건을 입력하게 됩니다.  왜 행렬에 대한 기본 개념과 연산에 대해서 먼저 짚고 넘어가야 하는지 이해가 되셨을 겁니다.  

 

이공계 계열을 전공한 분이라면 기본적으로 선형대수, 미적분은 배웠을 텐데요, 문과생들은 그렇지 못하다보니 처음에 최적화, 다변량 통계분석에 나오는 수식을 보고는 이게 무슨 소리인지 이해를 못해서 어려움을 겪고, 심하면 좌절하고 포기하기도 쉽답니다. (제가 처음에 그랬습니다. 시계열분석 공부하다가 수식에 질려서 토할 것 같은 어지럼증을...^^;)

 

 

행렬(matrix)이란 숫자나 상징, 표현을 직사각형 또는 정사각형 모양으로 m행과 n열로 배열하고 괄호로 묶은 것을 말합니다(* Wikipedia : "In mathematics, a matrix (plural matrices) is a rectangular array of numbers, symbols, or expressions, arranged in rows and columns").  괄호 안의 각각의 수를 성분(entries)이라고 하며, m행 n열로 구성된 행렬은 'm x n 행렬'이라고 말하며, 아래와 같이 표기합니다.

 

 

[ m * n 행렬 (m * n matrix) ]

 

 

 

 

행(column)과 열(row)의 개수가 n개로 같은 행렬을' n차 정방행렬(a square matrix of order n)'이라고 하며, 아래와 같이 표기합니다.

 

 

[ n차 정방행렬 (a square matrix of order n) ]

 

 

 

 

1차 연립방정식을 행렬을 이용해서 표기하면 아래와 같이 할 수 있습니다. 왼쪽의 연립방정식 대비 오른쪽의 행렬이 많이 깔끔해보이지요?  (경영과학 처음 배울 때 가우스 소거법에 아래 행렬 표기를 사용한답니다.)

 

 

[ 1차 연립방정식(simultaneous equations) 의 행렬 표기 ]

 

 

R을 활용하여 행렬(matrix)를 입력하는 방법에는 (1) rbind(), (2) cbind(), (3) matrix()의 3가지가 있습니다.  아래에 차례대로 소개하였습니다.

 

 

 

> ##---------------------------------------------------------------------
> ## matrix algebra
> ##---------------------------------------------------------------------
> 
> # data key-in way 1 : rbind()
> row_1 <- c(1, 2, 3, 4)
> row_2 <- c(5, 6, 7, 8)
> 
> data_rbind <- rbind(row_1, row_2)
> data_rbind
      [,1] [,2] [,3] [,4]
row_1    1    2    3    4
row_2    5    6    7    8
> 
> # column naming
> colnames(data_rbind) <- paste("col_", 1:4, sep="")
> 
> data_rbind
      col_1 col_2 col_3 col_4
row_1     1     2     3     4
row_2     5     6     7     8
> 
> 
> # data key-in way 2 : cbind()
> column_1 <- c(1, 5)
> column_2 <- c(2, 6)
> column_3 <- c(3, 7)
> column_4 <- c(4, 8)
> 
> data_cbind <- cbind(column_1, column_2, column_3, column_4)
> data_cbind
     column_1 column_2 column_3 column_4
[1,]        1        2        3        4
[2,]        5        6        7        8
> 
> # row naming
> rownames(data_cbind) <- paste("row_", 1:2, sep="")
> data_cbind
      column_1 column_2 column_3 column_4
row_1        1        2        3        4
row_2        5        6        7        8
> 
> 
> # data key-in way 3 : matrix()
> raw_data <- c(1, 2, 3, 4, 5, 6, 7, 8)
> data_matrix <- matrix(raw_data, byrow=TRUE, nrow=2)
> data_matrix
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
> 
> # giving names to the rows and columns of the data table : dimnames()
> dimnames(data_matrix) <- list("row" = c("row_1", "row_2"), 
+                               "column" = c("col_1", "col_2", "col_3", "col_4"))
> 
> data_matrix
       column
row     col_1 col_2 col_3 col_4
  row_1     1     2     3     4
  row_2     5     6     7     8

 

 

 

 

행렬에서 행이나 열을 하나만 인덱싱하게 되면 벡터로 바뀌게 되는데요, 벡터가 아니라 행렬로 계속 차원을 유지하고 싶을 경우에는 drop=FALSE 옵션을 써주면 됩니다.

 

> # make it sure to be a matrix : drop = FALSE > data_index <- data_matrix[,2] > data_index row_1 row_2 2 6 > > class(data_matrix) [1] "matrix" > class(data_index) [1] "numeric" > > str(data_matrix) num [1:2, 1:4] 1 5 2 6 3 7 4 8 - attr(*, "dimnames")=List of 2 ..$ row : chr [1:2] "row_1" "row_2" ..$ column: chr [1:4] "col_1" "col_2" "col_3" "col_4" > str(data_index) Named num [1:2] 2 6 - attr(*, "names")= chr [1:2] "row_1" "row_2" > > > data_drop_false <- data_matrix[, 2, drop = FALSE] > data_drop_false column row col_2 row_1 2 row_2 6 > > class(data_drop_false) [1] "matrix" > str(data_drop_false) num [1:2, 1] 2 6 - attr(*, "dimnames")=List of 2 ..$ row : chr [1:2] "row_1" "row_2" ..$ column: chr "col_2"

 

 

 

 

다음번 포스팅에서는 특수한 형태의 행렬에 대해서 알아보도록 하겠습니다. 

 

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

 

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

 

특수한 형태의 행렬

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

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

행렬의 기본 연산 (+, -, *, /, ^, %*%, 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)

 

 

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

 

728x90
반응형
Posted by Rfriend
,