대부분의 머신러닝 알고리듬은 효율적인 연산을 위해 선형대수학을 기반으로 합니다. R은 기본적으로 선형대수의 배열 구조와 연산을 지원하는데, R에서는 어떤 문법과 코드 구조로 선형대수 연산을 시행하는지 알아보겠습니다.   

 

19.1. 재사용 규칙(Recycling Rule)

더보기

(1) 재사용 규칙의 정의

일반적으로 차원이 다른 데이터 구조 간에는 연산이 불가능한 것이 일반적입니다. 허나 R에서는 자체적으로 그 차원를 맞춰주는데, 이를 재사용 규칙이라고 정의합니다.

 

(2) 재사용 규칙의 원리

예를 들어 차원이 다른 두 벡터 x_vector 객체와 y_vector 객체를 정의하고, 두 벡터를 더하면 다음과 같습니다.

x_vector <- c(1, 2, 3) 
y_vector <- c(1, 2, 3, 4, 5, 6)
x_vector + y_vector

이를 이해하기 쉽게 그림으로 보자면, 차원이 짧은 벡터(x_vector)는 차원이 긴 벡터(y_vector)의 길에 맞추어 원소를 반복하여 연산 처리 헀음을 표현합니다. 

출처 : https://www.stat.auckland.ac.nz/~paul/ItDT/HTML/node66.html

 

(3) 재사용 규칙의 적용 범위

재사용 규칙은 모든 데이터 구조에서 적용될 수 있으나, 실수 · 논리형이 아닌 데이터 유형에서는 작동되지 않으므로 유의해야합니다. 

 

19.2. 벡터와 스칼라 간 사칙연산 

더보기

(1) 벡터와 스칼라 간 사칙연산

벡터와 스칼라 간 사칙연산은 일반적인 연산 기호인 +, -, *, /를 사용합니다. 원소 1, 2, 3을 가지는 1×3 vector_01 객체를 정의하고, 사칙 연산을 수행하면 다음과 같습니다.

vector_01 <- c(1, 2, 3)
vector_01 + 2   #덧셈
vector_01 - 2   #뺄셈
vector_01 * 2   #곱셈
vector_01 / 2   #나눗셈

 

19.3. 벡터와 벡터 간 연산

더보기

(1) 벡터와 벡터간 사칙연산

벡터와 벡터 간 사칙연산은 일반적인 연산 기호인 +, -, *, /를 사용하며, 벡터 내 원소들의 연산이 이루어집니다. vector_01 객체를 예를 들어 연산을 해보면 다음과 같습니다.

vector_01 + vector_01 #덧셈
vector_01 - vector_01 #뺄셈
vector_01 * vector_01 #곱셈
vector_01 / vector_01 #나눗셈

 

(2) 벡터의 내적(Dot product, Inner Product), %*%

벡터의 내적이란, 간단히 정의하면 두 벡터를 스칼라로 변환하는 벡터의 곱셈입니다. 내적을 하기 위한 조건은 아래와 같습니다.

 ①두 벡터의 차원은 같아야함

 ②앞 벡터는 행 벡터여야 하고, 뒤 벡터는 열 벡터여야 함

단 R에서는 행∙열 벡터를 구분하지 않으므로, ①조건을 신경써야 합니다. 내적에 대한 자세한 설명은 <namu.wiki>를 참조하세요. 

R에서 벡터의 내적을 연산하고자 할 경우, 특수 연산자인 %*%를 이용합니다. 시행 화면은 다음과 같습니다. 

vector_01 %*% vector_01

 

(3) 벡터의 외적(Outer Product), %o%

선형대수학에서 벡터의 외적이란 두 벡터의 텐서곱을 의미합니다. 수학적 정의와 이해는 <namu.wiki>를 참고하세요. R에서 벡터의 외적은 특수 연산자인 %o%를 이용해 연산할 수 있습니다. 시행 결과는 다음과 같습니다. 

vector_01 %o% vector_01

 

(4) 벡터곱(Vector Product, Cross Product) 연산 함수, cross()

벡터곱이란 3차원 공간의 벡터들간의 이항연산 중 하나입니다. 차원이 3인 벡터 두 벡터를 벡터로 변환하는 곱으로 이해할 수 있습니다. 이 역시 수학적 이해는 <namu.wiki>를 참조하세요.

R에서는 벡터곱 연산을 지원하는 base 함수는 없지만, pracma 패키지의 cross() 함수를 통해 연산 가능합니다. pracma 패키지의 설치 및 활성화는 다음과 같습니다.     

install.packages("pracma")
library("pracma")

cross() 함수를 이용해 vector_01 객체와 차원이 3인 벡터의 벡터곱을 구하면 다음과 같습니다. 

cross(vector_01, c(2, 3, 4))

 

19.4. 행렬과 스칼라 간 사칙연산

더보기

행렬과 스칼라 간 연산은 재사용규칙을 이용하여 연산 처리됩니다. 예를 들어 1에서 9까지의 정수로 이루어진 3×3 행렬 matrix_01객체를 정의해보겠습니다. 

matrix_01 <- matrix(data = 1:9,
                    nrow = 3,
                    byrow = TRUE)

행렬 matrix_01와 스칼라 2 간 사칙연산의 출력 결과는 다음과 같습니다. 

matrix_01 + 2 #덧셈
matrix_01 - 2 #뺄셈
matrix_01 * 2 #곱셈
matrix_01 / 2 #나눗셈

 

19.5. 행렬과 벡터 간 사칙연산

더보기

행렬과 벡터 간 연산은 재사용 규칙을 이용해 벡터의 차원을 행렬의 행에 맞추어 연산됩니다. 행렬 matrix_01과 벡터 vector_01 간 사칙연산은 다음과 같습니다. 

matrix_01 + vector_01 #덧셈
matrix_01 - vector_01 #뺄셈
matrix_01 * vector_01 #곱셈
matrix_01 / vector_01 #나눗셈

 

19.6. 행렬과 행렬 간 연산

더보기

(1) 행렬과 행렬 간 사칙연산

행렬과 행렬 간 사칙연산은 행렬 내 원소들이 매칭되어 연산이 이루어지므로, 행∙열의 크기가 동일해야 연산이 이루어집니다. 즉, 재사용 규칙이 적용되지 않으므로 유의해야합니다. 행렬 matrix_01을 예를 들어 사칙연산을 해보면 다음과 같습니다.

matrix_01 + matrix_01 #덧셈
matrix_01 - matrix_01 #뺄셈
matrix_01 * matrix_01 #곱셈
matrix_01 / matrix_01 #나눗셈

 

(2) 행렬곱(Dot product), %*%

행렬곱은 특수 연산자인 %*% 기호를 사용합니다. 행렬 matrix_01을 이용해 연산해보면 다음과 같습니다.

matrix_01 %*% matrix_01

 

(3) 대각원소(diagonal element) 출력 함수, diag()

대각 원소란 행렬의 주대각선에 위치하는 원소를 의미하는데, 표기법은 다음과 같습니다.  

R에서는 diag() 함수를 통해 대각원소를 출력할 수 있습니다. 행렬 matrix_01의 대각원소를 출력하면 다음과 같습니다.

diag(matrix_01)

 

PLUS) 대각합(trace)

대각합이란 행렬의 대각원소들의 합을 의미합니다. 위의 diag() 함수와 sum() 함수를 이용하여 그 값을 출력할 수 있습니다. 코드는 다음과 같습니다.

sum(diag(matrix_01))

 

(4) 전치행렬(Transpose of A Matrix) 함수, t()

전치행렬이란 해당 행렬의 열과 행의 위치값을 바꾼 행렬으로 정의합니다. 직관적으로 표현하면 원 행렬의 주대각선을 중심으로 대칭시킨 행렬을 의미하며, R에서는 t() 함수를 통해 그 값을 출력할 수 있습니다. t() 함수의 구조와 파라미터 형태는 다음과 같습니다.

t(x=matrix or data frame)
 

matrix_01 행렬을 예를 들어 전치행렬을 구해보면 다음과 같습니다.

t(matrix_01)

 

(5) 행렬식(determinant) 함수, det()

행렬식이란 정방행렬의 가역성, 역행렬의 존재 유무를 판별하는 값입니다. det() 함수를 통해 행렬식을 구할 수 있는데, 코드는 다음과 같습니다. 

det(matrix_01)

 

(6) 역행렬(Inverse Matrix) 함수, solve()

역행렬이란 행렬 A와 행렬 x를 행렬곱했을 때 단위 행렬 I가 나올 경우, 행렬x를 A의 역행렬이라고 정의합니다. 이를 수식으로 표현하면 다음과 같습니다.

R에선 solve() 함수를 통해 특정 행렬의 역행렬을 출력할 수 있는데, 함수의 구조는 다음과 같습니다.

solve(a, b, tol, LINPACK=FALSE)
 
파라미터 설명
a   역행렬을 구하려는 행렬
b   우변에 할당될 행렬, 기본값은 단위행렬
tol   행렬 a에서 선형 종속성을 감지하기 위한 허용 오차 설정
 

matrix_01의 행렬식은 0에 무수히 가까워 역행렬이 존재하지 않으므로, 새로운 행렬 matrix_02을 정의해 예를 들면 다음과 같습니다. 

matrix_02 <- matrix(data = c(1, 0, 1, 2, 3, 0, 1, 3, 0),
                    nrow=3,
                    byrow = TRUE)

matrix_02 행렬의 역행렬을 구하는 코드와 출력 결과는 다음과 같습니다. 

solve(matrix_02)