2016-06-03 9 views
4

Я пытаюсь понять код за 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.

+0

Существуют разные значения по умолчанию для энтропии и softmax. (try 'fit1 <- nnet (x, y, size = 3, decay = .1, softmax = T); fit2 <- nnet (Виды ~., data = iris, size = 3, decay = .1, entropy = F) ' – user20650

ответ

1

Как указано @ 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 устраняет проблему, и они совпадают.

fit <- nnet(x, y, size = 3, decay = .1, softmax = TRUE) 
pred <- predict(fit, iris[,1:4]) 
rowSums(head(pred)) 

 Смежные вопросы

  • Нет связанных вопросов^_^