R - nnet,带有2个变量的2个类的简单示例

时间:2014-02-14 20:19:17

标签: r nnet

我第一次使用nnet,使用网络上的基本示例进行播放,但无法使用虚拟玩具数据集来显示其输出。使用正常分布的2个变量简单区分两个类(信号和背景)。

以下代码可以在R(版本3.0)中复制和粘贴:

library(nnet)

## Signal
xs = rnorm( mean=0, sd=1, n=10000)
ys = rnorm( mean=1, sd=1, n=10000)
typs = rep( x=1, n=10000 )
sig = data.frame( typs, xs, ys )
colnames(sig) = c("z","x","y")
sig_train = sig[c(1:5000),]
sig_test = sig[c(5001:10000),]

## Background
xb = rnorm( mean=1, sd=1, n=10000)
yb = rnorm( mean=0, sd=1, n=10000)
typb = rep( x=-1, n=10000 )
bkg = data.frame( typb, xb, yb )
colnames(bkg) = c("z","x","y")
bkg_train = bkg[c(1:5000),]
bkg_test = bkg[c(5001:10000),]

## Training
trainData = rbind( sig_train, bkg_train )
nnRes = nnet( z ~ ., trainData, size = 2, rang = 0.5, maxit = 100)
print(nnRes)

## Testing
sigNNPred = predict(nnRes, sig_test )
bkgNNPred = predict(nnRes, bkg_test )

当看到sigNNPred时我只有零!

所以要么我的NN的配置不合适,要么我看错了。

欢迎任何提示。

提前致谢,

1 个答案:

答案 0 :(得分:2)

对目标值存在误解(在您的情况下,列'z')。如果要进行分类,则必须将目标列转换为因子,或者必须使用0/1而不是-1/1。否则,-1值远远超出激活函数的可能范围(除非使用linout = TRUE,这对分类没有意义)。

我尝试使用z作为一个因素的代码,并且正如Fernando先前所建议的那样,当调用predict时,类型='class'现在很好地工作,尽管你的两个类重叠太多以至于不能提供合适的分类精度。 / p>

干杯,UBod