完整,最重要的是漂亮。
我想问尤金一个问题--您是否将同一个类(稍作改动)复制到所有 SOM_exN 文件中?
第二个问题--我是否正确理解了您将地图显示和地图计算功能放在一个类中?
我想问 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 类用于渲染和显示。
也许为了方便使用类,我们应该把它改成层次结构? 我相信这样会减少代码量,也更容易上手。
尤其是在所有文件中的函数都相同的情况下。
我们的想法是展示使用 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);
KohonenMap
您在类本身中拥有该类的一个对象。 这里。
-------------------------
在这方面,从进一步独立使用CSOM 类的角度来看,有必要这样做:
1. 包含CSOMNode、CSOM 类和使用它们的特定脚本的单独文件
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 类仍然非常棒。谢谢。
还有一个修改--以防万一--将 ReadCSVData 函数也设为 bool。
,并检查标头尺寸与读取的下一行数据是否不匹配。
PS.
我已经对该类进行了所有这些处理,可以说是最终完成了这些小事情。
非常感谢您的关注和有用建议。
我理解 KohonenMap.InitParameters 的意思,这显然是个错误。
当然,最终的类应该按照您的建议进行修改,这样会更美观。
请附上您得到的结果,我们将在文章中予以替换。
关于 MQL5 的最佳文章之一。特别是在实用方面。
谢谢!
请附上您的内容,我们将在文章中进行替换。
所附更改列表:
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 渲染会大大降低进程速度。因此最好不要不必要地使用它。
新文章 在 MetaTrader 5 中使用自组织特征映射(Kohonen 映射)已发布:
自组织特征映射(Kohonen 映射)最有趣的方面是,其在不受监督的情况下就可学会对数据进行分类。就其基本形式而言,该映射能够生成输入数据的一个类似映射(聚类)。可使用 SOM 映射实现高维数据的分类和可视化。在本文中,我们将讨论 Kohonen 映射的几个简单应用。
作者:MetaQuotes Software Corp.