您好,我正在构建一个简单的多层网络,该网络是使用反向传播进行训练的。我目前的问题是数据集中的某些属性是名义的(非数字),我必须对它们进行标准化。我想知道最好的方法是什么。我正在考虑计算每个属性有多少个不同的值,并为每个属性分配一个介于 0 和 1 之间的相等数字。例如,假设我的一个属性具有值 A 到 E,那么以下内容是否合适?:
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)?
最佳答案
只有当变量是序数且非名义时,您才能执行您所建议的操作,即使这样,这也是一个有点武断的决定。在我提出解决方案之前,请注意术语:
名义变量与序数变量
假设A
、B
等代表颜色。这些是名义变量的值,不能以有意义的方式排序。你不能说红色大于黄色。因此,您不应该将数字分配给名义变量。
现在假设A
、B
、C
等代表服装尺码,例如small
、medium
、large
等。即使我们没有以绝对比例测量这些尺寸(即我们不会说small
对应于 40 胸围),但很明显small
< medium
< large
。考虑到这一点,无论您设置small=1
、medium=2
、large=3
还是small=2
、medium=4
、large=8
,仍然有些任意。
N 之一编码
解决此问题的更好方法是使用所谓的 N 中之一编码。如果您有 5 个不同的值,则需要 5 个输入单元,每个单元都可以采用值1
或0
。继续我的服装示例,尺码extra small
可以编码为10000
,small
可以编码为01000
,中号可以编码为00100
,等等。
类似的原则适用于网络的输出。如果我们将服装尺寸视为输出而不是输入,那么当网络输出 vector [0.01 -0.01 0.5 0.0001 -.0002]
时,您会将其解释为尺寸medium
。
回复您对@Daan 帖子的评论:如果您有 5 个输入,其中之一需要 20 个可能的离散值,则您将需要 24 个输入节点。您可能希望将 4 个连续输入的值标准化为范围[0, 1]
,因为它们最终可能会主导您的离散变量。
关于Java - 神经网络中的标称属性标准化和非标准化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408487/