r - 理解多项式网络

标签 r nnet

我试图理解背后的代码 nnet .当我将多项因子拆分为二进制列而不是使用公式方法时,我目前得到了不同的结果。

library(nnet)

set.seed(123)
y <- class.ind(iris$Species)
x <- as.matrix(iris[,1:4])
fit1 <- nnet(x, y, size = 3, decay = .1)

# weights:  27
#initial  value 164.236516 
#iter  10 value 102.567531
#iter  20 value 58.229722
#iter  30 value 39.720137
#iter  40 value 25.049530
#iter  50 value 23.671837
#iter  60 value 23.602392
#iter  70 value 23.601927
#final  value 23.601926 
#converged

pred1 <- predict(fit1, iris[,1:4])
rowSums(head(pred1))
[1] 1.032197661 1.033700173 1.032750746 1.034229149 1.032052937 1.032539980

set.seed(123)
fit2 <- nnet(Species ~ ., data = iris, size = 3, decay = .1)

# weights:  27
#initial  value 158.508573 
#iter  10 value 37.167558
#iter  20 value 26.815839
#iter  30 value 23.746418
#iter  40 value 23.698182
#iter  50 value 23.697907
#final  value 23.697907 
#converged

pred2 <- predict(fit2, iris[,1:4])
rowSums(head(pred2))
1 2 3 4 5 6 
1 1 1 1 1 1 

我知道我可以只使用后一种方法( formula 方法),但我想了解为什么在源代码 nnet.formula 中出现相同的 split 因子方法时结果不同.

最佳答案

正如@user20650 所指出的,softmax论据不同。内nnet.formula有部分:

if (length(lev) == 2L) {
    y <- as.vector(unclass(y)) - 1
    res <- nnet.default(x, y, w, entropy = TRUE, ...)
    res$lev <- lev
}
else {
    y <- class.ind(y)
    res <- nnet.default(x, y, w, softmax = TRUE, ...)
    res$lev <- lev
}

这里softmax设置为 TRUE .在 nnet 中设置它call 解决了问题,现在它们匹配了。
fit <- nnet(x, y, size = 3, decay = .1, softmax = TRUE)
pred <- predict(fit, iris[,1:4])
rowSums(head(pred))

关于r - 理解多项式网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621320/

相关文章:

r - 为什么多边形功能存在微小差距?

R:在将数据发布到使用管道工创建的 REST API 的同时在网页上打印绘图

r - 如何声明数据框中所有字符列的编码?

r - 我在训练神经网络时收到错误 "Error in nnet.default(x, y, w, ...) : too many (77031) weights"

r - 顺序神经网络

使用单个命令运行具有不同参数的函数列表

r - 使用神经网络包进行多项分类

r - ggplot2条形图的子集data.frame

r - R:针对nnet多项式拟合的Tukey posthoc测试,以测试多项式分布的总体差异

r - 跨区间边界对数据进行分箱