期货量化交易软件:运用 Kohonen 映射在市场中寻找出路
概述
Kohonen 映射、或自组织映射(SOM)、或自组织特征映射(SOFM)。 是一种无监督机器学习技术,用于生成高维数据集的低维(通常是二维)表示,同时保留数据的拓扑结构。 例如,具有 n 个观测值中测量的 p 个变量的数据集,可以表示为具有相似变量值的观测值聚类。 然后,可以将这些聚类可视化为“二维映射”,如此令近端聚类中的观测值比远端聚类中的观测值具有更相似的值,这可令高维数据更容易可视化和分析。

Kohonen 映射是由芬兰数学家 Teuvo Kohonen 于 1980 年代开发的。

概览
Kohonen 映射由连接到其相邻神经元的神经元网格组成,在训练期间,输入数据被呈现给网络,且每个神经元都要计算其与输入数据的相似度。 具有最高相度的神经元称为获胜者,其权重被调整,以便更好地匹配输入数据。

随着时间的推移,相邻的神经元也会调整它们的权重,令其与获胜神经元相似度更高,从而产生图中神经元的拓扑顺序。 这种自组织过程允许 Kohonen 映射表示低维空间中输入数据之间的复杂关系。 令其可用于数据可视化和聚类分析。
学习算法
该算法在自组织映射中的目标是令网络的不同部分对某些输入形态做出类似的响应。 这部分的激发模拟人脑的某些部分如何处理视觉,听觉和其它信息。
赫兹量化看看这个算法在数学术语和 赫兹量化代码方面是如何工作的。
算法中涉及的步骤
尝试对此算法进行编码时,需要考虑四个主要步骤:
步骤 01: 初始化权重

。 可以假设随机值。 其它参数(如学习率和聚类数量)也在此阶段初始化。
CKohonenMaps::CKohonenMaps(matrix &matrix_, bool save_clusters=true, uint clusters=2, double alpha=0.01, uint epochs=100) { Matrix = matrix_; n = (uint)matrix_.Cols(); rows = matrix_.Rows(); m = clusters; cluster_tensor = new CTensors(m); w_matrix =matrix_utils.Random(0.0, 1.0, n, m, RANDOM_STATE); }
如往常一样,参数在 Kohonen 映射的类构造函数中初始化。
Kohonen 映射是一种数据挖掘技术。 在完成全部所言之后,赫兹量化需要获得挖掘的数据,这就是为什么您看到布尔参数 save_clusters=true,这将令我们获得 Kohonen 映射为我们获得的聚集。
步骤 02: 计算每个输入与其各自权重之间的欧几里得距离

其中:

= 输入向量

= 权重向量
double CKohonenMaps:: Euclidean_distance(const vector &v1, const vector &v2) { double dist = 0; if(v1.Size() != v2.Size()) Print(__FUNCTION__, " v1 and v2 not matching in size"); else { double c = 0; for(ulong i=0; i<v1.Size(); i++) c += MathPow(v1[i] - v2[i], 2); dist = MathSqrt(c); } return(dist); }
为了应用这个公式,并澄清一切,赫兹量化需要一个简单的数据集来帮助我们编码和测试。
matrix Matrix = { {1.2, 2.3}, {0.7, 1.8}, {3.6, 4.8}, {2.8, 3.9}, {5.2, 6.7}, {4.8, 5.6} }; maps = new CKohonenMaps(Matrix); //Giving our kohonen maps class data
当调用构造函数,并生成权重时,下面是输出。
CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) w Matrix CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [[0.005340739158299509,0.01220740379039888] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [0.5453352458265939,0.9172643208105716]] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) Matrix CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [[1.2,2.3] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [0.7,1.8] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [3.6,4.8] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [2.8,3.9] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [5.2,6.7] CS 0 15:52:27.572 Self Organizing map (EURUSD,H1) [4.8,5.6]]
您也许已经注意到,赫兹量化的神经网络架构是一个 [2 输入和 2 输出],这就是为什么我们有一个 2x2 的权重矩阵。 该矩阵是在考虑 [2 个标记为 n 的输入矩阵列,和 2 个选择标记为 m 的聚集]的情况下生成的。 从下面的代码行中,我们在第一部分就看到了。
w_matrix =matrix_utils.Random(0.0, 1.0, n, m, RANDOM_STATE);
恰好澄清一下,以下是我们的 Kohonen 映射神经网络架构的样子;

步骤 03: 找到获胜单位索引 i,如此 D(j) 最小。 简言之,找到单元聚集,这会把我带到了kohonen 映射竞争学习的一个重要主题。
竞争性学习。
自组织映射是一种人工神经网络,与其它类型的人工神经网络不同,它用纠错学习(例如梯度下降的反向传播)进行训练,Kohonen 映射采用竞争性学习进行训练。
在竞争性学习中,Kohonen 映射中的神经元相互竞争,成为与输入数据最相似的神经元,从而成为“赢家”。
在训练阶段,每个输入数据点都呈现给 Kohonen 映射,并计算输入数据和每个神经元的权重向量之间的相似度。 权重向量与输入数据最相似的神经元称为赢家或“最佳匹配单元”(BMU)。
BMU 是根据输入数据和神经元权重矢量之间的最小欧几里得距离进行选择的。 然后,获胜的神经元更新其权重向量,令其与输入数据相似度更高。 用于更新权重的公式称为 Kohonen 学习规则,它移动获胜神经元的权重向量,及与输入数据相邻的神经元。
为了编写步骤 03 的代码。 需要这几行代码。
vector D(m); //Euclidean distance btn clusters | Remember m is the number of clusters selected for (ulong i=0; i<rows; i++) { for (ulong j=0; j<m; j++) { D[j] = Euclidean_distance(Matrix.Row(i),w_matrix.Col(j)); } #ifdef DEBUG_MODE Print("Euc distance ",D," Winning cluster ",D.ArgMin()); #endif
永远记住,所有产生欧几里得距离较小的神经元的类是为获胜的聚集。
通过竞争性学习,Kohonen 映射学习在低维空间中创建输入数据的拓扑表示,同时保留输入数据之间的关系。
步骤 04: 更新权重。
可以使用以下公式更新权重。
其中:
= 新权重向量
= 旧权重向量
= 学习率
= 输入向量
下面是此公式的代码:
//--- weights update ulong min = D.ArgMin(); //winning cluster vector w_new = w_matrix.Col(min) + (alpha * (Matrix.Row(i) - w_matrix.Col(min))); w_matrix.Col(w_new, min);
不同于其它类型的人工神经网络,其中特定层的所有权重都参与其中,Kohonen 映射会注意特定聚集的权重,并仅用它们来参与查找该聚集。