3

我不确定我是否正确地对数据进行了非规范化。我有一个输出变量和几个输入变量。我正在使用RSNNS 包对它们进行规范化。假设x是一个输入矩阵 ( Nx M),其中每一N行都是具有M特征的对象。Andy是一个向量 ( N) 和对应的答案。

nx <- normalizeData(x, type='0_1')

之后,一些数据用于制作模型,一些用于预测。假设pred.ny是预测值。这些值是标准化的。

pred.y <- denormalizeData(pred.ny, getNormParameters(nx))

这个对吗?它是如何工作的?很明显,一个输入可以使用以前用于标准化的最小值和最大值。但是,如果每个输入都使用自己的最小值和最大值分别归一化,它是如何工作的呢?

更新 这是一个玩具示例,其中 '0_1' 看起来比 'norm' 好。“规范”会产生巨大的训练错误和几乎恒定的预测。

x <- runif(1020, 1, 5000)
y <- sqrt(x)
nx <- normalizeData(x, type='0_1')
ny <- normalizeData(y, type='0_1')
model <- mlp(nx[1:1000], ny[1:1000], size = 1)
plotIterativeError(model)
npy <- predict(model, matrix(nx[1001:1020], ncol=1))
py <- denormalizeData(npy, getNormParameters(ny))
print(cbind(y[1001:1020], py))
4

1 回答 1

3

这里有两件事:

  1. 训练你的模型,即在神经网络中设置内部系数。为此,您同时使用输入和输出。
  2. 使用模型,即获得具有固定内部系数的预测。

对于第 1 部分,您已决定对数据进行规范化。所以神经网络对标准化数据起作用。所以你已经训练了神经网络

  • 在输入f X (X)而不是 X 上,其中 f X是您用于对原始输入矩阵进行的变换,以产生归一化的输入。
  • 在输出f y (y)而不是 y 上,其中 f y是您应用于输出向量以获得归一化输出的变换。

就您的原始输入和输出而言,您经过训练的机器现在看起来像这样:

  • 将归一化函数 f X应用于输入以获得归一化的输入 f X (X)。
  • 使用归一化输入运行神经网络以产生归一化输出 f y (y)。
  • 将非归一化函数 f y -1应用于归一化输出 f y (y) 以获得 y。

请注意,f X (X) 和 f y以及因此 f y -1是在训练集上定义的。

因此,在 R 中,您可能会编写类似这样的内容来获取训练数据并将其标准化,前 100 行

tx <- x[1:100,]
ntx <- normalizeData(tx, type='0_1')
ty <- y[1:100]
nty <- normalizeData(ty, type='0_1')

和类似这样的东西来非规范化预测结果

pred.y <- denormalizeData(pred.ny, getNormParameters(nty))
                                                       # nty (or ny) not nx here

我稍微担心的是,我更愿意使用我用于训练的相同变换 f X对预测中使用的特征进行归一化,但是查看RSNNS 文档,这个工具似乎不存在(这很容易但是,要自己编写)。使用整个 X 矩阵(即包括训练数据)对预测特征进行归一化可能是可以的。(我还可以看到,使用 RSNNS 提供的默认 z 分数归一化可能比您使用的“0_1”选项更可取。)

于 2013-08-08T16:11:33.550 回答