我已经模拟了一些通过神经网络运行的数据,但我无法获得重复神经网络的功能。我不确定我的代码出错了。
如果我一次运行一个神经网络,没有问题,但只要我创建一个函数来运行10次重复,我就会收到以下错误:
nrow [w] * ncol [w]中的错误:二元运算符的非数字参数
另外:警告信息: 1:算法没有收敛于1中的1 stepmax 2中的重复:In is.na(权重):is.na() 应用于'NULL'类型的非(列表或向量)
library ("MASS")
library ("neuralnet")
set.seed(123)
Variable1 <- rnorm(n = 500, mean = 26, sd = 5)
Variable2 <- rnorm(n = 500, mean = 600, sd = 100)
Variable3 <- rnorm(n = 500, mean = 115, sd = 15)
group <- 1
weight <- ((.3*(Variable1/36))+(.3*(Variable2/800))+(.3*(Variable3/145)))
pt1 <- cbind (group, Variable1, Variable2, Variable3, weight)
Variable1 <- rnorm(n = 500, mean = 21, sd = 5)
Variable2 <- rnorm(n = 500, mean = 500, sd = 100)
Variable3 <- rnorm(n = 500, mean = 100, sd = 15)
group <- 0
weight <- ((.3*(Variable1/36))+(.3*(Variable2/800))+(.3*(Variable3/145)))
pt2 <- cbind (group, Variable1, Variable2, Variable3, weight)
pt3 <- as.data.frame(rbind (pt1, pt2))
Outcome <- rbinom (n = 1000, size = 1, prob = pt3$weight)
Data_f <- as.data.frame (cbind(pt3, Outcome))
Data <- subset (Data_f, select = -weight)
data <- Data[, sapply(Data, is.numeric)]
maxValue <- as.numeric(apply (data, 2, max))
minValue <- as.numeric(apply (data, 2, min))
data_scaled <- as.data.frame(scale(data, center = minValue,
scale = maxValue-minValue))
k <- 10
library(plyr)
pbar <- create_progress_bar('text')
pbar$init(k)
for(i in 1:k){
ind <- sample (1:nrow(data_scaled),600)
train <- data_scaled[ind,]
test <- data_scaled[-ind,]
nueral_model <- neuralnet(formula =
Outcome ~ Variable1 + Variable2 + Variable3,
hidden = c(2,2),
threshold = 0.01,
rep = 1,
learningrate = NULL,
algorithm = "rprop+",
linear.output=FALSE,
data= train)
results <- compute (nueral_model, test[2:4])
results <- results$net.result*(max(data$Outcome)-
min(data$Outcome))+ min(data$Outcome)
Values <- (test$Outcome)*(max(data$Outcome)-
min(data$Outcome)) + min(data$Outcome)
MSE_nueral_model[i] <- sum((results - Values)^2)/nrow(test)
pbar$step()
}
答案 0 :(得分:1)
这不一定是你能够在一次重复时正确生成神经网络的问题,但它可能是你在给定随机数种子的情况下在一次运行中正确生成神经网络的结果(123 as列在你的代码中)。在给定一组随机数的情况下,为神经网络建立初始权重。从那些随机的初始权重,它将改进,直到神经网络收敛。给定10次运行此数据,其中至少有一个以一组权重开始,这些权重在前10000次迭代中没有收敛 - 10000是您正在使用的神经网络函数的默认stepmax。
为了解决这个问题,有一些解决方案。首先,您可以增加stepmax,使您的神经网络更有可能收敛
nueral_model <- neuralnet(formula =
Outcome ~ Variable1 + Variable2 + Variable3,
hidden = c(2,2),
threshold = 0.01,
stepmax = 1e+07,
rep = 1,
learningrate = NULL,
algorithm = "rprop+",
linear.output=FALSE,
data= train)
您还可以通过将呼叫限制调用修改为:
来重置阈值参数,以便更容易收敛。threshold = 0.025,
然而,最优选的选项是在计算神经网络时使用try()或trycatch()语句。这样你应该能够以一定的特异性/速度运行你的神经网络,并继续计算甚至对于不收敛的运行。另外,您可以通过查看在给定特定阈值和stepmax的情况下运行百分比收敛来查看收敛百分比。