top of page
  • 작성자 사진JC.kim

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



이번에는 벡터의 행렬과 연산에대해 알아보자. 우리가 여태까지 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를 사용하였다.


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

여기서 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) 식으로 표현하면 아래와 같다.

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

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

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

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


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


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


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

det(d)

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

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)


마지막으로 공분산행렬에 대해 알아보자. 먼저 공분산은 통계에 있어 특정변수들 간의 상관관계(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

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

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


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



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

조회수 1,133회댓글 0개

최근 게시물

전체 보기

bottom of page