创建NTL+语言的神经网络


引言

人工神经网络 - 是由数学模型, 及其机器硬件和软件的实现, 是基于生物神经网络的组合和功能 - 大脑的神经细胞网络.

当前神经网络应用广泛, 例如识别,分类,联合存储,规律性的确定,预测等等.

神经网络需要单独的数学或基于数学包的附加模型, 以便于提供不同类型和配置方案的网络结构

我们试图基于NTL+语言重新创建自己的网络,并同时尝试面向对象的编程.

问题选择

在本文中我们来测试, 基于过去的烛图可以预测未来柱图的确定走势: 下降或上涨。

这涉及分类问题。我们公司的金融工具允许使用历史数据,以此获得专业的评估。并创建基于多层感知的网络。

因此,根据k柱的收盘价创建网络而预测随后烛图的状态. 如果其收盘价高于前一柱, 那么取输出值1(价格上涨)。在其他情况下,输出值取0(价格没有变化或下跌)。

网络建设

一般而言,多层感知具有一个输入层,一个或多个隐藏层和一个输出层。单个隐藏层足够进行输入转为输出. 使用更多数量的隐藏层只能导致网络学习速度明显放缓, 而没有显著的学习质量.

在网络中保留1个输入层, 一个隐藏层和一个输出层. 在下面的图中显示网络的体系结构. x1 - xn - 输入 (收盘价), wi,j - 自节点i至j的边缘权重; y1 - ym 隐层神经元, o1 - ok 网络输出.


网络也使用输入偏移(偏移输入). 使用这些输入可以确保我们的网络沿x轴移动激活的函数, 从而不仅改变激活函数的斜率, 还可以保证线性偏移.

1. 激活函数表 当 = 1
2. 激活函数表 при =2 和 = 1
3. 激活函数表, 偏移为 当=2, = 1 和 = 1

每个网络节点的值将按照下面的公式计算:
, где f(x) - 激活函数, n - 前一层的节点数.

激活函数

激活函数来计算经过加法器之后获得输出信号。 人工神经元通常作为一个非线性函数的参数。最常用的激活函数:

费米函数(S型指数):


合理的S型:


双曲正切


确定每个节点的输出需要选择合理的S型, 因其计算需要较少时间.

网络学习的过程

为了学习, 我们的神经网络实现了误差的反向传输. 该方法是利用了多层感知达到误差最小化的重复算法. 算法的主要思想是: 在神经网络输出计算后, 计算每个节点和边的误差W的偏差, 并且错误的计算方法是由输出端至输入端. 之后按照误差值校正权重W . 该算法对激活函数的唯一的要求是: 被微分. S型和双曲正切满足这一要求.

因此, 在学习的过程中, 我们需要做到以下几点:

  1. 初始化所有边的权重随机值.
  2. 对于所有的输出, 神经网络计算统计修正
    , 其中 oj - 神经网络计算的输出, tj - 实际值
  3. 除了最后一个节点, 其他都由下面的公式计算
    , wj,k 节点输出的边的权重用于计算修正 节点计算的误差位于两个系那个林的输出层.
  4. 对于每个神经网络的边计算修正:
    , 其中oi 自边的输出的节点计算输出 被计算的节点输出, 用于计算修正, 而被计算的节点修正, 其中包括确定的边.
  5. 校正所有边的权重值:
  6. 重复步骤2 - 5 , 针对所有学习的例子或暂时未达到质量准则的.

准备输入数据

对于实现神经网络的学习需要准备输入数据, 有质量的输入值可以很好的影响网络的工作及其参数w的稳定速度, 也就是学习的过程.

所有的输入向量被正常化, 以便起分量处于区间[0;1] 或 [-1;1]. 正常化使得所有输入向量在网络学习的过程中是平等的, 从而保障学习的修正.

我们来正常化输入向量 - 使其分量处于[0;1], 对此需要使用下列公式:

作为向量的分量, 将进入柱体的收盘价, 并且作为输入移动至[n+k;n+1]柱体的收盘价, 其中k是输入向量的大小. 希望值的确定基于n柱体. 其值大小的确定将遵循: 如果n柱的收盘价大于n+1柱的收盘价, 则取希望值为1, 如果低于或等于, 那么取0;

在图表中标出了黄色的柱体, 其参与组成每组数据(#1, #2), 橙色的是用于确定希望值.

在网络学习的过程中, 也会影响数据的次序也会影响学习的过程. 如果输入向量均匀提供1和0,那么学习的过程更稳定.

同样形成了单独的数据组, 用于评估网络工作的有效性. 这些数据网络不会用于学习, 仅用于按照最小二次方的方法计算错误. 在测试组数据添加10%的输入例子. 其结果是90%例子将用学习, 10%用于评估.

最小二次方计算错误的功能有下列方式:
,
где - 网络输出信号和 - 输出信号的需要值.

查看准备为神经网络输入向量的脚本代码

分析DataSet类 - 数据组. 该类包括:

  • 输入值向量数组 - input
  • 生出输出值- output
  • Normalize 方法- 标准化(正常化)数据
  • OutputDefine方法- 确定价格的实际值
  • AddData方法- 在输入向量的记录值和变量的实际值
  • To_file 方法 - 单矩阵的数据组, 针对下一条目

输入不同数量的学习的例子, 可以看到我们的网络学习的过程.


图中红线对应1的学习例子. 蓝线 - 对应0. 根据各自横轴截取学习的例子, 根据纵轴计算学习例子的网络值. 可以看出, 如果例子的数量少(25及其以下)网络不能差别不同的输入向量, 如果数量多- 很明确的分为两类.

评估网络

为了评估学习的效果, 我们使用最小二次方的方法计算错误. 对此要创建具有以下代码的实用程序并运行它. 在此添加2个文件: "test.txt" - 计算错误时用到的数据和希望值, "NT.txt" - 已计算参数的文件.

该脚本完成下列步骤:

  • 创建net类的对象NT
  • 校对参数w 并加载至NT
  • 创建数组的网络输出和输入
  • 校对输入值并置于数组'x'中, 校对输入并置于'reals'
  • 计算网络的输出, 提供给数字'x'
  • 计算错误error, 所有计算值和实际值差异的平方和
  • 当临近文件结尾, 输出错误值并退出脚本

显示的直方图反映下一个柱图的预期. 值从0.5-1说明下一个柱图很有可能是下降的. 值从0至0.5则说明下一个柱图很有可能是上涨的. 0.5对应的是不确定. 即下一个柱图可能上涨, 也可能下降.

概要

神经网络是技术分析的强大工具. 在本文中展示了通过NTL+利用面向对象的语言来创建神经网络的过程. 使用面向对象的方法使得简化代码, 并更容易用在未来的脚本中. 在实践中, 我们创建了类 layer 描述神经网络的层和类net描述整体的网络. 类net我们用于确定错误数量和计算权重的指标. 此外还举例展示了如何利用学习网络.