티스토리 뷰
다음과 같은 날씨가 있다고 가정해봅시다.
비가 조금이라도 온 날을 1로 보구요.. 맑은 날을 0이라고 해보죠..
그리고 나서 일정 기간의 데이터를 보고 앞으로 비가 올지 안올지를 예측해 보는 겁니다.
먼저 위의 날씨를 R의 벡터로 표시하면 다음과 같이 할 수 있을 것입니다.
앞으로의 날씨를 예측하는 부분의 알고리즘은 여기에서는 쉽게 다수결로 한다고 생각해 보겠습니다.
k라는 수를 정하고, k값이 3이면 이전 3일 데이터를 가지고 1과 0중 더 많이 나온 것을 보고, 그날의 날씨를 예측해 보는 것이죠.
위 예에서는 1일에서 3일까지의 (0, 1, 1) 세개를 보고 1이 많으므로, 4일째도 1이 나온다고 예측한다는 것이죠. (즉, 비가 온다는 것입니다.)
한번 더 생각해볼까요?
k값이 5이고, 위 그림의 9일의 날씨를 예측하려고 한다면,
4일 ~ 8일의 데이터 (1, 1, 1, 0, 0)으로 9일의 데이터를 예측하면 1이 나와서 비가 온다고 했으니 틀린 예측이 되겠죠..
이처럼 훈련을 통해 패턴을 인식하기 위한 과거의 데이터를 기계학습에서는 training set 이라고 합니다.
이런 경우, k값에 따른 예측에 대한 오차율(Error Rate)를 R을 통해서 쉽게 계산할 수 있는데요.
그 예제를 한번 해보도록 하겠습니다.
성능 향상을 위해서 vector()를 이용해 미리 영역을 할당하는 것에 대해서는 이전에 설명했었네요.
여기에서는 sum(x[i:(i+(k-1))]을 먼저 살펴보죠..
0과 1로 이루어진 이산 데이터이기 때문에,
i번째 부터 k개의 데이터를 합한 것이 k값의 반절보다 크면 1이 많은 것이고, 작으면 0이 많은 것이라는 점을 활용한 겁니다.
위에서 설명한 k=3일때, (0,1,1)의 합은 2이고, k/2값은 1.5이므로, 4일째는 1이 나온다고 예측이 되는 것이죠.
예측된 값이 맞는지를 확인하기 위해서 예측값에서 실제값을 뺀 것이 pred-x[(k+1):n]입니다.
예측값과 실제값이 맞다면 0이 나올 것이고, 그렇지 않을 경우 1 또는 -1이 나오겠죠..
여기에 abs()로 절대값을 취하면, 0은 정확한 예측이 1은 틀린 예측이라고 할 수 있습니다.
이것의 평균을 mean()으로 구하면 예측의 오차율(Error Rate)를 구할 수 있게 되는 것이죠.
소스는 복잡해 보이지만 설명을 잘 읽어보시면 이해가 될 것입니다.
실행해 보면, k=3인 경우가 5일때 보다는 오차율이 더 적은 것을 알 수 있습니다.
여기에서도 최적화를 조금 해보면, 먼저 반복문 내에서 sum()을 여러번 호출하는 것을 알 수 있습니다.
계속해서 sum을 계산하지 않고, 새로운 것을 더하고 이전 것을 빼는 형태로도 구성할 수 있겠죠.
좀더 효율성을 높이기 위해서 누적합을 구해주는 R 함수인 cumsum()을 사용할 수도 있습니다.
cumsum()은 이전의 숫자들의 합을 한번에 구해주는 함수입니다.
이를 활용해서 위와 동일한 R 프로그래밍을 하면 다음과 같습니다.
미니의 R 주요 강좌...
R의 lapply, sapply, vapply를 이해하자~
'Cloud&BigData > R' 카테고리의 다른 글
우분투에서 R 패키지 설치 (0) | 2013.11.07 |
---|---|
R 예제: 연관성 측정 (0) | 2013.11.04 |
R 예제: 1이 연속으로 나오는 부분 찾기 (0) | 2013.08.14 |
R 데이터 구조에 대한 정리 (0) | 2013.08.09 |
R 실행을 위한 기본적인 내용들~ (0) | 2013.07.29 |
- Total
- Today
- Yesterday
- SCORM
- mysql
- 모바일
- 마케팅
- java
- 책
- r
- 세미나
- 하둡
- 안드로이드
- 구글
- 도서
- 통계
- 프로젝트
- Hadoop
- 자바
- 빅데이터
- fingra.ph
- 디자인
- 맥
- 자바스크립트
- HTML
- 분석
- 아이폰
- ms
- 애플
- 웹
- XML
- 클라우드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |