top of page

[R Programming] 벡터와 행렬의 연산

  • 작성자 사진: JC.kim
    JC.kim
  • 2018년 3월 18일
  • 3분 분량


ree

이번에는 벡터의 행렬과 연산에대해 알아보자. 우리가 여태까지 R프로그래밍으로 공부한 벡터와 행렬에 대해 잠시 복습해보자. 먼저 벡터를 생성하는 방법은 아래와 같다.


x <- c(1,2,3)

이렇게 쓰면, x라는 벡터에 1,2,3 이라는 객체가 들어가 있다는 것을 알 수있다. 우리는 이 벡터에서 특정 성분만 따로 출력할 수 있다.


x[2]

x2 <- x[-c(1)]

x벡터의 2번째 값인 2를 화면에 출력한다. 또 []기호에 (-)음수를 사용하여 subset을 할 수도 있었다. sequence 함수를 이용해, 범주내 새로운 벡터를 생성할 수 있었다. replication 함수를 이용하면 특정 범위의 객체값을 반복해서 출력 하기도 했다. 또 생성된 벡터들을 rbind와 cbind를 이용하여 Matrix (행렬)을 만들 수도 있었다.


x1<-c(1,2,3,4,5)

x2<-c(1,3,5,7,9)

z <- cbind(x1,x2)

위와 같이 결합하면, 5x2 행렬이 만들어 지고, rbind를 사용하면 2x5 행렬을 만들 수 있었다. 벡터의 합이 아닌 따로 행렬을 만들고 싶다면, matrix함수에서 nrow 와 ncol을 이용하여만들 수 있었다.


m<-matrix(1:30, nrow=3)

위와같이 쓰면, 1부터 30까지 수를 3개의 행을 가지는 행렬로 만들수 있었다. byrow를 이용해 채워지는 값의 순서도 바꿀 수 있다. 고차원의 행렬을 만들땐, array를 사용하였다.


이번엔 이렇게 생성된 벡터와 행렬들을 이용해 연산을 해보도록 하자. 먼저 기본적인 연산은 아래와 같다.

ree

여기서 x%%y는 x에서 y를 나눌때, 나머지를 구하는 연산자 이다. 예를들어 5%%2를 쓴다면, 1이 출력될 것이다. 또, x%/%y는 x에서 y를 나눌때 몫을 구하는 연산자 이다. != 기호는 not equal 표시이다. x|y 연산자는 x 또는 y의 조건을 둘중 하나의 값을 나타내는 OR연산자 이다. 나머지는 위의 표에 쓰여진 대로 사용하면 된다.

그럼 위의 연산자들을 이용하여, 행렬의 연산을 해보도록 하자. A와B가 Matrix라고 가정할때 먼저,


A*B

이 연산자는 행렬 내 성분/요소 별로 곱해주는 연산이다. (Element wise) 식으로 표현하면 아래와 같다.

ree

그리고 행렬곱 (Matrix Product)은 A%*%B로 표시하며 수식으로는 아래와 같이 쓴다.

ree

행렬곱은 물리나 수학과목에서 많이 접해봤을 것이다. 우리는 행렬곱을 할때, 행렬간 차원이 맞아야 행렬 곱을 할 수 있다는 사실을 알고있다. 만약 A라는 행렬과 B라는 행렬을 행렬곱 할때, (Product) 행렬간 차원이 맞지 않다면, Transpose를 해주어 계산할 수 있다.

ree

이 경우 R언어 에서는 t(A) 또는 t(B)라고 사용한다. 행렬의 연산에 대한 기본적인 표는 아래와 같다.

ree

그럼 이제, R 프로그래밍을 해보면서, 위의 연산자들을 하나씩 사용해보자.


먼저 Transpose이다. 어떤 3x5 Matrix가 있을때, 그 Matrix를 5x3으로 Transpose 하고싶다면, 아래와 같이 써주면 된다.

ree

ree

위와같이 행렬이 Transpose(전치) 되는것을 볼 수 있다. 그럼 이번엔 determinant를 구해보자. 2x2행렬을 먼저 선언한뒤, det를 구하는 코드는 아래와 같다.


d <- matrix(1:4, nrow=2, byrow=T)

det(d)

우리가 이 determinant는 주로 Inverse Matrix를 구할 때, 많이 사용했을 것이다.

ree

R프로그래밍 에서는 이 역행렬을 직접 저 식과 같이 계산하지 않고, solve라는 method를 사용하여 쉽게 구할 수 있다.


m_inver<-solve(d)

그럼 위에서 선언한 d 행렬의 역행렬을 출력해 줄 것이다. 또 역행렬과 본래 행렬을 곱하면, 단위 행렬이 나오는 것도 우린 알고 있다.


m_inver%*%d

우리는 역행렬을 방정식의 해를 구할 때, 자주 사용해왔다. 가령, 3x+y=5 라는 식과 x-y=3이라는 두 식을 연립하여 풀 때, 역행렬을 이용해 방정식의 해를 구했다.


a <-matrix(c(3,1,1,-1), nrow=2, ncol=2)

b <-matrix(c(5,3), nrow=2, ncol=1)

c <-solve(a,b)

ree

ree

마지막으로 공분산행렬에 대해 알아보자. 먼저 공분산은 통계에 있어 특정변수들 간의 상관관계(Correlation)의 정도를 나타내는 척도이다. 우리고 통계분석을 진행할때, 주로 확인하는 값이 바로 공분산 행렬의 특성을 조사하는 것이다. 공분산행렬에 대해 파악한다면, 우리는 각 변수들간의 고유치(Eigenvalue or Eigenvector)를 찾아 낼 수 있다. 우리는 공분산 행렬을 통해 상승 및 하강 경향을 찾을 수도 있으며, 기본적으로 x라는 data가 존재핼때, 해당 data 행렬을 transpose 한 뒤, x 와 다시 곱하는 형태로 공분산 행렬을 구할 수 있다.


t(x)%*%x

위와 같이 공분산 행렬을 표시할 수 있으며, x라는 2x2행렬을 정의하여, 고유치 (eigenvector)까지 구해보자.


x<-matrix(1:4, nrow=2, byrow=T)

x

x_correl<- t(x)%*%x

x_correl

e <- eigen(x_correl)

e

결과는 아래와 같이 나온다.

ree

eigen이라는 함수는 해당 행렬의 고유값을 표현하는 함수이다.


우리는 이렇게 벡터와 행렬의 연산에 대하여 알아보았다. 다음에는 함수와 데이터의 생성, 그리고 데이터를 직접 불러와서 histogram을 그려보는 작업을 해 볼 것이다. 위의 내용은 포항공과대학교 인터넷 강의(MOOC)를 바탕으로 작성하였다. 매 학기마다 인터넷 무료강좌가 열리며, 일정만큼 수료를 하면 수료증도 준다.



AI. 빅데이터, IoT관련 수업을 들을 수 있으므로, 참고해서 강의를 들으면 더 도움이 될 것이다.

댓글


뉴스레터 구독하기

  • Black Facebook Icon
  • Black Instagram Icon

© 2023 by The Mountain Man. Proudly created with Wix.com

명지대학교 자연과학대학 양자시스템전산연구실
​차세대과학관 3층 329호

bottom of page