文章 "在 MetaTrader 5 中使用自组织特征映射(Kohonen 映射)"

 

新文章 在 MetaTrader 5 中使用自组织特征映射(Kohonen 映射)已发布:

自组织特征映射(Kohonen 映射)最有趣的方面是,其在不受监督的情况下就可学会对数据进行分类。就其基本形式而言,该映射能够生成输入数据的一个类似映射(聚类)。可使用 SOM 映射实现高维数据的分类和可视化。在本文中,我们将讨论 Kohonen 映射的几个简单应用。

图 8. Web 颜色的 Kohonen 映射

作者:MetaQuotes Software Corp.

 

完整,最重要的是漂亮。

我想问尤金一个问题--您是否将同一个类(稍作改动)复制到所有 SOM_exN 文件中?

第二个问题--我是否正确理解了您将地图显示和地图计算功能放在一个类中?

 
sergeev:

我想问 Eugene 这样一个问题--您是否在所有 SOM_exN 文件中都复制了同一个类(稍作改动)?

第二个问题 - 我的理解是否正确,您在一个类中包含了地图显示和地图计算功能?

是的,您说得没错,类是一样的。小的改动是由解决任务的特殊性(数据维度和 RGB、CMYK 显示方法)引起的。地图显示功能和计算合并为一个类。

总体结构如下

//--- 将训练集载入数组 m_training_sets_array[]
 KohonenMap.LoadData()
//--- 网络训练--修改节点权重 m_som_nodes[]
 KohonenMap.Train();
//--- forming a picture with a map - "projecting" the state of nodes into an instance of the cIntBMP class
 KohonenMap.Render();
//--- 在地图上显示训练集中每个元素的标题
//即在图中添加训练集每个元素的标识符
 KohonenMap.ShowTrainPatterns();
//--- 在图表上显示图片
 KohonenMap.ShowBMP();

计算在 Train 方法中完成(在某些情况下,在该方法中调用 Render 和 ShowBMP 来显示训练过程),然后将结果 "传输 "到 bmp 图片中,并在 ShowBMP 方法中显示。

cIntBMP 类用于渲染和显示。

 
Quantum:

是的,你说得对,类是一样的。由于要解决的任务的特殊性(数据维度和 RGB、CMYK显示方法),稍有改动。地图显示功能和计算合并为一个类。

我相信这样会减少代码量,也更容易上手。

尤其是在所有文件中的函数都相同的情况下。

 
sergeev:

也许为了方便使用类,我们应该把它改成层次结构? 我相信这样会减少代码量,也更容易上手。

尤其是在所有文件中的函数都相同的情况下。

我们的想法是展示使用 Kohonen 网络的实用性。

从方法论上讲,将所有任务分开考虑更为方便。有一个小的层次结构:CSOM->CSomWeb、CSOM->CSomFood(所有这些都是三维的,就像第一个例子一样)。在费舍尔 虹膜的四维案例中,除了 CSOM,还必须修改 CSomNode 以处理 4 个组件。然后出现了分量平面,m_bmp 变成了一个数组。

然后,在拒绝显示固定的特定三维(RGB)和四维(CMYK)数据后,我们得到了 SOM.mq5,它允许您处理任何维度的数据,之前示例的数据被转移到特定格式的文件中,并进一步用分量平面语言进行分析。

从本质上讲,我们需要 som.mq5 作为一种工具,而其他所有示例都是教程性质的,只是为了说明 Kohonen 网络的特点。

 

CSOM::ReadCSVData 函数中的

字符串不正确

// 网络初始化,10000 次迭代,CellsX*CellsY 节点网格,图像 ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

CSOM::ReadCSVData 函数中的

字符串是错误的

如果您指的是字符串:

int dimension=ArraySize(stringsarr)-1;

它是输入数据文件格式的具体内容 - 假设维度等于列数-1。

最后一列是训练样本的字符串名称。例如,在products.csv 中

Protein;Carbohydrate;Fat;Title
0.4;11.8;0.1;Apples

第一行行头包含组件名称,它们将进入数组 m_som_titles[]。

然后是数据(放入 m_training_sets_array[])和标题(放入 m_train_titles[])。

 
不,我用红色标出了。
KohonenMap

您在类本身中拥有该类的一个对象。 这里。

-------------------------

在这方面,从进一步独立使用CSOM 类的角度来看,有必要这样做:

1. 包含CSOMNodeCSOM 类和使用它们的特定脚本的单独文件

2. CSOM 类的外部输入 参数移至特定脚本。

3. 在类中添加所有这些参数

public:
    ColorSchemes m_clrSchema; // 梯度方案
    int m_maxpict; // 一排图片的数量
    bool m_bHexCell; // 六角形细胞
    bool m_bShowBorder; // 显示边界
    bool m_bShowTitle; // 显示字幕

4.
为此,在CSOM::Init 函数中增加 5 个初始化参数(可以删除在ReadCSVData 中设置的m_dimension)。
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

这样,您就可以将CSOM 类从 Expert Advisor 文件中取出,并将其作为必要项目包含项 使用

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // 数据文件名
input int CellsX=30; // X 的节点数
input int CellsY=30; // Y 中的节点数
input int ImageW=250; // 图片宽度
input int ImageH=250; // 图片高度
input int MaxPictures=4; // 每行最多可显示图片
input bool HexagonalCell=true; // 六边形细胞
input bool ShowBorders=false; // 显示单元格边框
input bool ShowTitles=true; // 在坐标平面上显示名称
input ColorSchemes ColorScheme=Blue_Green_Red; // 渐变色

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // 从文件中加载训练集
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("加载训练数据出错"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // 网络初始化
  KohonenMap.Train(); // 网络培训
  KohonenMap.Render(); // 生成地图图像
  KohonenMap.ShowTrainPatterns(); // 在地图上显示训练集中每个元素的标题
  KohonenMap.ShowBMP(); // 在图表上显示图片
}

还有一个修改--以防万一,将 ReadCSVData 函数也设为 bool。
,并检查标题尺寸与读取的下一行数据是否不匹配。

PS.

我已经对该类做了所有这些处理,可以说是对一些小问题做了最后修改。
但您的 CSOM 类仍然非常棒谢谢。
 
sergeev:

还有一个修改--以防万一--将 ReadCSVData 函数也设为 bool。
,并检查标头尺寸与读取的下一行数据是否不匹配。

PS.

我已经对该类进行了所有这些处理,可以说是最终完成了这些小事情。

非常感谢您的关注和有用建议。

我理解 KohonenMap.InitParameters 的意思,这显然是个错误。

当然,最终的类应该按照您的建议进行修改,这样会更美观。

请附上您得到的结果,我们将在文章中予以替换。

 

关于 MQL5 的最佳文章之一。特别是在实用方面。

谢谢!

 
Quantum:

请附上您的内容,我们将在文章中进行替换。

所附更改列表:

1. 在函数 cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, boolaFromImages=true)

中的小改动 2. 添加到了主脚本中

#import "shell32.dll"
   int ShellExecuteW(int hwnd, string oper, string prog, string param, string dir, int show);
#import

input bool OpenAfterAnaliz=true; // 完成后打开地图文件夹

CSOM 类中的更改

1.已添加CSOM::HideChart 函数--该函数可在背景色下将图表、网格等调暗
2.添加了参数m_chart、m_wnd、m_x0、m_y0- 指示在哪个图表和窗口上显示地图。
+对象名称 的前缀m_sID文件名 会自动使用该前缀,否则会指定为 "SOM"
3. 地图会被写入名为m_sID 的文件夹
4.

4. 更改了CSOM::ShowBMP 功能 - 地图不会复制到 Images文件夹 ,而是保留在 Files 文件夹(否则会非常耗时)
5.取代CSOM::NetDeinit 函数 - 现在有了CSOM::HideBMP 函数
7.重新配置了CSOM::ReadCSVData 函数,读取文件时第一列 为名称列
6.为CSOM::Train 函数添加了显示中间地图的标志CSOM::Train( boolbShowProgress)
8.在CSOM::Train 函数中,每 2 秒显示一次中间数据,而不是迭代,
,进度通知也从日志移到了注释
9.缩短了一些变量名,并对函数进行了分类。

Bmp 渲染会大大降低进程速度。因此最好不要不必要地使用它。

在示例中,地图基于 Expert Advisor 优化数据。
附加的文件: