• 为神经网络寻找数据
• 为什么规范化
• 指定规范源
• 指定规范目标
神经网络可以为他们获取到的数据提供深刻的洞察力,然而,你不能将任意类型的数据直接输入到神经网络中,这种“原始”数据必须通常被转换为神经网络能够处理的形式,本章将展示如何规范化“原始”数据,为encog使用。
在数据能够规范化之前,我们必须首先要有数据,一旦你确定神经网络应该做什么,你必须找一些数据教神经网络怎样执行一个任务,幸运的是,互联网提供了丰富的信息能够被神经网络使用。
2.1在哪儿为神经网络获取数据
互联网能够大大地为神经网络提供源数据,在互联网上能后找到大量不同格式的数据,其中一个最方便的格式数据是逗号分隔值(CSV)格式,有时候也许需要创建一个蜘蛛或者机器人来获取这些数据。
神经网络一个非常有用的源是运行在加州大学欧文分校的机器学习仓库:
这个机器学习仓库站点是一个捐赠给加州大学的丰富的数据集仓库,这本书将要使用其中几个数据集。
2.2规范化数据
数据从站点获取,例如上面的列表,通常不能直接传递给神经网络,神经网络能够非常“智能”,但是它不能接受任何种类的数据和产生一个有意义的结果,通常这些数据首先必须规范化,我们将开始定义规范化。
神经网络设计接受一个float型数值作为它的输入,通常为了最大效率这些输入数值应该在-1到+1或者0到+1范围之间,选择哪个范围通常是由选择的激活函数决定的,正如某些激活函数有正的范围,其他的有正和负两个范围。
例如,对于sigmoid激活函数,仅仅有一个正的范围,相反,双曲正切激活函数有正和负的范围,大多数使用双曲正切激活函数则规范化-1到+1的范围。
回想第一章的iris数据集,这个数据集可以被应用到一个分类问题,然而,这些数据对于神经网络来说没有实际有用。
在这里显示部分示例:
这个数据集字段现在必须表示为一个-1到+1之间的float型数值。
这里实际上考虑两个不同属性类型,首先,在这里有四个数值属性,每个将简单映射到一个神经元,这些值将需要缩放到-1到+1.
类别属性,有时被称为标称属性,它提出了一个独特的挑战,在这个例子中,iris种类必须表示为一个或多个float型数值,这个映射将不是一个单一的神经元,因为包含了三个成员,代表种类使用的神经元数将不是一个单一的神经元,代表种类使用的神经元数有可能是两个或者三个,这取决于使用的规范化类型。
下面两节将显示怎样规范化数字值和类值
2.2.1 规范化数字值
规范化一个数字值本质上是处理一个数字值到一个定义好的数字值范围的映射,例如 -1到1,规范化导致所有属性在同一范围内没有一个属性比其他的更强大。
规范化,当前所有属性的数值范围必须是已知的,当前iris属性的数值范围显示如下:
考虑“PetalLength”, petal length的范围是1.0到6.9,这里必须转换为-1到+1的长度,可以使用公式2.1:
上面的公式将规范化一个值x,在这里变量d指定了该数据值的高和低,变量n指定了确定的规范化范围,例如,对于规范化一个petal length值3,到范围-1到+1,以上的公式代入数据就变成为:
这个结果为0.66,这个值将传递到神经网络。
对于回归,神经网络将返回一个值,这些值是一个规范化的值,需要还原一个值,可以使用公式2.3:
比如还原一个值0.66,公式2.3代入数据变成为:
一旦还原,值0.66就变成了2.0,这是重要的,对于这里的计算值0.66是完整的被还原,Encog提供了这两个构建类normalization和denormalization, 这些类在这章的最后将被介绍。
2.2.2 规范化标称值
标称值是用来命名事物的,一个非常通用的示例是一个简单的性别标称值,要么是男性或者女性,另外一个是任何类型布尔问题,标称值也包括了“yes/true”或者“no/false”,然而,不是所有的标称值都仅有两个值。
标称值也可以用来描述某物的属性,如颜色。神经网络最擅长处理固定不变的标称值。对于IRIS数据集,规范化的标称值是物种。对于IRIS数据集,有三种不同的物种需要考虑,这个值不能改变。如果对神经网络进行三种训练,就不可能识别出五种。
Encog支持两种不同编码标称值的方式,最简单的方式被称为“1-n”编码,1-n编码往往很难训练,特别是如果有更多的标称类型编码。等边编码通常是比1-n编码更好的选择,这两种编码类型将在接下来的两节种进行讨论。
2.2.3 理解1-n 规范化
1-n编码是一个非常简单的规范化形式,例如,再一次考虑iris数据集,对神经网络的输入时关于单个IRIS的统计信息,输出说明评估是哪个类别的IRIS,是哪个IRIS类别列表如下:
如果使用1-n规范化,神经网络将有三个输出神经元,这三个神经元中的每一个都代表一种IRIS种类,由神经网络预测的IRIS物种对应于最高激活的输出神经元。生成1-n训练数据是比较容易的,只需给对应于所选iris的神经元分配一个+1, 然后给剩余的神经元分配一个-1,例如,在setosa iris种类将编码如下:
同样的,versicolor将编码如下:
最终,virginica将编码如下:
Encog提供了内置的类来实现这种标准化。这些类将在这一章后面阐述。
2.2.4 理解等边规范化
输出神经元根据训练集中提供的理想输出值不断地进行检查,实际输出和理想输出之间的误差用百分比表示,这样1-N规范化就会有问题,考虑如果神经网络预测的是versicolor iris,这时候应该预测一个versicolor iris,但是实际产生的产生和理想输出如下:
问题是三个输出神经元中只有两个是不正确的,我们想把这个错误的“过失”扩大到神经元的较大百分比,为此,必须确定每个类的唯一值集,每一组值应该与其他值等距离,是versicolor而错误的选择了setosa或者setosa这两种情况,等距离确保具有相同的误差两。
这个可以用Equilateral类来完成,下面的代码段演示了如何使用Equilateral类生成这些值:
对Equilateral类的输入是类的数量和规范化范围,在上面的代码中,有三个类被规范化到范围-1到1,产生以下输出:
注意,这三个类中的每一个都有两个输出,与1-n编码相比,这样减少了所需的神经元数量,等边编码所需的神经元数量总是比1-n编码少些,用等边编码时不会少于三个类。
用等边规范化前先看看一个例子,正如之前,考虑如果神经网络预测versicolor iris,而它应该预测verginica iris,输出和期望值如下:
在这种情况下,只有两个神经元,与等边编码一致,现在所有的神经元都产生错误值,此外,只有两个输出神经元进行处理,略微降低了神经网络的复杂度。
神经网络很少给出与它的任何训练值完全匹配的输出,使用1-N编码处理,看看它的输出神经元产生的最大输出,此方法不适用于等边编码,等边编码显示计算出的类等边值与神经网络的实际输出之间的最短距离。
每个集合在距离上相等的意思是什么?这意味着他们的欧氏距离相等,欧几里得可以用下面的方程计算:
在上述方程中,变量q表示理想的输出值,变量P表示实际输出值,有N个理想和实际的集合,欧式规范化是利用Encog中的Equilateral类实现,通常不需要直接处理Encog的Equilateral类,本章后面讲描述高级规范化方法。
如果你有兴趣知道精确的等边数字计算方法,访问以下网址:
http://www.heatonresearch.com/wiki/Equilatera
2.3编程规范化
Encog提供了大量不同的数据规范化方法,你使用的确切方法将取决于你需要完成的任务,这里总结了三种规范化方法:
a. 规范个体数
b. 规范csv文件
c. 规范内存数据
下面三节将讨论着三个,从规范化个体数开始
2.3.1 规范化个体数
你经常会想简单的规范化或者还原一个单一的数字,在你的数据中的值范围已经知道,在这种情况下,那就没有必要去让Encog自动寻找数据的范围。
“登月舱”程序就是一个很好的例子,你可以在这里找到“登月舱”的示例:
进行规范化,创建几个NormalizedField对象,这里你看到的normalizedField对象是登月舱的燃料。
对于上面的示例,范围被规范化到-0.9到0.9之间,这非常类似于-1到1之间的规范化,但不那么极端,这有时会产生更好的结果,上面的示例也知道燃料的可接受范围在0到200之间。
现在已经创建了这个字段对象,就很容易对值进行规范化,在这里,值100被规范化为变量N:
将n还原为燃料值,使用以下的代码:
当数字到达程序运行时,直接使用normalizedField类是非常有用的,如果已经建立了大量的数字列表,比如数组或者csv文件,这个方法就不会那么有效了。
2.3.2 规范化内存数组
快速规范化一个数组,使用NormalizeArray类,这个对象一次规范化一个属性,在太阳黑子预报示例中显示了规范化数组的一个示例,这个例子可以在这里找到:
开始,创建一个NormalizeArray对象实例,设置标准化的高低范围:
现在,原始数据组可以规范化成规范化数组:
如果你有整个的数组要规范化相同的高低范围,NormalizeArray类可以很好的处理,对于更精细的控制,请使用前面部分中描述的单个值的相同技术,但是,所有数组元素都必须被循环处理。
2.4规范化CSV文件
如果规范化数据已经存储在CSV文件中,EncogAnalyst应该用来规范数据,java和c#语言可以直接通过EncogWorkbench使用Encog Analyst,这节说明如何使用它规范化iris数据集,
若要使文件规范化,请查看下列位置中找到文件规范化示例:
这个例子接受一个输入和输出文件,输入文件是iris数据集,这里显示文件的前几行:
输出将是一个规范化版本的输出文件,如下面显示:
上面的数据显示,所有数值都被规范化到-1到1之间,此外,物种字段分为两部分,这是因为物种列使用了等边规范。
2.4.1 实现基本文件规范化
在上一节中,你看到EncogAnalyst规范化文件,在本节中,你将学习实现此目标所需的编程代码,通过接受源和目标文件开始:
现在创建Encoganalyst和Analystwizard类的实例。wizard将分析源文件并构建执行正常化所需的所有规范化统计数据:
现在可以启动wizard:
现在已经分析了输入文件,现在是创建规范化对象的时候了。该对象将执行实际的规范化:
必须指定CSV的输出格式,在这种情况下,使用英语指定小数点。同样重要的是生成输出头以方便地识别所有属性:
最后,我们规范化这个文件:
现在这个数据已经规范化了,规范化的数据也许需要保存以供以后使用,这将在下一节介绍。
2.4.2 保存规范化脚本
Encog统计规范化数据,这个数据,被称为归一化数据,告诉Encog规范化的每个属性的数值范围,这些数据可以保存所以不需要每次都重新规范化,保存数据文件,使用以下的代码:
文件能够使用下面代码后重新加载:
EncogAnalyst保存文件的扩展文件后缀为EGA
2.4.3 定制文件规范化
EncogAnalyst包括了AnalystField对象的集合,这些对象持有规范化的类型和每个属性的范围,这个集合可以直接访问规范化属性的改变,同样的,AnalystField对象也能够移除和排除来自最终的输出。
以下的代码显示怎样访问通过wizard确定的每一个字段:
在这儿对于每个AnalystField对象有几个重要的属性,例如,要改变规范化的范围到[0, 1], 执行以下的代码:
规范化模式也能后改变,使用1-n规范化而不是等边规范化,仅仅使用以下的一句代码:
EncogAnalyst不仅仅能够规范化数据,它也能够执行整个神经网络的规范化,训练和评估,这部分将在第三章和第四章详细介绍,第三章说明了怎样用workbench来实现,第四章将说明怎样用代码来实现。
2.5总结
这章说明了怎样为Encog获取和规范化数据,这里有大量不同的数据源,一个最好的是UCI机器学习仓库,在本书中提供了大量的数据集示例。
这里有两种广泛的规范化数据类,数值型和非数值型,这两种数据类每一个都有规范化技术。
数值类规范化通过映射值到一个指定的范围,通常是-1到+1,另外一个通用的范围是0到+1,在这一章前面提供了两个规范化和反规范化的公式。
非数值型数据通常是一个定义类的属性,对于iris数据集例子,iris种类是一个非数值型类,规范化这个类,他们必须转换到一个float型数组,就像数值数据。
Encog支持两种标称值规范化,第一个被称为“1-n”,1-n创建一个和分类数量相同的神经元数,类别对应的那个编码为值1,另外的为0.
等边编码是另外编码类别的一种方式,对于等边编码,大量神经元的使用等于1,少于分类项目的数量,为每一个类别项目创建一个统一的float型数值编码,它到另外的数据分类项目的等边距离是相等的,这允许所有输出神经元参与每个分类的部分,会比1-n神经元编码导致一个错误的影响。
这章介绍EncogAnalyst并说明了将它使用规范化数据,EncogAnalyst能够在EncogWorkbench中使用,EncogWorkbench是一个GUI应用程序,允许访问神经网络的许多特性而不需要编写代码。
网友评论