"MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma" makalesi için tartışma

 

Yeni makale MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma yayınlandı:

Kendi Kendini Düzenleyen Özellik Haritalarının (Kohonen haritaları) en ilginç yönlerinden biri, verileri denetim olmadan sınıflandırmayı öğrenmeleridir. Temel biçiminde, girdi verilerinin (kümeleme) bir benzerlik haritası üretir. SOM haritaları, yüksek boyutlu verilerin sınıflandırılması ve görselleştirilmesi için kullanılabilir. Bu yazıda Kohonen haritalarının birkaç basit uygulamasını ele alacağız.

Ayrıca bu gerçeği Ticaret bileşen düzleminde de görebiliriz (20'nin altında sayılara sahip yeşil bölgeler).

Şekil 27. Bileşen düzlemleri Trades-MovingShift


Yazar: MetaQuotes

 

Eksiksiz ve en önemlisi güzel.

Eugene'e böyle bir soru - aynı sınıfı (küçük değişikliklerle) tüm SOM_exN dosyalarına kopyaladınız mı?

ve ikinci soru - harita görüntüleme ve harita hesaplama fonksiyonlarını tek bir sınıfta topladığınızı doğru anladım mı?

 
sergeev:

Eugene'e böyle bir soru - aynı sınıfı (küçük değişikliklerle) tüm SOM_exN dosyalarına kopyaladınız mı?

ve ikinci soru - harita görüntüleme ve harita hesaplama fonksiyonlarını tek bir sınıfta topladığınızı doğru mu anladım?

Evet, haklısınız, sınıf aynı. Küçük değişiklikler çözülen görevlerin özelliklerinden kaynaklanır (veri boyutluluğu ve RGB, CMYK görüntüleme yöntemleri). Harita görüntüleme fonksiyonları ve hesaplamalar tek bir sınıfta birleştirilmiştir.

Genel yapı aşağıdaki gibidir:

//--- eğitim setini m_training_sets_array[] dizisine yükleyin
 KohonenMap.LoadData()
//--- ağ eğitimi - düğüm ağırlıklarının değiştirilmesi m_som_nodes[]
 KohonenMap.Train();
//--- harita ile bir resim oluşturmak - düğümlerin durumunu cIntBMP sınıfının bir örneğine "yansıtmak"
 KohonenMap.Render();
//--- eğitim kümesinin her bir öğesi için harita üzerinde başlıkları gösterin 
//yani, eğitim setinin her bir elemanının tanımlayıcılarını şekle ekleyin
 KohonenMap.ShowTrainPatterns();
//--- resmi grafik üzerinde göster
 KohonenMap.ShowBMP();

Hesaplama Train metodunda yapılır (bazı durumlarda Render ve ShowBMP eğitim sürecini göstermek için bu metodun içinde çağrılır), ardından sonuçlar ShowBMP metodunda görüntülenen bir bmp resmine "aktarılır".

Oluşturma ve görüntüleme için cIntBMP sınıfı kullanılmıştır.

 
Quantum:

Evet, haklısınız, sınıf aynı. Küçük değişiklikler, çözülmesi gereken görevlerin özelliklerinden kaynaklanmaktadır (veri boyutluluğu ve RGB, CMYK görüntüleme yöntemleri ). Harita görüntüleme fonksiyonları ve hesaplamalar tek bir sınıfta birleştirilmiştir.

Belki de sınıflarla çalışmayı kolaylaştırmak için bunu bir hiyerarşiye dönüştürmeliyiz? Eminim kodu azaltacak ve onunla tanışmayı kolaylaştıracaktır.

Özellikle de tüm dosyalarda aynı işlevler söz konusu olduğunda.

 
sergeev:

Belki de sınıflarla çalışmayı kolaylaştırmak için bunu bir hiyerarşiye dönüştürmeliyiz? Eminim kodu azaltacak ve onunla tanışmayı kolaylaştıracaktır.

Özellikle de aynı fonksiyonların tüm dosyalarda aynı olması söz konusu olduğunda.

Amaç Kohonen ağlarını kullanmanın pratik yönlerini göstermekti.

Metodolojik olarak tüm görevleri ayrı ayrı ele almanın daha uygun olduğu ortaya çıktı. küçük bir hiyerarşi var, CSOM->CSomWeb, CSOM->CSomFood (hepsi üç boyutlu, ilk örnek gibi). Fisher 'in süsenlerinin 4 boyutlu durumunda, CSOM ile birlikte CSomNode'un da 4 bileşeni işlemek için değiştirilmesi gerekiyordu. Daha sonra bileşen düzlemleri ortaya çıktı ve m_bmp bir dizi haline geldi.

Daha sonra, sabit belirli 3 boyutlu (RGB) ve 4 boyutlu (CMYK) verileri görüntülemeyi reddettikten sonra, herhangi bir boyuttaki verilerle çalışmanıza izin veren SOM.mq5'i aldık, önceki örneklerin verileri belirli bir formattaki dosyalara aktarıldı ve analizleri ayrıca bileşen düzlemlerinin dilinde gerçekleştirildi.

Özünde, bir araç olarak som.mq5'e ihtiyacımız var ve diğer tüm örnekler öğretici niteliktedir ve sadece Kohonen ağlarının özelliklerinin örnekleridir.

 

CSOM::ReadCSVData işlevinde

dize yanlış

// ağ başlatma, 10000 yineleme, CellsX*CellsY düğümlerinden oluşan ızgara, ImageXSize x ImageYSize görüntüsü
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

CSOM::ReadCSVData işlevinde

dize yanlış

Eğer dizgiyi kastediyorsanız:

int dimension=ArraySize(stringsarr)-1;

giriş veri dosyası formatının özellikleridir - boyutun sütun sayısına eşit olduğu varsayılır-1.

Son sütun, eğitim örneğinin dize adıdır. Örneğin, products.csv dosyasında

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

bileşenlerin adlarını içeren ilk satır başlığı, m_som_titles[] dizisine gidecektir.

ardından veriler (m_training_sets_array[] içinde) ve başlıklar (m_train_titles[] içinde) gelir.

 
Hayır, kırmızıyla vurguladım.
KohonenMap

sınıfın içinde bu sınıfa ait bir nesne var. İşte.

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

Bu bağlamda, CSOM sınıfının bağımsız olarak daha fazla kullanılması açısından gereklidir:

1. CSOMNode, CSOM sınıfları ve bunların kullanımına ilişkin özel komut dosyaları içeren ayrı dosyalar

2. CSOM sınıfından belirli bir komut dosyasına harici giriş parametrelerini kaldırın.

3. Tüm bu parametreleri sınıfın kendisine ekleyin

public:
    ColorSchemes m_clrSchema; // gradyan şeması
    int m_maxpict; // satırdaki resim sayısı
    bool m_bHexCell; // altıgen hücreler
    bool m_bShowBorder; // sınırları göster
    bool m_bShowTitle; // altyazıları göster

4.
Bu bağlamda, CSOM::Init işlevini başlatma için 5 parametre ile genişletin ( ReadCSVData'da ayarlanan m_dimension'ı kaldırabilirsiniz)
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

Bu, CSOM sınıfını Expert Advisor dosyasından çıkarmanıza ve sadece gerekli projelere dahil olarak kullanmanıza izin verecektir

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // Veri dosyası adı
input int CellsX=30; // X'e göre düğüm sayısı
input int CellsY=30; // Y'deki düğüm sayısı
input int ImageW=250; // Resim genişliği
input int ImageH=250; // Resim yüksekliği
input int MaxPictures=4; // satır başına maks. resim
input bool HexagonalCell=true; // Altıgen hücreler
input bool ShowBorders=false; // hücre kenarlıklarını göster
input bool ShowTitles=true; // koordinat düzlemlerinde adları görüntüleme
input ColorSchemes ColorScheme=Blue_Green_Red; // Degrade renkler

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // eğitim setini dosyadan yükleyin
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("Eğitim için veri yüklenirken hata oluştu"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // ağ başlatma
  KohonenMap.Train(); // ağ eğitimi
  KohonenMap.Render(); // harita görüntüsü oluşturma
  KohonenMap.ShowTrainPatterns(); // eğitim kümesinin her bir öğesi için harita üzerinde başlıkları göster
  KohonenMap.ShowBMP(); // resmi grafik üzerinde göster
}

ve bir değişiklik daha - her ihtimale karşı ReadCSVData işlevini de bir bool yapın.
ve başlık boyutları ile sonraki veri okuma satırı arasındaki uyumsuzluğu kontrol edin

NOT.

Tüm bu manipülasyonları sınıfla zaten yaptım, tabiri caizse küçük şeyleri tamamladım.
Ama yine de CSOM sınıfınız harika. Teşekkürler.
 
sergeev:

ve bir değişiklik daha - her ihtimale karşı - ReadCSVData işlevini de bool yapın.
ve başlık boyutları ile okunan bir sonraki veri satırı arasında uyumsuzluk olup olmadığını kontrol edin

NOT.

Tüm bu manipülasyonları zaten sınıfla birlikte yaptım, tabiri caizse küçük şeyleri tamamladım.

İlginiz ve faydalı önerileriniz için çok teşekkür ederim.

KohonenMap.InitParameters konusunu anlıyorum, belli ki bir hata olmuş.

Tabi final sınıfı da önerdiğiniz gibi düzeltilmeli, çok daha güzel olacaktır.

Lütfen elinizdekileri ekleyin, makalede değiştireceğiz.

 

MQL5 ile ilgili en iyi makalelerden biri. Ve özellikle pratik anlamda.

Teşekkür ederim!

 
Quantum:

Lütfen elinizdekileri ekleyin, makalede değiştireceğiz.

ekte. değişikliklerin listesi:

1. cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)

işlevinde küçük bir değişiklik 2. Ana betiğe eklendi

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

input bool OpenAfterAnaliz=true; // tamamlandıktan sonra harita klasörünün açılması

CSOM sınıfındaki değişiklikler

1. CSOM::HideChart işlevi eklendi - grafiği, ızgarayı vb. arka plan renginin altında karartır
2. Eklenen parametreler m_chart, m_wnd, m_x0, m_y0 - haritaların hangi grafikte ve hangi pencerede görüntüleneceğini gösterir.
+ Nesne adlarının ön eki m_sID. Ön ek dosya adı tarafından otomatik olarak alınır, aksi takdirde "SOM" atanır
3. Haritalar m_sID adlı klasöre yazılır
4. Bmp dosyalarının adları
Bmp dosyalarının adları eğitim kalıbı sütununun adıyla verilir.
4. CSOM::ShowBMP işlevi değiştirildi - haritalar Görüntüler klasörüne kopyalanmaz, Dosyalar'da kalır (aksi takdirde çok zaman alır)
5. CSOM::ShowBMP işlevi değiştirildi. CSOM::NetDeinit fonksiyonu yerine - artık CSOM::HideBMP fonksiyonu var
7. CSOM::ReadCSVData fonksiyonu, dosyayı ilk sütun isimler sütunu olacak şekilde okuyacak şekilde yeniden yapılandırıldı
6. Ara haritaları göstermek için CSOM::Train fonksiyonuna bayrak eklendi CSOM::Train( bool bShowProgress)
8. CSOM::Train fonksiyonunda, ara veriler iterasyonlar yerine her 2 saniyede bir gösterilir,
ve ayrıca ilerleme bildirimi günlükten Yorum'a taşınır
9. Bazı değişken isimleri kısaltılmış ve fonksiyonlar kategorize edilmiştir.

Bmp render işlemi süreci çok yavaşlatır. Bu yüzden gereksiz yere kullanmamak daha iyidir.

Örnekte, haritalar Uzman Danışman optimizasyon verilerine dayanmaktadır.
Dosyalar: