使用 R 和包neuralnet
,我尝试对数据进行建模,如下所示:
这些是几天内以 10 分钟为间隔的温度读数(上面是 2 天的截图)。使用下面的代码,我将神经网络拟合到数据。可能有更简单的方法来对这些精确数据进行建模,但将来数据可能看起来完全不同。使用带有 2 个神经元的单个隐藏层给了我令人满意的结果:
这也有效大多数时候有更多的层和神经元。然而,一个隐藏层和一个神经元偶尔有两层(在我的例子中分别是 3 和 2 个神经元),我得到的结果相当差,总是具有相同的形状:
唯一随机的是起始权重的初始化,所以我认为它与此相关。然而,我必须承认我还没有完全掌握神经网络的理论。我想知道的是,糟糕的结果是否是由于局部最小值(“神经网络”默认使用带有权重回溯的弹性反向传播)而我只是运气不好,或者我是否可以避免这种情况。我的印象是,存在用于拟合的隐藏节点的最佳数量,例如2、5、10 次多项式。如果不是,我最好的做法是什么?更大的学习率?误差阈值更小?提前致谢。
I have not尝试调整 rprop 参数,所以解决方案可能就在那里。
Code:
# DATA ----------------------
minute <- seq(0, 6*24 - 1)
temp <- rep.int(17, 6*24)
temp[(6*7):(6*20)] <- 20
n <- 10
dta <- data.frame(Zeit = minute, Status = temp)
dta <- dta[rep(seq_len(nrow(dta)), n), ]
# Scale everything
maxs <- apply(dta, 2, max)
mins <- apply(dta, 2, min)
nnInput <- data.frame(Zeit = dta$Zeit, Status = dta$Status)
nnInput <- as.data.frame(scale(nnInput, center = mins, scale = maxs - mins))
trainingData <- nnInput[seq(1, nrow(nnInput), 2), ]
testData <- nnInput[seq(2, nrow(nnInput), 2), ]
# MODEL ---------------------
model <- as.formula("Status ~ Zeit")
net <- neuralnet::neuralnet(model,
trainingData,
hidden = 2,
threshold = 0.01,
linear.output = TRUE,
lifesign = "full",
stepmax = 100000,
rep = 1)
net.results <- neuralnet::compute(net, testData$Zeit)
results <- net.results$net.result * (maxs["Status"] - mins["Status"]) + mins["Status"]
testData <- as.data.frame(t(t(testData) * (maxs - mins) + mins))
cleanOutput <- data.frame(Actual = testData$Status,
Prediction = results,
diff = abs(results - testData$Status))
summary(cleanOutput)
plot(cleanOutput$Actual[1:144], main = "Zeittabelle", xlab = paste("Min. seit 0:00 *", n), ylab = "Temperatur")
lines(cleanOutput$Prediction[1:144], col = "red", lwd = 3)