이번 포스팅에서는 벡터(vector)의 정의와 연산에 대해서 알아보겠습니다.

 

벡터는 행렬과 함께 선형대수에서 많이 사용하는 개념이어서 꼭 이해하고 넘어가야 합니다.  벡터 개념과 연산은 중학교 수준의 수학 실력만 있으면 어렵지 않게 이해할 수 있으니 겁먹지 마시기 바랍니다. ^^

 

벡터(vector)는 여러 학문 분야에서 조금씩 다른 뜻으로 사용이 되고 있어서 혼선이 있을 수도 있는데요, 수학(mathemetics)과 컴퓨터 과학(computer science)에서 정의하는 벡터의 정의에 대해서만 살펴보겠습니다.

 

 

[ 수학과 컴퓨터과학에서 벡터의 정의 ]

 

 

[mathematics]

vector : a quantity possessing both magnitude and direction, represented by an arrow the direction of which indicates the direction of the quantity and the length of which is proportional to the magnitude.

 

* compare scalar : a quantity, such as time or temperature, that has magnitude but not direction

 

[computers]

vector : an array of data ordered such that individual items can be located with a single index or subscript

 

* source : http://dictionary.reference.com/browse/vector

 

 

 

수학(mathematics)이나 물리학에서는 벡터(vector)는 힘(magnitude)과 방향(direction)을 함께 가지고 있는 양을 말합니다. 화살표로 표현을 하는데요, 화살표의 길이는 힘(lennth of arrow = magnitude)을, 화살표의 방향은 힘의 방향(direction of arrow = direction)을 나타냅니다. 날아가는 야구공, 미사일 등이 벡터(vector)로 힘과 방향을 표현할 수 있겠습니다. 


벡터는 보통 a, b, c, ... 처럼 소문자굵게(bold) 표기하거나 또는 a = [aj]와 같이 대괄호 안에 성분 표시를 합니다. (참고로, 행렬은 보통 A, B, C, ... 처럼 대문자로 굵게 표기하죠)

 

반면에, 스칼라(scalar)는 시간이나 온도와 같이 힘만 있고 방향은 없는(only magnitude, but not direction) 양을 말합니다. 특별한 가정이 없는 한 실수(real number)로 나타냅니다.

 

컴퓨터(computers) 분야에서는 벡터를 개별적인 요소들이 한개의 index나 subscript에 나열할 수 있는 데이터의 배열이라고 정의합니다. 

 

 

[ 벡터의 정의 ]

 

 

 

벡터의 힘의 크기(magnitude of vector)는 아래 처럼 벡터의 양쪽 바깥쪽에 수직 막대를 한개 또는 두개(절대값 absolute와 혼돈하지 말라고)를 그어주는 것으로 표기합니다.

 

벡터의 힘의 크기는 유클리디안거리(Euclidean distance) 개념으로 계산합니다.

 

 

 

[ 벡터의 힘의 크기 (magnitude of vector) ]

  

 

 

 

 

벡터의 힘의 크기가 1인 벡터를 단위벡터(unit vector)라고 합니다.

 

[ 단위벡터 (unit vector) ]

 

 

 

 

 

열벡터(column vector)는 n by 1 행렬을 말하며, 행벡터(row vector)는 1 by n 행렬을 말합니다. 

 

 

[ n by 1 열벡터(column vector)와 1 by n 행벡터(row vector) ]

 

 

 

 

특히 n by 1 벡터 전체로 이루어지는 집합을 R에 이중선을 추가해서

 이라고 표기합니다.

 선형대수 공부할 때, 최적화 선형계획법 공부할 때 자주 접하게 되는 표기법 중에 하나입니다.

 

 

 [ 2 by 1, 3 by 1, n by 1 column vector ]

 

 

 

 

 

벡터(vector)는 아래와 같이 다양하게 해석할 수 있습니다. 벡터 [3, 5]를 예로 들어서 설명해보겠습니다.

 

- 해석 1 : 점 (4, 5)

- 해석 2 : 원점(0, 0)과 점(4, 5)를 이은 화살표

- 해석 3 : 원점(0, 0)에서 점(4, 5)까지 가는 화살표들의 합

- 해석 4 : 오른쪽으로 4, 위쪽으로 5만큼 이동하는 모든 화살표 (무수히 많음)

 

 

[ 벡터의 다양한 해석 ] 

 

 

 

특히, 4번째 해석은 좀 의아할 수도 있는데요, 두 벡터의 크기와 방향이 같을 때, 즉 평행이동했을 때 서로 겹쳐지는 벡터를 '벡터의 상등(equality)'이라고 말하며, 무수히 많이 존재합니다.

 

 

행렬은 행벡터 또는 열벡터로 구성되며, 벡터는 행 또는 열이 1개인 행렬이라고 할 수 있습니다. 벡터의 계산은 행렬의 계산과 같습니다.

 

아래에 벡터끼리의 합, 차, 스칼라곱, 곱에 대한 예를 들어보겠습니다.

 

 

(1) 벡터의 합 (adding vectors)

 

벡터 aaxay로 분할할 수 있습니다. 두 벡터 ab의 합은 a + b = (ax + bx, ay + by) 로 계산하게 됩니다. 

 

아래에 벡터 a=[4, 5], 벡터 b=[3, 1]의 합 a+b를 예로 들어보았습니다.

 

 

 

 

 

R을 활용한 벡터의 합은 행렬의 합과 동일합니다. 벡터 a, b를 객체로 할당하고 + 하면 됩니다.

 

 

> ## adding vectors
> 
> a <- c(4, 5)
> b <- c(3, 1)
> 
> a
[1] 4 5
> b
[1] 3 1
> 
> a+b
[1] 7 6
 

 

 

두개의 n by 1 열벡터 a와 b의 합은 아래와 같이 나타낼 수 있습니다. 

 

 

[ 열 벡터a와 열 벡터b의 합(adding vectors) ]

 

 

 

 

 

(2) 벡터의 차 (substracting vectors)

 

벡터의 차는 같은 위치의 벡터의 성분끼리 빼주면 됩니다.  화살표로는 기존의 벡터의 방향을 반대로 돌려주는 것이 (-)해주는 의미가 되겠습니다. 벡터의 차는 두 점 사이의 거리를 계산할 때 요긴하게 사용할 수 있습니다. 

 

두 벡터 a=[4, 5], b=[3, 1]의 차이를 아래에 예로 들어보았습니다.

 

 

[ 벡터의 차 (substracting vectors) ]

 

 

 

R로 벡터의 차를 구하는 것도 역시 행렬과 동일하게 두 벡터 객체에 (-) 해주면 됩니다.

 

 

> ## substracting vectors
> a <- c(4, 5)
> b <- c(3, 1)
> 
> a
[1] 4 5
> b
[1] 3 1
> 
> a-b
[1] 1 4

 

 

 

두 개의 m by 1 열벡터 a와 b의 차는 아래와 같이 나나탤 수 있습니다.

 

 

 [ 열열터 a와 b의 차 (substracting vectors) ]

 

 

 

 

 

 

(3) 스칼라배 (multiplying a vector by a scalar)

 

위에서 스칼라를 힘만 있고 방향은 없는 양(a quantity that has only magnitude, but not direction)이라고 정의했었는데요, 벡터에 스칼라를 곱하는 것을 스칼라배라고 하고, 곱한 스칼라이 양만큼 벡터의 크기가 바뀌기 때문에 "벡터를 scaling한다"("scaling a vector")고도 합니다.

 

아래에 벡터 a=[2, 4]에 scalar 2, scalar 1/2 을 곱해보는 예제를 살펴보겠습니다. 방향은 똑같고 스칼라배한만큼 힘의 크기가 달라졌음을 알 수 있습니다.

 

 

 

아래에 위의 예제를 R로 스칼라배 연산해보았습니다.

 

 

> ## multiplying a vector by a scalar
> a <- c(2, 4)
> 
> scala_1 <- c(2)
> scala_2 <- c(1/2)
> 
> a*scala_1
[1] 4 8
> 
> a*scala_2
[1] 1 2

 

 

 

n by 1 벡터a에 c스칼라배 하는 것은 아래와 같이 나타낼 수 있습니다. 

 

 

[ 스칼라배 (multiplying a vector by a scala) ]

 

 



스칼라배는 행렬의 곱이 가지고 있는 특성을 고스란히 가지고 있습니다.



[ 행렬의 스칼라배 성질 (principle of multiplying a vector by a scala) ]




 

벡터의 곱(multiplying a vector by a vector, dot product, cross product)은 다음 포스팅에서 소개하도록 하겠습니다.

 

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


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

 

행렬 기본 이해

특수한 형태의 행렬

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

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

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

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


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

 

 

Posted by R Friend R_Friend

댓글을 달아 주세요


SAS나 SPSS를 사용하다가 R을 처음 배우는 사용자라면 R에서 7개로 나누는 데이터 구조에 대해서 '이걸 왜 배우지? SAS나 SPSS는 이런거 모르고도 아무 문제 없이 데이터 처리, 분석 다 했었는데...'라는 의문과 함께, 'R 이거 배우기 어렵네...'라고 푸념할 수도 있겠습니다. 제가 그랬거든요. (SAS나 SPSS에서 주로 사용했던 데이터 구조가 R의 데이터 구조 중에서는 '데이터 프레임' or '행렬'이라고 하는 구조라고 생각하시면 됩니다. 전부다는 아니고 많은 경우....)


R의 데이터 구조별 특성에 대해서 정확하게 이해하지 않으면 나중에 데이터 처리, 분석 넘어갔을 때 자꾸 헷갈리고, 에러가 났을 때 에러 메시지가 무슨 의미인지 이해를 못할 가능성이 높습니다. 데이터 구조에 따라서 분석기법이 달라지게 되거든요. 라틴댄스로 치자면 빨리 '패턴' 배워서 멋지게 파트너와 춤추고 싶은데 선생님은 한달이고 두달이고 '스탭'만 연습시키는데요, 어찌보면 따분하고 답답한 '스탭' 기본기가 R로 치면 데이터 구조라고 생각하시면 되겠습니다. R의 기본이 되는 중요한 개념이므로, 그리고 나중에 이게 제대로 이해가 되고 R이 손에 익었다 싶을 때 다시 되돌아 보면 R에서 데이터 구조를 이렇게 나누어서 분석 기법을 달리 하는 것이 R의 차별화된 장점이자 특징이겠구나 하고 느끼게 되는 시점이 올겁니다. 


R 데이터 구조는 (1) 스칼라, (2) 벡터, (3) 요인, (4) 행렬, (5) 배열, (6) 데이터프레임, (7) 리스트의 7개로 나눌 수 있습니다. 하나씩 설명을 할텐데요, 처음에 잘 이해가 안가도 자꾸 R 사용하면서 다시 이번 포스팅 다시 돌아와서 한번씩 복습하시면 이해되는 날이 올거예요. (제가 Coursera로 강의 듣는데 R 데이터 구조라면서 강사가 막 영어로 뭐라 뭐라 하는데.... 뭔 소리인지 이해도 안되고, 이걸 왜 배우나 싶고, 짜증도 나고, 좌절도 되고...암튼 그랬는데요, 어느 순간 지나서 보니깐 다 이해를 하고 있더라고요. 한번 보고서 이해 안된다고 좌절하지 마시라는 뜻에서 자꾸 같은 소리 하고 있습니다. ^^;;;)



1. 스칼라 (Scala)


구성인자가 하나인 벡터를 말합니다. 


> # 스칼라 (Scala) : 구성인자가 1개인 벡터

> s1 <- c(1)

> s2 <- c("Kim") 



2. 벡터 (Vector)


벡터는 동일한 유형의 데이터가 구성인자가 1개 이상이면서 1차원으로 구성되어 있는 데이터 구조를 말합니다. 

(벡터 중에서 구성인자가 1개인 것을 '스칼라'라고 합니다)


> # Vector

> v1 <- c(1, 2, 3)                   # 숫자형 벡터

> v2 <- c("Kim", "Lee", "Choi")    # 문자형 벡터

> v3 <- c(TRUE, TRUE, FALSE)   # 논리형 벡터



3. 요인 (Factor) 


범주형(명목형 또는 순서형)의 데이터 구조를 요인(Factor)라고 합니다. 통계 분석 할 때 소위 '~~별' 분석을 할 때 쓰는게 요인이므로 굉장히 많이 사용됩니다. 나중에 분석을 하다보면 (1) '요인'으로 데이터를 변환해야 하는 경우도 생기고, (2) 반대로 '요인'이 아니어야 하는데 '요인'으로 데이터가 입력이 되어있어서 에러가 발생하는 경우도 생기곤 합니다. '요인'이 뭔지, 뭐에 쓰는 것인지 모르면 두 가지 경우 상황 파악을 못해서 곤혹스럽겠지요? 

요인이 가질 수 있는 값들을 '수준(level)'이라고 합니다. RDBMS에서의 '코드값'이라고 이해하면 되겠습니다. 수준(level)은 명목형은 상관없지만, 순서형의 경우 순서(order)를 부여할 수 있습니다. 분석 결과가 순서대로 범주화 되서 나와야 보기에 좋겠지요?


> # (1) 문자형 데이터를 그냥 입력하면, 따옴표가 있는 문자형 벡터가 생성

> f1 <- c("Middle", "Low", "High")

> f1

[1] "Middle" "Low"    "High"  

>

> # (2) factor()함수를 이용해서 문자형 벡터를 요인(factor)로 변환

> # 단, 순서를 지정 안해주면 알파벳 순서로 수준(level)이 자동으로 지정됨

> f2 <- factor(f1)

> f2

[1] Middle Low    High  

Levels: High Low Middle

>

> # (3) 수준(level)에 순서를 부여하려면 'order=TRUE' 옵션 설정, level=c("") 에 순서대로 입력

> f3 <- factor(f2, order = TRUE, level = c("Low", "Middle", "High"))

> f3

[1] Middle Low    High  

Levels: Low < Middle < High 



4. 행렬 (Matrix) 


행렬은 동일한 유형의 2차원 데이터 구조를 말합니다. (쉽게 말해 m x n 형태의 표 형태의 데이터)

참고로, 벡터는 동일한 유형의 1차원 데이터 구조라고 했지요. (쉽게 말해, 가로로 늘어선 한 줄 데이터)


행렬은 matrix() 라는 함수를 사용합니다. 

최적화(optimization) 할 때 제약조건을 행렬로 입력합니다. 공학에서 행렬 많이 사용합니다. 


> # 1~12까지의 숫자를 행(row)의 수가 4개인 행렬로 만들어라

> m1 <- matrix(1:12, nrow=4)

> m1

     [,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> # 1~12까지의 숫자를 행(row)의 수가 4개이고 행렬로 만드는데, 행 기준(byrow=TRUE)으로 채워나가라

> m2 <- matrix(1:12, nrow=4, byrow=TRUE)

> m2

     [,1] [,2] [,3]

[1,]    1    2    3

[2,]    4    5    6

[3,]    7    8    9

[4,]   10   11   12

>  



5. 배열 (Array) 


배열(Array)은 동일한 유형의 데이터가 2차원 이상으로 구성된 구조를 말합니다. 

참고로, 행렬은 동일한 유형의 2차원 데이터 구조라고 했지요. 따라서 배열은 쉽게 말해 행렬이라는 방을 층 층이 쌓아놓은 아파트라고 생각하시면 되겠습니다. 


> # 1~24까지의 숫자를 '2 x 3 행렬'로 해서 '4층' 짜리의 데이터 구조를 만들어라

> a1 <- array(1:24, c(2,3,4))

> a1

, , 1


     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6


, , 2


     [,1] [,2] [,3]

[1,]    7    9   11

[2,]    8   10   12


, , 3


     [,1] [,2] [,3]

[1,]   13   15   17

[2,]   14   16   18


, , 4


     [,1] [,2] [,3]

[1,]   19   21   23

[2,]   20   22   24 



> # 1~24까지의 숫자를 '3 x 4' 행렬로 해서 '2층'짜리의 데이터 구조를 만들어라

> a2 <- array(1:23, c(3,4,2))

> a2

, , 1


     [,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


     [,1] [,2] [,3] [,4]

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21    1





6. 데이터 프레임 (Data Frame) 


데이터 프레임데이터 유형에 상관없이 2차원 형태의 데이터 구조를 말합니다. 

참고로, 행렬동일한 유형의 데이터가 2차원 형태로 구성되었다고 했지요. 

통계, 마이닝 분석할 때 데이터 프레임을 주로 사용합니다. 


> # 다른 유형의 벡터 생성

> d1 <- c(1,2,3,4)

> d2 <- c("Kim", "Lee", "Choi", "Park")

> # 데이터 프레임으로 묶기 : data.frame() 함수 사용

> d3 <- data.frame(cust_id = d1, last_name = d2)  # 변수명 부여

> d3

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park 



7. 리스트 (List) 


리스트는 벡터, 행렬, 배열, 데이터 프레임 등과 같은 서로 다른 구조의 데이터를 모두 묶은 객체를 말합니다. 

참고로, 리스트 말고 나머지들은 서로 다른 구조의 데이터 끼리는 묶어 놓지 않았고 따로 따로 였지요. 

R에서는 통계 분석 결과가 보통 리스트 구조로 제시되고, 필요로 하는 통계량이 있으면 indexing해서 뽑아서 쓰기도 합니다. 

서로 다른 구조의 다수의 데이터 객체를 개별로 따로 따로 관리하는 것보다는, 이것들을 리스트라는 한 바구니에 가지런히 정리해서 모아놓으면 관리하기에 편하겠지요? 


> # Vector(L1), Matrix(L2), Array(L3), Data Frame(L4)를 만들어서, 하나의 List(L5)로 묶어라

> L1 <- c(1, 2, 3, 4) # Vector

> L2 <- matrix(1:6, 3, byrow=TRUE) # Matrix

> L3 <- array(1:24, c(3,4,2)) # Array

> L4 <- data.frame(cust_id = c(1, 2, 3, 4), last_name = c("Kim", "Lee", "Choi", "Park")) # Data Frame

> L5 <- list(L1, L2, L3, L4) # List

>

> # [[1]]는 Vector(L1), [[2]]는 Matrix(L2), [[3]]는 Array(L3), [[4]]는 Data Frame(L4)가 묶인 것임

> L5

[[1]]

[1] 1 2 3 4


[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6


[[3]]

, , 1


     [,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


     [,1] [,2] [,3] [,4]

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21   24



[[4]]

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park

 


지금까지 살펴본 R의 데이터 구조를 도식화하면 아래와 같습니다. 뭐가 뭐의 부분집한인지, 각 데이터 구조를 구분하는 기준은 무엇인지 유심히 다시 한번 살펴보기 정리해보면 좋겠습니다. 



[ R 데이터 구조 (Data Structure in R) ]



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

 

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


Posted by R Friend R_Friend

댓글을 달아 주세요

  1. ㅇㅇㅇ 2016.12.13 08:47  댓글주소  수정/삭제  댓글쓰기

    흐 어렵지만.. 조금씩 배우면 할 수 있겠죠

  2. 온봄 2017.03.27 12:25  댓글주소  수정/삭제  댓글쓰기

    그간 R을 전혀 R지못해서, 조금씩 R아가고 있는데요~
    선생님이 차근차근 정리해주신 내용들이 참 많은 도움이 되고 있습니다 ^^ 이해하기 쉽게 친절히 정리해주셔서 고맙습니다.

  3. r뻔 2017.04.12 18:55  댓글주소  수정/삭제  댓글쓰기

    코세라하면서 멍하니 막막해 하고 있었는데 한 줄기 단비 같은 정리 입니다. 이렇게 고급진 메뉴얼에 너무 감사드리고 앞으로도 많은 가르침 부탁 드립니다!!!!

  4. guest 2017.09.02 14:55  댓글주소  수정/삭제  댓글쓰기

    제가 지금까지 제가 설명 중에 가장 잘 정리되어있네요. 많이 도움받고 갑니다. 공부를 정말 열심히 하시나봐요.

  5. orange 2018.01.21 16:31  댓글주소  수정/삭제  댓글쓰기

    진짜 설명 기초부터 잘 해주셔서 많이 배우고 갑니다!!! 너무 감사드려요 ㅎㅎㅎ

  6. 감사합니다 2018.04.13 08:31  댓글주소  수정/삭제  댓글쓰기

    진짜 이렇게 깔끔한 순서와 친절한 설명이... 감사합니다!

  7. 감사합니다. 2018.04.15 22:12  댓글주소  수정/삭제  댓글쓰기

    감사합니다^^ 혹시 오프라인 강의도 하시나요?

  8. 박수환 2018.08.06 03:08  댓글주소  수정/삭제  댓글쓰기

    쌤, 진짜 막혀있던 혈이 풀리는 포스팅입니다 ㅜㅜ
    독학하다가 어딘가 알게 모르게 혼란에 빠지곤 했는데, 구조와 유형의 의미를 명확히 알게 되었습니다.
    이 포스팅은 정말 막힐때마다 와서 개념잡기용으로 다시 봐야겠어요.
    정말 감사합니다!!