-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchapter 14.Rmd
More file actions
149 lines (108 loc) · 3.65 KB
/
chapter 14.Rmd
File metadata and controls
149 lines (108 loc) · 3.65 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
---
title: "빅데이터 분석의 첫걸음 R코딩"
output: github_document
---
```{r setup, include = F}
knitr::opts_chunk$set(echo = T, fig.align = "center")
```
- Author: 장용식, 최진호
- Book: <https://book.naver.com/bookdb/book_detail.nhn?bid=16324211>
- coding은 example들을 제외하고는 programming으로 넘겼습니다.
---
## 14\. 인공지능과 인공 신경망
인공지능 | 분류
:-:|---|
전문가 시스템 | 지식 체계를 if then else의 규칙으로 전부 표현하고자 함.
퍼지 이론 | 자연언어에서의 애매모호함을 정량적으로 표현하고자 함.
*기계 학습* | 컴퓨터에 인공적인 학습이 가능한 지능을 부여
유전 알고리즘 | 자연의 진화 과정으로 특정한 문제의 적절한 답을 찾고자 함.
<img src="images/neuron_network.JPG" style="display: block; margin: auto;" />
<br />
- 은닉층 (hidden layer): 입력층과 출력층 사이 층
- 심층(deep) 신경망: 은닉층이 2개 이상
- 인공 신경망 모형 구조 정의 → 시계열 데이터 읽기 → 테스트 → 최적 모형 선정 → 예측
<br />
#### addition: 시계열 데이터 예측을 위한 인공 신경망 모형
1. 1단계 예측: 바로 다음 시점의 출력을 예측
2. 다단계 예측: 다수 값을 한꺼번에 예측
---
### 본격적으로
```{r message = F}
# install.packages("xlsx")
# install.packages("nnet")
library(xlsx)
library(nnet)
```
### 1. 구조 정의
- 입력 노드: 10, 출력 노드: 5
- 은닉층: 1, 은닉 노드: 20
- 반복 횟수: 500
```{r}
inputs = 10; outputs = 5
hidden_layers = 1
hiddens = inputs * 2
iterations = 500
```
### 2. 데이터 읽기
- 데이터 출처: 한국 거래소, 주가지수 KOSPI 시리즈 20160101 ~ 20160630
- http://marketdata.krx.co.kr/mdi#a110dc6b3a1678330158473e0d0ffbf0=2
```{r}
data = read.xlsx2(file.choose(), 1)
head(data)
```
```{r warning = F}
data$현재지수 = gsub(",", "", data$현재지수)
data$현재지수 = as.numeric(data$현재지수)
head(data)
```
#### 데이터 전체 확인
```{r}
attach(data)
plot(일자, 현재지수, xlab = "일자", ylab = "현재지수 (종가)", type = 'o')
```
### 3. 테스트
- train: 1-116 vs test: 117-121
- 입력: (1-10), (1-11), (2-12), (3-13), ..., (102-111)
- 출력: (11-15), (12-16), (13-17), (14-18), ..., (112-116)
- 오류율 MAPE (Mean Absolute Percentage Error) 채택
근데 이러면 가중치 평균의 정의에 따라 극으로 갈수록 가중치가 작아지는 데?<br />
물론 많아야 9 * 2개 정도겠지만, MA 모형 같은 느낌입니다?
```{r}
getDataSet = function(item, from, to, size) {
dataframe = NULL
to = to - size + 1
for (i in from:to) {
end = i + size - 1
temp = item[c(i:end)]
dataframe = rbind(dataframe, t(temp))
}
return(dataframe)
}
```
```{r}
trainX = getDataSet(현재지수, 1, 111, inputs)
trainY = getDataSet(현재지수, 11, 116, outputs)
testX = getDataSet(현재지수, 107, 116, inputs)
testY = getDataSet(현재지수, 117, 121, outputs)
(dim(trainX)[1] == dim(trainY)[1]) & (dim(testX)[1] == dim(testY)[1])
```
#### 학습
```{r}
model = nnet(trainX, trainY, size = hiddens, linout = TRUE, rang = 0.1, skip = TRUE, maxit = iterations)
```
```{r}
predictions = predict(model, testX, type = "raw")
mean(abs(predictions - testY) / testY) * 100
```
### 5. 예측
- 4번은 분석가 재량으로 패스
```{r}
forecasting = getDataSet(현재지수, 112, 121, inputs)
predictions = predict(model, forecasting, type = "raw")
predictions
```
```{r}
plot(1:10, 현재지수[112:121], xlab = "기간", ylab = "현재지수 (종가)",
xlim = c(0, 15), type = 'o')
lines(11:15, predictions, type = 'o', col = "red")
```