更新:当查看足够小的阈值(即等于或低于默认值0.01)时,此错误似乎是覆盖非收敛的一揽子声明。监控threshold
后增加stepmax
和lifesign
可以使算法收敛,尽管准确度会受到影响。
在前面,这不是一个重复的问题,因为我在这里查看了所有其他16个类似的问题/答案,这些解决方案要么不完全适用,要么不解决这个看似简单的问题。我找到的最接近的是Getting errors while using neuralnet function,它有一些很好的见解,但是尽管在代码中更改了参数,但仍然给我留下了相同的唠叨错误。
数据样本(仅前几行):
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30
18 1 2 4 1 5 5 5 1 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
19 2 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
20 2 1 1 1 5 3 5 1 2 4 1 4 4 2 1 3 1 1 2 3 0 1 1 0 0 0 1 0 0
20 2 1 1 1 3 4 4 1 2 1 1 2 2 1 1 4 1 1 1 0 0 0 0 0 0 0 0 0 0
34 1 2 2 1 2 2 2 1 2 1 1 1 1 1 1 1 1 1 0 2 0 0 0 0 0 0 0 0 0
25 2 1 1 2 3 5 3 1 2 2 1 4 3 1 2 1 1 1 2 2 0 0 0 0 0 0 0 0 1
19 1 2 1 2 2 4 2 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
21 1 2 1 2 2 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
23 1 2 1 2 2 3 4 1 2 2 2 2 2 1 3 2 2 1 2 10 0 0 0 0 1 1 1 1 0
19 2 1 1 2 2 2 2 1 2 2 2 1 2 1 2 1 1 1 2 14 0 0 0 0 1 1 1 0 0
28 2 1 1 2 1 3 3 1 2 1 0 1 4 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
19 1 2 1 2 1 3 2 1 2 2 2 2 2 2 3 4 2 1 2 12 0 1 1 0 1 1 1 0 0
18 1 2 1 1 3 4 1 1 2 2 2 1 3 2 1 1 1 1 2 17 0 0 0 1 0 1 1 0 0
20 1 2 1 2 3 4 1 1 1 1 1 1 1 1 1 1 1 1 0 5 0 0 0 0 0 0 0 0 0
20 1 2 1 1 1 1 3 1 2 4 4 4 4 4 4 4 4 2 4 16 1 0 1 1 0 1 1 0 1
数据描述:
标记数据和所有数字,因此通过sapply(df, is.numeric)
进行检查,我们得到数据框中每个变量的TRUE
。
从神经网络上的一个R-Blogger页面获取的代码:
set.seed(300)
cv.error <- NULL
k <- 10
pbar <- create_progress_bar('text')
pbar$init(k)
for(i in 1:k){
index <- sample(1:nrow( df),round(0.9*nrow( df)))
train.cv <- scaled[index,]
test.cv <- scaled[-index,]
nn <- neuralnet(f,data=train.cv,hidden=c(5,2),linear.output=T)
pr.nn <- neuralnet::compute(nn,test.cv[,2:30])
pr.nn <- pr.nn$net.result*(max( df$X30)-min( df$X30))+min( df$X30)
test.cv.r <- (test.cv$X30)*(max( df$X30)-min( df$X30))+min( df$X30)
cv.error[i] <- sum((test.cv.r - pr.nn)^2)/nrow(test.cv)
pbar$step()
}
我在这个数据框中使用变量X30作为标签,当我使用严重偏差的数据时,我能够相对快速地收集此代码,即5分钟。但是,使用此数据集时,代码不会因为此错误而收敛:
Error in nrow[w] * ncol[w] : non-numeric argument to binary operator
回溯返回以下内容:
2. relist(weights, nrow.weights, ncol.weights)
1. neuralnet::compute(nn, test.cv[, 2:30])
我还尝试取消列表并将数据框重新组合为数字,以防万一最初出现问题,但这并没有解决问题。