Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-神经网络中标称属性的规范化和非规范化_Java_Arrays_Neural Network_Backpropagation - Fatal编程技术网

Java-神经网络中标称属性的规范化和非规范化

Java-神经网络中标称属性的规范化和非规范化,java,arrays,neural-network,backpropagation,Java,Arrays,Neural Network,Backpropagation,嗨,我正在建立一个简单的多层网络,它是使用反向传播进行训练的。目前我的问题是,我的数据集中的一些属性是名义属性(非数字),我必须对它们进行规范化。我想知道最好的方法是什么。我一直在考虑计算每个属性有多少个不同的值,并在0和1之间为每个属性分配一个相等的数字。例如,假设我的一个属性的值为A到E,那么下面的值合适吗 A = 0 B = 0.25 C = 0.5 D = 0.75 E = 1 我的问题的第二部分是对输出进行非规范化,使其返回到标称值。为了得到一个数字表示,我会首先对数据集中每个不同的

嗨,我正在建立一个简单的多层网络,它是使用反向传播进行训练的。目前我的问题是,我的数据集中的一些属性是名义属性(非数字),我必须对它们进行规范化。我想知道最好的方法是什么。我一直在考虑计算每个属性有多少个不同的值,并在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)?

这实际上取决于您试图规范化的属性的含义,以及NN中使用的函数。例如,如果您的属性是非线性的,或者如果您使用的是非线性激活函数,那么线性规范化可能不会达到您想要的效果

如果属性值的范围相对较小,则将输入和输出拆分为二进制输入和输出集可能会更简单、更准确

编辑: 如果NN能够准确执行其功能,其中一个输出将显著高于其他输出。如果没有,您可能会遇到问题,这取决于您何时看到不准确的结果

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

如果您成功地训练了神经网络,但在处理真实数据集时发现不准确,那么您的训练集可能不够具有代表性


在所有这些情况下,您的NN很可能做了与您希望它做的完全不同的事情。因此,在这一点上,简单地选择最高输出是一个很好的猜测。但是绝对不能保证这是一个更好的猜测。

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

标称变量与顺序变量

假设
A
B
等代表颜色。这些是标称变量的值,不能以有意义的方式排序。你不能说红色大于黄色。因此,不应将数字指定给标称变量

现在假设
A
B
C
等代表服装尺寸,例如
small
medium
large
,等等。即使我们不是在绝对尺度上测量这些尺寸(即,我们不说
small
对应胸围40),很明显,
小型
中型大型。考虑到这一点,设置
small=1
medium=2
large=3
,或
small=2
medium=4
large=8
,仍然有些随意

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

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


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

此外,顺序是否重要,例如A被指定为0而不是B等是否重要?因此,假设我有5个输入属性,其中一个属性是标称属性(可能有20个值),这是否意味着我必须有4个输入节点加上20个输入节点作为标称属性?那么输入层总共有24个节点?这是最简单的方法,是的。任何更智能的操作都可能需要知道您的标称属性究竟代表什么。那么这是否意味着只有一个输出节点包含1,其余的节点包含0?答案就是1?的节点。根据您试图解决的问题,检查其他输出也可能有用或必要。如果有多个输出处于活动状态,则NN无法生成准确的答案(类似于单个输出NN生成~0.5)。我的网络的问题是,它在分类时只能生成一个输出,因此我只关心一个输出1的节点。如果有多个节点的值为1,那么最终的答案是什么?数值标准化为介于0和1之间。我面临的问题与名义属性有关。继续我的例子,多吃20块