기고글 토론 "MetaTrader 5에서 자동 정리 기능 맵 (코호넨 맵) 이용하기"

 

새로운 기고글 MetaTrader 5에서 자동 정리 기능 맵 (코호넨 맵) 이용하기 가 게재되었습니다:

자체 구성 기능 맵(코호넨 맵)의 가장 흥미로운 측면 중 하나는 사람이 관리하지 않아도 스스로 데이터를 분류하는 법을 배운다는 것입니다. 기본적인 형태로 입력 데이터의 유사성 맵(클러스터링)을 생성합니다. SOM 맵은 고차원 데이터의 분류 및 시각화에 사용할 수 있습니다. In this article we will consider several simple applications of Kohonen maps.

16개 노드의 그리드로 된 간단한 코호넨 맵(각 노드 4x4는 3차원 입력 벡터로 연결됨)이 1번 그림에 나타나있습니다.

1번 그림. 간단 코호넨 맵 (16 노드)


작성자: MetaQuotes

 

완벽하고 가장 중요한 것은 아름답습니다.

유진에 대한 질문 - 동일한 클래스(약간의 변경 사항 포함)를 모든 SOM_exN 파일에 복사했나요?

그리고 두 번째 질문 - 지도 표시와 지도 계산 기능이 하나의 클래스에 있다는 것을 올바르게 이해했나요?

 
sergeev:

유진에게 이러한 질문 - 동일한 클래스(약간의 변경 사항 포함)를 모든 SOM_exN 파일에 복사했습니까?

그리고 두 번째 질문 - 지도 표시와 지도 계산 기능이 하나의 클래스에 있다는 것을 올바르게 이해했습니까?

예, 맞습니다. 클래스는 동일합니다. 사소한 변경 사항은 해결 된 작업의 세부 사항 (데이터 차원 및 RGB, CMYK 표시 방법)으로 인해 발생합니다. 지도 표시 기능과 계산은 하나의 클래스로 결합됩니다.

일반적인 구조는 다음과 같습니다:

//--- 트레이닝 집합을 배열에 로드 m_training_sets_array[]
 KohonenMap.LoadData()
//--- 네트워크 트레이닝 - 노드 가중치 수정 m_som_nodes[]
 KohonenMap.Train();
//--- 맵으로 그림 형성 - 노드의 상태를 cIntBMP 클래스의 인스턴스에 "투영"합니다.
 KohonenMap.Render();
//--- 지도 위에 학습 집합의 각 요소에 대한 캡션을 표시합니다. 
//즉, 학습 세트의 각 요소의 식별자를 그림에 추가합니다.
 KohonenMap.ShowTrainPatterns();
//--- 그래프에 그림 표시
 KohonenMap.ShowBMP();

계산은 Train 메서드에서 수행되고(경우에 따라 훈련 과정을 보여주기 위해 내부에서 Render 및 ShowBMP가 호출됨), 그 결과는 ShowBMP 메서드에 표시되는 bmp 그림으로 "전송"됩니다.

렌더링 및 표시에는 cIntBMP 클래스가 사용되었습니다.

 
Quantum:

예, 맞습니다. 수업은 동일합니다. 사소한 변경 사항은 해결해야 할 작업의 세부 사항(데이터 차원 및 RGB, CMYK 표시 방법 )으로 인한 것입니다. 지도 표시 기능과 계산이 하나의 클래스로 결합되었습니다.

그렇다면 클래스 작업의 편의를 위해 계층 구조로 변경해야 할까요? 그러면 코드가 줄어들고 익숙해지기 쉬워질 것이라고 확신합니다.

특히 모든 파일에서 동일한 함수가 동일할 때 더욱 그렇습니다.

 
sergeev:

클래스 작업의 편의를 위해 계층 구조로 변경하면 어떨까요? 그렇게 하면 코드가 줄어들고 익숙해지기 쉬워질 것이라고 확신합니다.

특히 모든 파일에서 동일한 함수가 동일할 때 더욱 그렇습니다.

이 아이디어는 코호넨 네트워크 사용의 실용적인 측면을 보여주기 위한 것이었습니다.

방법론적으로는 모든 작업을 개별적으로 고려하는 것이 더 편리하다는 것이 밝혀졌습니다. 작은 계층 구조인 CSOM-> CSomWeb, CSOM-> CSomFood(모두 첫 번째 예제와 같이 3차원)가 있습니다. 피셔의 홍채의 4차원 사례에서는 CSOM과 함께 4개의 컴포넌트를 처리하기 위해 CSomNode도 변경해야 했습니다. 그런 다음 컴포넌트 평면이 나타나고 m_bmp가 배열이 되었습니다.

그런 다음 고정 된 특정 3 차원 (RGB) 및 4 차원 (CMYK) 데이터를 표시하지 않은 후 모든 차원의 데이터로 작업 할 수있는 SOM.mq5를 얻었으며 이전 예제의 데이터는 특정 형식의 파일로 전송되었으며 분석은 구성 요소 평면의 언어로 추가로 수행됩니다.

본질적으로 우리는 도구로서 som.mq5가 필요하며, 다른 모든 예제는 튜토리얼 성격의 것으로 코호넨 네트워크의 기능에 대한 예시일 뿐입니다.

 

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. 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)

이렇게하면 Expert Advisor 파일에서 CSOM 클래스를 가져 와서 필요한 프로젝트에 간단히 포함 할 수 있습니다.

#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 함수도 부울로 만듭니다.
헤더 차원과 다음 데이터 행 읽기 사이의 불일치 여부를 확인합니다.

PS.

이미 클래스로 이 모든 조작을 했으므로 말하자면 작은 것들을 마무리했습니다.
하지만 여전히 CSOM 클래스는 훌륭합니다. 고마워요.
 
sergeev:

그리고 한 가지 더 수정할 것은 만일을 대비하여 ReadCSVData 함수도 부울로 만듭니다.
그리고 헤더 치수와 읽은 다음 데이터 줄의 불일치 여부를 확인합니다.

추신.

저는 이미 이 클래스를 통해 이 모든 조작을 했으므로 말하자면 사소한 것들을 마무리했습니다.

관심과 유용한 제안에 감사드립니다.

코호넨맵.초기화 매개변수는 분명히 실수라는 것을 이해합니다.

물론 최종 클래스는 제안하신대로 수정해야하며 훨씬 더 아름답습니다.

가지고 계신 것을 첨부해 주시면 기사에서 교체하겠습니다.

 

MQL5에 관한 최고의 기사 중 하나입니다. 특히 실용적인 측면에서요.

감사합니다!

 
Quantum:

받은 내용을 첨부해 주시면 기사에서 교체해 드리겠습니다.

첨부. 변경 목록:

1. cIntBMP::Show(int aX, int aY, 문자열 aBMPFileName, 문자열 aObjectName, bool aFromImages=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.
bmp 파일의 이름은 훈련 패턴 열의 이름으로 지정됩니다.
4. 변경된 CSOM::ShowBMP 기능 - 맵이 이미지 폴더에 복사되지 않고 파일에 남아 있습니다(그렇지 않으면 시간이 매우 많이 소요됨)
5. CSOM::NetDeinit 함수 대신 이제 CSOM::HideBMP 함수가 있습니다
7. 첫 번째 열이 이름 열이되도록 파일을 읽도록 CSOM::ReadCSVData 함수가 재구성되었습니다
6. CSOM::Train 함수에 중간 지도를 표시하는 플래그 추가 CSOM::Train( bool bShowProgress)
8. CSOM::Train 함수에서 반복 대신 2초마다 중간 데이터를 표시하고,
진행률 알림을 로그에서 Comment로 이동
9. 일부 변수 이름이 단축되고 함수가 분류됩니다.

Bmp 렌더링은 프로세스 속도를 매우 느리게 합니다. 따라서 불필요하게 사용하지 않는 것이 좋습니다.

이 예제에서 지도는 Expert Advisor 최적화 데이터를 기반으로 합니다.
파일: