# 인공신경망(ANN : Artificial Neural Network) - Perceptron
install.packages("nnet")
library(nnet)
input <- matrix(c(0,0,1,1,0,1,0,1), ncol=2)
input
#output <- matrix(c(0,0,0,1)) #and
#output <- matrix(c(0,1,1,1)) #or
output <- matrix(c(0,1,1,0)) #xor , 배타적인 or ,한쪽만 만족하면 된다
# 직선만 있기 때문에, 분류를 제대로 할 수가 없다.
output
ann <- nnet(input, output, maxit = 1000, size = 2, decay = 0.001)
ann
# 2-1-1 , 2개가 들어와서 1개로 빠져나감, 그리고 최종 1개
# maxit : 학습 횟수
# 노드를 많이 주면 더 잘 맞춤
result <- predict(ann, input)
ifelse(result > 0.5, 1, 0)
#학습을 반복하면서 코스트(잔차)가 최소화되는 기울기(w)값을 찾는다
# 모델이 랜덤하게 w값을 주기 때문에 미니멀한 지점을 찾는
# 코스트의 양과 반복횟수가 다 다르다.
# 맞출수도 못 맞출수도 있다
# iris dataset
set.seed(123)
idx <- sample(1:nrow(iris), nrow(iris)*0.7)
train <- iris[idx,]
test <- iris[-idx,]
dim(train)
dim(test)
install.packages("devtools")
library(devtools)
source_url('https://gist.githubusercontent.com/fawda123/7471137/raw/466c1474d0a505ff044412703516c34f1a4684a5/nnet_plot_update.r')
model_iris1 <- nnet(Species ~., train, size = 3) #뉴런(노드 1개)
model_iris1
summary(model_iris1)
plot.nnet(summary(model_iris1))
#노드의 갯수를 늘려주면 성능이 좋아진다다