自组织特征映射 (Kohonen 映射) - 再访主题·综合运用
🧠

自组织特征映射 (Kohonen 映射) - 再访主题·综合运用

(3/3)·从图形外壳到扩展功能,拆解一段范形样本如何跑通自组织特征映射全流程

案例拆解 第 3/3 篇
很多交易者把 Kohonen 映射直接套进 EA,却忽略死神经元会让整张网失效。用 rand() 选范形看似随机,实际分布不均,训练到后期一半神经元从没赢过竞争。本文收尾篇给出两套修正思路,别等回测漂亮实盘哑火才回头查网络初始化。

「绕开 DLL 的图形外壳接法」

Sample4_SOM_Net_Img 这个例子展示了自组织映射网络怎么接图形外壳。原先得挂 Dmitry Fedoseev 写的 cintbmp.mqh 才能画图,但里面全是 WinAPI 的 DLL 调用,过不了市场审核。我把图形库改了一版,删掉所有 DLL 调用,存图逻辑只往 Image 目录写 bmp 文件,显示时立刻加载进资源,文件只负责存不负责画,这就避开了外部库依赖,改名 cintbmp2.mqh 后作者信息保留在原文件里。 参数传递走函数接口而不是在类里全局声明变量,否则连接多个项目时变量名撞车会让编译处理变复杂。InitParameters 就是为图形外壳新加的入口,把迭代次数、网格行列、bmp 尺寸、是否六边形、边框标题开关、配色方案和最大图片数一次性塞进去。 训练函数 Train() 体内嵌了 Render() 和 ShowBMP(bool back),每 100 次迭代刷一次训练进度图,退出后再调一次显示终态。你在 MT5 里跑这套,把下面接口抄过去,改 xcells/ycells 就能直接看不同网格密度的收敛过程。

MQL5 / C++
class="type">void  InitParameters(class="type">int iterations,class="type">int xcells,class="type">int ycells,
                      class="type">int bmpwidth,class="type">int bmpheight,
                      class="type">bool p_HexagonalCell,class="type">bool p_ShowBorders,class="type">bool p_ShowTitles,
                      class="type">int p_ColorScheme,class="type">int p_MaxPictures);

用子类给 Kohonen 网络套图形壳

Sample5_SOM_Net_Player 这个示例本身不是网络底层,而是展示怎么用扩展类把已有代码包一层壳来审查和控制。做法很直接:声明一个基本类的子类,就能通过 protected 和 public 拿到父类的函数与数据,程序按你的需要重组,不必动原类一根手指。 我写 CSOM_Net_Player 时接了 Dmitry Fedoseev 的 IncGUI_v3.mqh 图形库,只改了标签显示位置(挪到对象顶部)和标签颜色,原文件一行没动,靠继承库类就完成了定制。图形面板占了大部分代码,但属于常规活,难点在面板和神经网络外壳的协调。 启动网络分两段:先训练并把网络存成二进制文件 somnet,再从文件加载并在范形基础上搜匹配节点。两段共用显示字段,但模式真独立——训练范形不必和识别范形同文件,网络也能换文件加载。切模式会把状态重置为零,这点要记牢。 程序不用循环跑训练或搜索,全靠事件分配。进训练模式后做初始化、载参、备内存、跑首次迭代,然后给自己发一个低于 333 的用户事件;事件处理过滤鼠标点击、编辑结束和 333 事件,若按钮状态没变就继续迭代并再发 333,直到训完或手动停。搜索模式同理中断。 部署路径是硬数据点:范形放 MQL5\Files\SOM\,按钮 bmp 放 MQL5\Images\SOM\,程序放 MQL5\Projects\SOM\,最后编译所有 mq5。外汇与贵金属行情高波动,这类自研面板仅作分析辅助,信号失效概率不低,实盘前务必在 MT5 策略测试器跑通。

◍ 别急着下结论

四十年前神经网络还是科学前沿的显学,二十年前懂点反向传播才敢称专家,如今 Kohonen 映射这类算法早已沉进 MT5 的底层逻辑里,不再唬人。本文给出的 project_som.zip 体量 267.78 KB,里面 CSOM_Net_Base 与 CSOM_Net_Train 两个模块就是自组织映射在 MQL5 里的直接落地,但评论区有人反映压缩包缺了 CSOM_Net_Base.mqh,说明跑通前先得补齐依赖。 外汇与贵金属行情受杠杆与流动性扰动,用 SOM 做特征聚类只代表历史样本的概率分布,不预示下一根 K 线方向,实盘前务必在策略测试器用 99% tick 数据回测。 打开 MT5 把那两个文件拖进 Include 目录,缺的 .mqh 从作者讨论帖补完,先让网络在 EURUSD 的 H1 上无监督训练一轮,比急着套用信号更靠谱。

MQL5 / C++
CSOM_Net_Base,
CSOM_Net_Train
把网络诊断交给小布
这些死神经元检测与权重初始化检查,小布盯盘的 AIGC 已内置,打开对应品种页即可看到训练分布是否健康,你专注调参和决策。

常见问题

它遍历所有神经元载体,计算输入范形与权重的欧氏距离,取差值最小的那个作为胜者,学习半径再围绕它展开。
概率上存在过拟合倾向,尤其范形样本单一时;通常靠初期大半径平均、末期小步长微调来平衡,外汇贵金属波动大更需警惕。
可以,把日志或权重快照贴进小布对应品种页,它能标出从未激活的死神经元并提示初始化区间是否合理。
rand()/N 不保证 N 次内全覆盖,C_PRNG_UD 让随机范形均匀分布,权重初始化也限制在范形可能范围,竞争更公平。