Как реализовать нейронную сеть на языке R?

Необходимо на языке R реализовать нейронную сеть для предсказания размера пенсии в зависимости средней зарплаты. Для реализации использую пакет neuralnet. В качестве среды - программа Rgui для windows.

Вначале у нас есть два ряда данных - средняя зарплата по городу за последние 10 лет и средняя пенсия за последние 10 лет. Эти данные используются для обучения нейронной сети:

#средняя зарплата за каждый год
traininginput <- c(0.225, 690, 2313, 2931, 4061, 4937, 5809, 7096, 8803, 10095, 12229, 13572)
#средняя пенсия за каждый год
trainingoutput <- c(0.118, 274, 949, 1270, 1668, 2001, 2434, 3028, 3393, 4519, 5594, 7610)


Задаю данные для обучения:
trainingdata <- cbind(traininginput,trainingoutput)
colnames(trainingdata) <- c("Input","Output")


И обучаю ее
net.pension <- neuralnet(Output~Input,trainingdata, hidden=10, threshold=0.01)
print(net.pension)


И теперь я хочу, чтобы при вводе средней зарплаты на будущий год нейронная сеть выдавала мне прогноз средний пенсии на следующий год. Как это можно реализовать на языке R?

Сейчас я делаю вот так, (но таким образом ничего не работает).

#Отправляем на вход среднюю зарплату на будущий год
testdata <- c(15851) 
net.results <- compute(net.pension, testdata) 
 
ls(net.results)
 
#Lets see the results
print(net.results)


Спасибо за помощь.
  • Вопрос задан
  • 11848 просмотров
Решения вопроса 1
@kelj
Прежде всего, Ваши данные должны быть нормализованы для использования при обучении нейронной сети. Кроме того,
hidden=10
представляется мне излишним.

Попробуйте такой код:

library(neuralnet)

# 1. creating the initial data, plotting
data <- data.frame (
	input = c(0.225, 690, 2313, 2931, 4061, 4937, 5809, 7096, 8803, 10095, 12229, 13572),
	output = c(0.118, 274, 949, 1270, 1668, 2001, 2434, 3028, 3393, 4519, 5594, 7610)
)
plot(data$output ~ data$input, main="Distribution of the pension relative to the salary", xlab="Salary", ylab="Pension")

# 2. normalizing the data, plotting
min.input <- min(data$input)
min.output <- min(data$output)
range.input <- diff(range(data$input))
range.output <- diff(range(data$output))
data.norm <- data.frame (
	input = (data$input - min.input) / range.input,
	output = (data$output - min.output) / range.output
)
plot(data.norm$output ~ data.norm$input, main="Distribution of the pension relative to the salary (normalized)", xlab="Salary", ylab="Pension")

# 3. neural network
net <- neuralnet(output ~ input, data.norm)

# 4. test the output
testdata <- seq(0, 25000, by=500)
testdata.norm <- (testdata - min.input) / range.input
result <- round(compute(net, testdata.norm)$net.result * range.output + min.output)
plot(testdata, result, main="Predicred outcome", xlab="Salary", ylab="Pension")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы