Java - 对神经网络中的名义属性进行归一化和非规范化

时间:2013-03-14 11:52:20

标签: java arrays neural-network backpropagation

您好我正在构建一个使用反向传播训练的简单多层网络。我目前的问题是我的数据集中的某些属性是名义上的(非数字),我必须将它们标准化。我想知道最好的方法是什么。我正在考虑计算每个属性有多少不同的值,并在0和1之间分配相同的数字。例如,假设我的一个属性具有值A到E,那么以下是否适合?:< / p>

A = 0
B = 0.25
C = 0.5
D = 0.75
E = 1

我的问题的第二部分是对输出进行非规范化以使其恢复到标称值。我是否会首先对数据集中的每个不同输出属性值执行与上面相同的操作以获得数字表示?在我从网络获得输出后,我是否只看到它接近哪个数字?例如,如果我得到0.435作为输出,我的输出属性值分配如下:

x = 0
y = 0.5
z = 1

我是否只找到最接近输出的值(0.435),即y(0.5)?

2 个答案:

答案 0 :(得分:1)

这实际上取决于您尝试规范化的属性的含义,以及您在NN中使用的功能。例如,如果您的属性是非线性的,或者您正在使用非线性激活函数,那么线性规范化可能不会最终执行您希望它执行的操作。

如果属性值的范围相对较小,则将输入和输出分成多组二进制输入和输出可能更简单,更准确。

修改: 如果NN能够准确地执行其功能,则其中一个输出将显着高于其他输出。如果没有,您可能会遇到问题,具体取决于您何时看到不准确的结果。

预计在早期训练期间会产生不准确的结果。当您执行更多的训练迭代时,它们应该变得越来越不常见。如果他们不这样做,您的NN可能不适合您尝试执行的任务。这可能仅仅是增加隐藏层的大小和/或数量的问题。或者它可能是一个更基本的问题,需要知道你正在尝试做什么。

如果您已经成功训练了NN,但在处理实际数据集时看到的不准确,那么您的训练集可能不够具有代表性。

在所有这些情况下,您的NN很可能会做出与您希望的完全不同的事情。所以在这一点上,只需选择最高输出即可。但绝对不能保证它会是更好的猜测。

答案 1 :(得分:1)

如果变量是序数不是名义,那么你只能做你提出的建议,即使这样,它也是一个有点武断的决定。在我提出解决方案之前,请注意术语:

名义与序数变量

假设AB等代表颜色。这些是名义变量的值,不能以有意义的方式排序。你不能说红色大于黄色。因此,您不应该为名义变量分配数字。

现在假设ABC等代表服装尺码,例如smallmediumlarge等等。即使我们没有在绝对范围内测量这些尺寸(也就是说我们没有说small对应40个胸部周长),显然small&lt; medium&lt; large。考虑到这一点,无论您设置small=1medium=2large=3还是small=2medium=4large=8,它仍然有些武断。

一个N编码 更好的方法是使用所谓的一次性N编码。如果您有5个不同的值,则需要五个输入单位,每个输入单位可以取值10。继续我的服装示例,尺寸extra small可以编码为10000small编码为01000,中等编码为00100等。

类似的原则适用于网络的输出。如果我们将服装尺寸视为输出而不是输入,当网络输出向量[0.01 -0.01 0.5 0.0001 -.0002]时,您将其解释为尺寸medium

回复你对@ Daan帖子的评论:如果你有5个输入,其中一个输入需要20个离散值,你将需要24个输入节点。您可能希望将4个连续输入的值标准化为[0, 1]范围,因为它们可能最终会支配您的离散变量。