0

我第一次使用 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 的配置不高效,要么我看错了。

欢迎任何提示。

提前致谢,

泽维尔

4

1 回答 1

2

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

我尝试了您的代码,其中 z 是一个因素,正如 Fernando 之前建议的那样,在调用 predict: 时 type='class' 现在效果很好,尽管您的两个类重叠太多,无法获得不错的分类准确性。

干杯,UBod

于 2014-02-14T21:32:54.863 回答