English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Italiano
MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma

MetaTrader 5'te Kendi Kendini Düzenleyen Özellik Haritalarını (Kohonen Haritaları) Kullanma

MetaTrader 5Uzman Danışmanlar | 16 Aralık 2021, 15:49
171 0
MetaQuotes
MetaQuotes

Tanıtım

BirSelf-Organizing Feature Map (SOM), harita adı verilen eğitim örneklerinin girdi alanının iki boyutlu ayrıklaştırılmış bir temsilini üretmek için denetimsiz öğrenme kullanılarak eğitilen bir yapay nöral ağ türüdür.

Bu haritalar, çok boyutlu ölçeklemeye benzer şekilde, yüksek boyutlu verilerin düşük boyutlu görünümlerini sınıflandırmak ve görselleştirmek için kullanışlıdır. Model ilk olarak Finli profesör Teuvo Kohonen tarafından yapay bir sinir ağı olarak tanımlandı ve bazen Kohonen Haritası olarak da adlandırılmaktadır.

Mevcut birçok algoritma vardır, http://www.ai-junkie.com adresinde sunulan kodu takip edeceğiz. Verileri MetaTrader 5 istemci terminalinde görselleştirmek için, BMP görüntülerinin oluşturulması için bir kitaplık olan cIntBMP'yi kullanacağız. Bu yazıda Kohonen Haritalarının birkaç basit uygulamasını ele alacağız.


1. Kendi Kendini Düzenleyen Özellik Haritaları

Kendi Kendini Düzenleyen Özellik Haritaları ilk olarak 1982 yılında Teuvo Kohonen tarafından tanımlanmıştır. Birçok nöral ağın aksine, giriş ve hedef çıkış verileri arasında bire bir yazışmaya ihtiyaç duymaz. Bu nöral ağ, denetimsiz öğrenme kullanılarak eğitilir.

SOM biçimsel olarak, yüksek boyutlu girdi verilerinin düzenli, düşük boyutlu bir dizinin öğeleri üzerine doğrusal olmayan, düzenli, düzgün bir eşlemesi olarak tanımlanabilir. Temel biçiminde, girdi verilerinin bir benzerlik grafiğini üretir.

SOM, yüksek boyutlu veriler arasındaki doğrusal olmayan istatistiksel ilişkileri, düzenli iki boyutlu düğüm ızgarası üzerindeki görüntü noktalarının basit geometrik ilişkisine dönüştürür. SOM haritaları, yüksek boyutlu verilerin sınıflandırılması ve görselleştirilmesi için kullanılabilir.


1.1. Ağ Mimarisi

16 düğümden oluşan basit Kohonen haritası (her biri 3 boyutlu girdi vektörü ile bağlantılı 4x4) Şekil 1'de sunulmuştur.

Şekil 1. Basit Kohonen haritası (16 düğüm)

Şekil 1. Basit Kohonen haritası (16 düğüm)

Her düğümün kafeste (x,y) koordinatları ve girdi vektörü temelinde tanımlanan bileşenlerle ağırlık vektörü vardır.


1.2. Algoritma Öğrenme

Diğer birçok sinir ağı türünden farklı olarak, SOM'nin belirtilmesi için bir hedef çıktıya ihtiyacı yoktur. Bunun yerine, düğüm ağırlıklarının giriş vektörüyle eşleştiği yerde, kafesin bu alanı, giriş vektörünün üyesi olduğu sınıf için verilere daha yakından benzemek için seçici olarak optimize edilir.

Rastgele ağırlıkların ilk dağılımından ve birçok yinelemeden sonra, SOM sonunda bir kararlı bölge haritasına yerleşir. Her bölge etkili bir şekilde bir özellik sınıflandırıcıdır, bu nedenle grafik çıktıyı, giriş alanının bir tür özellik haritası olarak düşünebilirsiniz.

Eğitim birkaç adımda ve birçok yinelemede gerçekleşir:

  1. Her düğümün ağırlıkları rastgele değerlerle başlatılır.
  2. Eğitim veri setinden rastgele bir vektör seçilir.
  3. Hangisinin ağırlıklarının girdi vektörüne en çok benzediğini hesaplamak için her düğüm incelenir. Kazanan düğüm, genellikle En İyi Eşleşen Birim (BMU) olarak bilinir.
  4. BMU'nun komşuluğunun yarıçapı hesaplanır. Başlangıçta, bu değer kafesin yarıçapına ayarlanır, fakat her adımda azalır.
  5. BMU'nun yarıçapı içinde bulunan herhangi bir düğüm için düğümün ağırlıkları, onları daha çok girdi vektörü gibi yapacak şekilde ayarlanır. Bir düğüm BMU'ya ne kadar yakınsa, ağırlıkları o kadar fazla uyarı alır.
  6. N yineleme için 2. adımı tekrarlayın.

Ayrıntılar http://www.ai-junkie.com adresinde bulunabilir.


2. Durum çalışmaları


2.1. Örnek 1. "Merhaba Dünya!" SOM'da

Kohonen haritasının klasik örneği bir renk kümeleme problemidir.

Diyelim ki 8 renkten oluşan bir setimiz var, her biri RGB renk modelinde üç boyutlu bir vektör olarak temsil ediliyor.

  1. clrRed Kırmızı: (255,0,0);
  2. clrGreen Yeşil: (0,128,0);
  3. clrBlue Mavi: (0,0,255);
  4. clrDarkGreen Koyu Yeşil: (0,100,0);
  5. clrDarkBlue Koyu Mavi: (0,0,139);
  6. clrYellow Sarı: (255,255,0);
  7. clrOrange Turuncu: (255,165,0);
  8. clrPurple Mor: (128,0,128).

MQL5 dilinde Kohonen haritaları ile çalışırken nesne yönelimli paradigmayı takip edeceğiz.

İki sınıfa ihtiyacımız var: Normal ızgaranın bir düğümü için CSOMNode sınıfı ve bir nöral ağ sınıfı olan CSOM.

//+------------------------------------------------------------------+
//| CSOMNode class                                                   |
//+------------------------------------------------------------------+
class CSOMNode
  {
protected:
   int               m_x1;
   int               m_y1;
   int               m_x2;
   int               m_y2;

   double            m_x;
   double            m_y;
   double            m_weights[];
public:
   //--- class constructor
                     CSOMNode();
   //--- class destructor
                    ~CSOMNode();
   //--- node initialization
   void              InitNode(int x1,int y1,int x2,int y2);
   //--- return coordinates of the node's center
   double            X()  const { return(m_x);}
   double            Y()  const { return(m_y);}
   //--- returns the node coordinates
   void              GetCoordinates(int &x1,int &y1,int &x2,int &y2);
   //--- returns the value of weight_index component of weight's vector
   double            GetWeight(int weight_index);
   //--- returns the squared distance between the node weights and specified vector
   double            CalculateDistance(double &vector[]);
   //--- adjust weights of the node
   void              AdjustWeights(double &vector[],double learning_rate,double influence);
  };

Sınıf yöntemlerinin uygulanması som_ex1.mq5 içinde bulunabilir. Kodda çok fazla yorum var, fikre odaklanacağız.

CSOM sınıfı açıklaması aşağıdaki gibi görünür:

//+------------------------------------------------------------------+
//| CSOM class                                                       |
//+------------------------------------------------------------------+
class CSOM
  {
protected:
   //--- class for using of bmp images
   cIntBMP           m_bmp;
   //--- grid mode
   int               m_gridmode;
   //--- bmp image size
   int               m_xsize;
   int               m_ysize;
   //--- number of nodes
   int               m_xcells;
   int               m_ycells;
   //--- array with nodes
   CSOMNode          m_som_nodes[];
   //--- total items in training set
   int               m_total_training_sets;
   //--- training set array
   double            m_training_sets_array[];
protected:
   //--- radius of the neighbourhood (used for training)
   double            m_map_radius;
   //--- time constant (used for training)
   double            m_time_constant;
   //--- initial learning rate (used for training)
   double            m_initial_learning_rate;
   //--- iterations (used for training)
   int               m_iterations;

public:
   //--- class constructor
                     CSOM();
   //--- class destructor
                    ~CSOM();
   //--- net initialization
   void              InitParameters(int iterations,int xcells,int ycells,int bmpwidth,int bmpheight);
   //--- finds the best matching node, closest to the specified vector
   int               BestMatchingNode(double &vector[]);
   //--- train method
   void              Train();
   //--- render method
   void              Render();
   //--- shows the bmp image on the chart
   void              ShowBMP(bool back);
   //--- adds a vector to training set
   void              AddVectorToTrainingSet(double &vector[]);
   //--- shows the pattern title
   void              ShowPattern(double c1,double c2,double c3,string name);
   //--- adds a pattern to training set
   void              AddTrainPattern(double c1,double c2,double c3);
   //--- returns the RGB components of the color
   void              ColToRGB(int col,int &r,int &g,int &b);
   //--- returns the color by RGB components
   int               RGB256(int r,int g,int b) const {return(r+256*g+65536*b);      }
   //--- deletes image from the chart
   void              NetDeinit();
  };

CSOM sınıfının kullanımı basittir:

CSOM KohonenMap;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
  MathSrand(200);
//--- initialize net, 10000 iterations will be used for training
//--- the net contains 15x20 nodes, bmp image size 400x400
   KohonenMap.InitParameters(10000,15,20,400,400);
//-- add RGB-components of each color from training set
   KohonenMap.AddTrainPattern(255,  0,  0);   // Red
   KohonenMap.AddTrainPattern(  0,128,  0);   // Green
   KohonenMap.AddTrainPattern(  0,  0,255);   // Blue
   KohonenMap.AddTrainPattern(  0,100,  0);   // Dark green
   KohonenMap.AddTrainPattern(  0,  0,139);   // Dark blue
   KohonenMap.AddTrainPattern(255,255,  0);   // Yellow
   KohonenMap.AddTrainPattern(255,165,  0);   // Orange
   KohonenMap.AddTrainPattern(128,  0,128);   // Purple
//--- train net
   KohonenMap.Train();
//--- render map to bmp
   KohonenMap.Render();
//--- show patterns and titles for each color
   KohonenMap.ShowPattern(255,  0,  0,"Red");
   KohonenMap.ShowPattern(  0,128,  0,"Green");
   KohonenMap.ShowPattern(  0,  0,255,"Blue");
   KohonenMap.ShowPattern(  0,100,  0,"Dark green");
   KohonenMap.ShowPattern(  0,  0,139,"Dark blue");
   KohonenMap.ShowPattern(255,255,  0,"Yellow");
   KohonenMap.ShowPattern(255,165,  0,"Orange");
   KohonenMap.ShowPattern(128,  0,128,"Purple");
//--- show bmp image on the chart
   KohonenMap.ShowBMP(false);
//---
  }

Sonuç, Şekil 2'de sunulmuştur.

Şekil 2. SOM_ex1.mq5 Uzman Danışman çıktısı

Şekil 2. SOM_ex1.mq5 Uzman Danışman çıktısı

Kohonen harita öğreniminin dinamikleri Şekil 3'te sunulmuştur (resmin altındaki adımlara bakın):

Şekil 3. Kohonen Haritası öğreniminin dinamikleri

Şekil 3. Kohonen Haritası öğreniminin dinamikleri

Şekil 3'ten görülebileceği gibi, Kohonen Haritası 2400 adımdan sonra oluşturulmuştur.

300 düğümlük bir kafes oluşturup görüntü boyutunu 400x400 olarak belirtirsek:

//--- lattice of 15x20 nodes, image size 400x400
   KohonenMap.InitParameters(10000,15,20,400,400);

Şekil 4'te sunulan görüntüyü alacağız:

Şekil 4. 300 düğümlü Kohonen Haritası, görüntü boyutu 400x400

Şekil 4. 300 düğümlü Kohonen Haritası, görüntü boyutu 400x400

Guido Deboeck ve Teuvo Kohonen tarafından yazılan Visual Explorations in Finance: with Self-Organizing Maps kitabını okursanız hatırlarsınız. bu kafes düğümleri de altıgen hücreler olarak temsil edilebilir. Uzman Danışman kodunu değiştirerek başka bir görselleştirme uygulayabiliriz.

SOM-ex1-hex.mq5'in sonucu Şekil 5'te sunulmuştur:

Şekil 5. 300 düğümlü Kohonen Haritası, görüntü boyutu 400x400, düğümler altıgen hücrelerde temsil ediliyor

Şekil 5. 300 düğümlü Kohonen Haritası, görüntü boyutu 400x400, düğümler altıgen hücrelerde temsil edilir

Bu versiyonda, giriş parametrelerini kullanarak hücre sınırlarının gösterilmesini tanımlayabiliriz:

// input parameter, used to show hexagonal cells
input bool HexagonalCell=true;
// input parameter, used to show borders
input bool ShowBorders=true;

Bazı durumlarda hücre kenarlıklarını göstermemize gerek yoktur, ShowBorders=false belirtirseniz aşağıdaki görüntüyü alırsınız (bkz. Şekil 6):

Şekil 6. 300 düğümlü Kohonen Haritası, görüntü 400x400, düğümler altıgen hücreler olarak çizilmiş, hücre sınırları devre dışı

Şekil 6. 300 düğümlü Kohonen Haritası, görüntü 400x400, altıgen hücreler olarak çizilen düğümler, hücre sınırları devre dışı

İlk örnekte renk bileşenleri belirtilen eğitim setinde 8 renk kullandık. CSOM sınıfına iki metot ekleyerek eğitim setini genişletebilir ve renk bileşenlerinin belirlenmesini basitleştirebiliriz.

Bu durumda Kohonen Haritalarının basit olduğunu unutmayın çünkü renk uzayında ayrılmış sadece birkaç renk vardır. Sonuç olarak, yerelleştirilmiş kümelere sahip olduk.

Daha yakın renk bileşenleriyle daha fazla renk düşünürsek sorun ortaya çıkar.


2.2. Örnek 2. Web renklerini eğitim örnekleri olarak kullanma

MQL5 Dilinde Web renkleri önceden tanımlanmış sabitlerdir.

Şekil 7. Web renkleri

Şekil 7. Web Renkleri

Benzer bileşenlere sahip bir dizi vektöre Kohonen algoritmasını uygularsak ne olur?

CSOM sınıfından türetilen bir CSOMWeb sınıfı oluşturabiliriz:

//+------------------------------------------------------------------+
//| CSOMWeb class                                                    |
//+------------------------------------------------------------------+
class CSOMWeb : public CSOM
  {
public:
//--- adds a color to training set (used for colors, instead of AddTrainPattern)
   void              AddTrainColor(int col);
//--- method of showing of title of the pattern (used for colors, instead of ShowPattern)
   void              ShowColor(int col,string name);
  };

Gördüğünüz gibi, renklerle çalışmayı basitleştirmek için iki yeni yöntem ekledik, artık renk bileşenlerinin açıkça belirtilmesine gerek yok.

Sınıf yöntemlerinin uygulanması aşağıdaki gibidir:

//+------------------------------------------------------------------+
//| Adds a color to training set                                     |
//| (used for colors, instead of AddTrainPattern)                    |
//+------------------------------------------------------------------+
void CSOMWeb::AddTrainColor(int col)
  {
   double vector[];
   ArrayResize(vector,3);
   int r=0;
   int g=0;
   int b=0;
   ColToRGB(col,r,g,b);
   vector[0]=r;
   vector[1]=g;
   vector[2]=b;
   AddVectorToTrainingSet(vector);
   ArrayResize(vector,0);
  }
//+------------------------------------------------------------------+
//| Method of showing of title of the pattern                        |
//| (used for colors, instead of ShowPattern)                        |
//+------------------------------------------------------------------+
void CSOMWeb::ShowColor(int col,string name)
  {
   int r=0;
   int g=0;
   int b=0;
   ColToRGB(col,r,g,b);
   ShowPattern(r,g,b,name);
  }

Tüm web renkleri web_colors[] dizisinde birleştirilebilir:

//--- web colors array
color web_colors[132]=
  {
   clrBlack, clrDarkGreen, clrDarkSlateGray, clrOlive, clrGreen, 
   clrTeal, clrNavy, clrPurple, clrMaroon, clrIndigo, clrMidnightBlue, 
   clrDarkBlue, clrDarkOliveGreen, clrSaddleBrown, clrForestGreen, clrOliveDrab, 
   clrSeaGreen, clrDarkGoldenrod, clrDarkSlateBlue, clrSienna, clrMediumBlue, 
   clrBrown, clrDarkTurquoise, clrDimGray, clrLightSeaGreen, clrDarkViolet, 
   clrFireBrick, clrMediumVioletRed, clrMediumSeaGreen, clrChocolate, clrCrimson, 
   clrSteelBlue, clrGoldenrod, clrMediumSpringGreen, clrLawnGreen, clrCadetBlue, 
   clrDarkOrchid, clrYellowGreen, clrLimeGreen, clrOrangeRed, clrDarkOrange, 
   clrOrange, clrGold, clrYellow, clrChartreuse, clrLime, clrSpringGreen, 
   clrAqua, clrDeepSkyBlue, clrBlue, clrMagenta, clrRed, clrGray, 
   clrSlateGray, clrPeru, clrBlueViolet, clrLightSlateGray, clrDeepPink, 
   clrMediumTurquoise, clrDodgerBlue, clrTurquoise, clrRoyalBlue, clrSlateBlue, 
   clrDarkKhaki, clrIndianRed, clrMediumOrchid, clrGreenYellow, clrMediumAquamarine, 
   clrDarkSeaGreen, clrTomato, clrRosyBrown, clrOrchid, clrMediumPurple, 
   clrPaleVioletRed, clrCoral, clrCornflowerBlue, clrDarkGray, clrSandyBrown, 
   clrMediumSlateBlue, clrTan, clrDarkSalmon, clrBurlyWood, clrHotPink, 
   clrSalmon, clrViolet, clrLightCoral, clrSkyBlue, clrLightSalmon, 
   clrPlum, clrKhaki, clrLightGreen, clrAquamarine, clrSilver, 
   clrLightSkyBlue, clrLightSteelBlue, clrLightBlue, clrPaleGreen, clrThistle, 
   clrPowderBlue, clrPaleGoldenrod, clrPaleTurquoise, clrLightGray, clrWheat, 
   clrNavajoWhite, clrMoccasin, clrLightPink, clrGainsboro, clrPeachPuff, 
   clrPink, clrBisque, clrLightGoldenrod, clrBlanchedAlmond, clrLemonChiffon, 
   clrBeige, clrAntiqueWhite, clrPapayaWhip, clrCornsilk, clrLightYellow, 
   clrLightCyan, clrLinen, clrLavender, clrMistyRose, clrOldLace, 
   clrWhiteSmoke, clrSeashell, clrIvory, clrHoneydew, clrAliceBlue, 
   clrLavenderBlush, clrMintCream, clrSnow, clrWhite
  };

OnInit() işlevi basit bir forma sahiptir:

CSOMWeb KohonenMap;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
  {
   MathSrand(200);
   int total_web_colors=ArraySize(web_colors);
//--- initialize net, 10000 iterations will be used for training
//--- the net contains 15x20 nodes, bmp image size 400x400
   KohonenMap.InitParameters(10000,50,50,500,500);
//-- add all web colors to training set
   for(int i=0; i<total_web_colors; i++)
     {
      KohonenMap.AddTrainColor(web_colors[i]);
     }
//--- train net
   KohonenMap.Train();
//--- render map to bmp
   KohonenMap.Render();
//--- show patterns and titles for each color
   for(int i=0; i<total_web_colors; i++)
     {
      KohonenMap.ShowColor(web_colors[i],ColorToString(web_colors[i],true));
     }
//--- show bmp image on the chart
   KohonenMap.ShowBMP(false);
  }

som-ex2-hex.mq5'i başlatırsak, Şekil 8'de gösterilen resmi elde ederiz.

Şekil 8. Web renkleri için Kohonen Haritası

Şekil 8. Web renkleri için Kohonen Haritası

Gördüğünüz gibi bazı kümeler var ama bazı renkler (xxxBlue gibi) farklı bölgelerde yer alıyor.

Bunun nedeni eğitim kümesinin yapısıdır, yakın bileşenlere sahip birçok vektör vardır.


2.3. Örnek 3. Ürün kümeleme

Daha sonra, protein, karbonhidrat ve yağ olmak üzere üç parametreye dayalı olarak yirmi beş gıdayı benzerlik bölgelerine göre gruplandırmaya çalışarak basit bir örneği ele alacağız.

 Gıda
Protein Karbonhidrat Yağ
  1 Elma
0,4
11,8
0,1
  2 Avokado
1,9
1,9
19,5
  3 Muz
1,2
23,2
0,3
  4 Sığır biftek
20,9
0
7,9
  5 Big Mac
13
19
11
  6 Brezilya fındığı
15,5
2,9
68,3
  7 Ekmek
10,5
37
3,2
  8 Tereyağı
1
0
81
  9 Peynir
25
0,1
34,4
 10 Cheesecake
6,4
28,2
22,7
 11 Kurabiye
5,7
58,7
29,3
 12 Mısır gevreği
7
84
0,9
 13 Yumurta
12,5
0
10,8
 14 Kızarmış Tavuk
17
7
20
 15 Kızartma
3
36
13
 16 Sıcak Çikolata
3,8
19,4
10,2
 17 Sucuk
20,9
5,1
38,3
 18 Pizza
12,5
30
11
 19 Domuzlu turta
10,1
27,3
24,2
 20 Patates
1,7
16,1
0,3
 21 Pirinç
6,9
74
2,8
 22 Fırında Tavuk
26,1
0,3
5,8
 23 Şeker
0
95,1
0
 24 Ton Balığı Bifteği
25,6
0
0,5
 25 Su
0
0
0

Tablo 1. 25 gıda için protein, karbonhidrat ve yağ.

Girdi vektörlerinin farklı değerleri olduğu için ve her bileşen kendi değer aralığına sahip olduğu için bu sorun ilgi çekicidir. Bu görselleştirme için önemlidir, çünkü bileşenleri 0 ile 255 arasında değişen RGB renk modelini kullanıyoruz.

Neyse ki, bu durumda girdi vektörleri de 3 boyutludur ve Kohonen harita görselleştirmesi için https://en.wikipedia.org/wiki/RGB_color_modeltitleRGB renk modelini kullanabiliriz.title

//+------------------------------------------------------------------+
//| CSOMFood class                                                   |
//+------------------------------------------------------------------+
class CSOMFood : public CSOM
  {
protected:
   double            m_max_values[];
   double            m_min_values[];
public:
   void              Train();
   void              Render();
   void              ShowPattern(double c1,double c2,double c3,string name);
  };

Gördüğünüz gibi, eğitim setinin maksimum ve minimum değerlerinin saklanması için m_max_values[] ve m_min_values[] dizilerini ekledik. RGB renk modelinde görselleştirme için "ölçeklendirme" gereklidir, bu nedenle Train(), Render() ve ShowPattern() yöntemlerini aşırı yükledik.

Maksimum ve minimum değerlerin aranması, Train() yönteminde uygulanır.

//--- find minimal and maximal values of the training set
   ArrayResize(m_max_values,3);
   ArrayResize(m_min_values,3);

   for(int j=0; j<3; j++)
     {
      double maxv=m_training_sets_array[3+j];
      double minv=m_training_sets_array[3+j];
      for(int i=1; i<m_total_training_sets; i++)
        {
         double v=m_training_sets_array[3*i+j];
         if(v>maxv) {maxv=v;}
         if(v<minv) {minv=v;}
        }
      m_max_values[j]=maxv;
      m_min_values[j]=minv;
      Print(j,"m_min_value=",m_min_values[j],"m_max_value=",m_max_values[j]);
     }

Bileşenleri RGB renk modelinde göstermek için Render() yöntemini değiştirmemiz gerekiyor:

// int r = int(m_som_nodes[ind].GetWeight(0));
// int g = int(m_som_nodes[ind].GetWeight(1));
// int b = int(m_som_nodes[ind].GetWeight(2));

int r=int ((255*(m_som_nodes[ind].GetWeight(0)-m_min_values[0])/(m_max_values[0]-m_min_values[0])));
int g=int ((255*(m_som_nodes[ind].GetWeight(1)-m_min_values[1])/(m_max_values[1]-m_min_values[1])));
int b=int ((255*(m_som_nodes[ind].GetWeight(2)-m_min_values[2])/(m_max_values[2]-m_min_values[2])));

som_ex3.mq5'in sonucu Şekil 9'da sunulmuştur.

Şekil 9. Protein, karbonhidrat ve yağa dayalı benzerlik bölgelerine göre gruplandırılmış gıda haritası

Şekil 9. Protein, karbonhidrat ve yağa dayalı benzerlik bölgelerine göre gruplandırılmış gıda haritası

Bileşen analizi. Haritadan Şeker, Pirinç ve Mısır gevreklerinin Karbonhidrat (2. bileşen) nedeniyle yeşil renkle işaretlendiği görülebilir. Tereyağı yeşil bölgededir, çok fazla Yağ içerir (3. bileşen). Sığır Biftek, Fırında Tavuk ve Ton Balığı Bifteğinde çok fazla Protein (1. bileşen, kırmızı) bulunur.

Yiyecek Kompozisyon Tablolarından (alternatif table) yeni yiyecekler ekleyerek eğitim setini genişletebilirsiniz.

Gördüğünüz gibi, problem "saf" R,G,B yönleri için çözüldü. Birkaç eşit (veya çoğunlukla eşit) bileşene sahip diğer gıdalar ne olacak? Daha sonra Bileşen Düzlemlerini ele alacağız, özellikle girdi vektörlerinin boyutunun 3'ten büyük olduğu durumlarda çok kullanışlıdır.


2.4. Örnek 4. 4 boyutlu durum. Fisher's Iris veri seti. CMYK

Üç boyutlu vektörler için görselleştirmede sorun yoktur. Renk bileşenlerini görselleştirmek için kullanılan RGB renk modeli nedeniyle sonuçlar açıktır.

Yüksek boyutlu verilerle çalışırken, onları görselleştirmenin yolunu bulmamız gerekiyor. Basit çözüm, vektör uzunluğuyla orantılı renklerle bir degrade haritası (örneğin, Siyah/Beyaz) çizmektir. Diğer yol ise başka bir renk boşlukları kullanmaktır. Bu örnekte, Fisher's Iris veri seti için hCMYK renk modelini ele alacağız. Daha iyi bir çözüm var, bunu daha sonra ele alacağız.

Iris çiçeği veri seti veya Fisher's Iris veri seti, diskriminant analizinin bir örneği olarak R. Fisher (1936) tarafından tanıtılan çok değişkenli bir veri setidir. Veri seti, üç İris çiçeği türünün (Iris setosa, Iris virginica ve Iris versicolor) her birinden 50 örnekten oluşur.

Her numuneden dört özellik ölçüldü, bunlar çanak yaprağın ve taç yaprağın santimetre cinsinden uzunluğu ve genişliğidir.

Şekil 10. İris çiçeği

Şekil 10. Iris çiçeği

Her numunenin 4 özelliği vardır:

  1. Çanak yaprak uzunluğu;
  2. Çanak yaprak genişliği;
  3. Taç yaprak uzunluğu;
  4. Taç yaprak genişliği.

https://en.wikipedia.org/wiki/Iris_flower_data_settitleIris çiçek veri seti titleSOM_ex4.mq5 içinde bulunabilir.

Bu örnekte, çizim için ara CMYK renk uzayını kullanacağız, yani düğümün ağırlıklarını CMYK uzayında bir vektör olarak ele alacağız. Sonuçları görselleştirmek için CMYK->RGB dönüşümü kullanılır. CSOM sınıfına yeni bir yöntem int CSOM::CMYK2Col(uchar c,uchar m,uchar y,uchar k) eklenir, CSOM::Render() yönteminde kullanılır. Ayrıca 4 boyutlu vektörleri desteklemek için sınıfları değiştirmeliyiz.

Sonuç, Şekil 11'de sunulmuştur.

Şekil 11. İris çiçeği veri seti için Kohonen Haritası, CMYK renk modelinde çizildi

Şekil 11. İris çiçeği veri seti için Kohonen Haritası, CMYK renk modelinde çizilmiş

Ne görüyoruz? Tam kümelemeye sahip değiliz (sorunun özellikleri nedeniyle), ancak iris setosa'nın doğrusal ayrımı görülebilir.

Setosa'nın bu lineer ayrılmasının nedeni, CMYK uzayındaki büyük bir "Macenta" bileşenidir (2.).


2.6. Bileşen Düzlem Analizi

Önceki örneklerden (gıda ve iris veri kümeleme) veri görselleştirme ile ilgili bir sorun olduğu görülebilir.

Örneğin, gıda sorunu için belirli renklere (kırmızı, yeşil, mavi) ilişkin bilgileri kullanarak Kohonen Haritasını analiz ettik. Temel kümelere ek olarak, birkaç bileşenli bazı yiyecekler vardı. Ayrıca, bileşenler çoğunlukla eşitse analiz zorlaşır.

Bileşen düzlemleri, her bir besinin göreli yoğunluğunu görme imkanı sağlar.

CIntBMP sınıfı örneklerini (m_bmp[] dizisi) CSOM sınıfına eklememiz ve karşılık gelen oluşturma yöntemlerini değiştirmemiz gerekiyor. Ayrıca her bir bileşenin yoğunluğunu görselleştirmek için bir gradyan haritasına ihtiyacımız var (düşük değerler mavi renkle, yüksek değerler kırmızı ile gösterilmiştir):

Şekil 12. Gradyan paleti

Şekil 12. Gradyan paleti

Palette[768] dizisini, GetPalColor() ve Blend() yöntemlerini ekledik. Bir düğümün çizimi RenderCell() yöntemine yerleştirilir.

İris Çiçeği Veri Seti

som-ex4-cpr.mq5'in sonuçları Şekil 13'te sunulmuştur.

altŞekil 13. İris çiçeği veri setinin bileşen düzlemleri gösterimialttitle Şekil 13. İris çiçeği veri setinin bileşen düzlemleri gösterimititle

Şekil 13. İris çiçeği veri setinin bileşen düzlemleri temsili

Bu durumda, 30x30 düğümlü, görüntü boyutu 300x300 olan ızgarayı kullanırız.

Bileşen düzlemleri, korelasyon tespitinde önemli bir rol oynar: Bu düzlemlerin karşılaştırılması, hatta kısmen bağıntılı değişkenler olabilir. görsel inceleme ile tespit edilir. Bileşen düzlemleri varsa bu daha kolaydır ilişkili olanlar birbirine yakın olacak şekilde yeniden düzenlenir. Bu şekilde, daha fazla bilgi için ilginç bileşen kombinasyonları seçmek kolay olur.

Bileşen düzlemlerini ele alalım (Şekil 14). 

Maksimum ve minimum bileşenlerin değerleri degrade tablosunda gösterilir.

Şekil 14. İris çiçeği veri seti. Bileşen düzlemleri

Şekil 14. İris çiçeği veri seti. Bileşen düzlemleri

CMYK renk modelinde temsil edilen tüm bu bileşen düzlemleri Şekil 15'te gösterilmektedir.

Şekil 15. İris çiçeği veri seti. CMYK renk modelinde Kohonen haritası

Şekil 15. İris çiçeği veri seti. CMYK renk modelinde Kohonen haritası

Setosa iris türünü hatırlatalım. Bileşen düzlem analizini kullanarak (Şekil 14) 1. (Çanak Yaprak Uzunluğu), 3. (Taç Yaprak Uzunluğu) ve 4. (Taç Yaprak Genişliği) bileşen düzlemlerinde minimum değerlere sahip olduğu görülebilir.

2. bileşen düzleminde (Çanak Yaprak Genişliği) maksimum değerlere sahip olması dikkat çekicidir, CMYK-renk modelinde elde ettiğimiz sonucun aynısıdır (Macenta bileşen, Şekil 15).

Gıda Kümeleme

Şimdi bileşen düzlemi analizini (som-ex3-cpr.mq5) kullanarak gıda kümeleme problemini ele alalım.

Sonuç, Şekil 16'da sunulmuştur (30x30 düğüm, görüntü boyutu 300x300, kenarlıksız altıgen hücreler).

Şekil 16. Gıda için Kohonen haritası, bileşen düzlem gösterimi

Şekil 16. Gıda için Kohonen haritası, bileşen düzlemi gösterimi

CSOM sınıfının ShowPattern() yöntemine başlıkları gösterme seçeneğini ekledik (giriş parametresi ShowTitles=true).

Bileşen düzlemleri (protein, karbonhidrat, yağ) aşağıdaki gibi görünür:

Şekil 17. Gıdalar için Kohonen haritası. Bileşen düzlemleri ve RGB renk modeli

Şekil 17. Gıdalar için Kohonen haritası. Bileşen düzlemleri ve RGB renk modeli

Şekil 17'de gösterilen bileşen düzlemi gösterimi, gıda bileşenlerinin yapısı hakkında yeni bir görünüm açar. Ayrıca, Şekil 9'da sunulan RGB renk modelinde görülemeyen ek bilgiler sağlar.

Örneğin, şimdi 1. bileşen düzleminde (protein) Peyniri görüyoruz. RGB renk modelinde, yağdan dolayı (2. bileşen) macentaya yakın renkli olarak gösterilmiştir.


2.5. İsteğe Bağlı Boyut Durumunda Bileşen Düzlemlerinin Uygulanması

İncelediğimiz örneklerin bazı belirli özellikleri var, boyut sabitlendi ve görselleştirme algoritması farklı temsiller için farklıydı (RGB ve CMYK renk modelleri).

Şimdi algoritmayı rastgele boyutlar için genelleştirebiliriz, ancak bu durumda sadece bileşen düzlemlerini görselleştireceğiz. Program, isteğe bağlı verileri CSV dosyasından yükleyebilmelidir.

Örneğin, food.csv aşağıdaki gibi görünür:

Protein;Carbohydrate;Fat;Title
0.4;11.8;0.1;Apples
1.9;1.9;19.5;Avocado
1.2;23.2;0.3;Bananas
20.9;0.0;7.9;Beef Steak
13.0;19.0;11.0;Big Mac
15.5;2.9;68.3;Brazil Nuts
10.5;37.0;3.2;Bread
1.0;0.0;81.0;Butter
25.0;0.1;34.4;Cheese
6.4;28.2;22.7;Cheesecake
5.7;58.7;29.3;Cookies
7.0;84.0;0.9;Cornflakes
12.5;0.0;10.8;Eggs
17.0;7.0;20.0;Fried Chicken
3.0;36.0;13.0;Fries
3.8;19.4;10.2;Hot Chocolate
20.9;5.1;38.3;Pepperoni
12.5;30.0;11.0;Pizza
10.1;27.3;24.2;Pork Pie
1.7;16.1;0.3;Potatoes
6.9;74.0;2.8;Rice
26.1;0.3;5.8;Roast Chicken
0.0;95.1;0.0;Sugar
25.6;0.0;0.5;Tuna Steak
0.0;0.0;0.0;Water

Dosyanın ilk satırı, girdi veri vektörünün adlarını (başlıklarını) içerir. Bileşen düzlemlerini ayırt etmek için başlıklar gereklidir, adlarını gradyan panelinde yazdıracağız.

Desenin adı son sütunda bulunur, bizim durumumuzda bu, yiyeceğin adıdır.

SOM.mq5 (OnInit işlevi) kodu basitleştirilmiştir:

CSOM KohonenMap;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   MathSrand(200);
//--- load patterns from file
   if(!KohonenMap.LoadTrainDataFromFile(DataFileName))
     {
      Print("Error in loading data for training.");
      return(1);
     }
//--- train net
   KohonenMap.Train();
//--- render map
   KohonenMap.Render();
//--- show patterns from training set
   KohonenMap.ShowTrainPatterns();
//--- show bmp on the chart
   KohonenMap.ShowBMP(false);
   return(0);
  }

Eğitim kalıplarına sahip dosyanın adı, bizim durumumuzda "food.csv" olan DataFileName giriş parametresinde belirtilir.

Sonuç, Şekil 18'de gösterilmektedir.

Şekil 18. Siyah/beyaz degrade renk düzeninde yiyeceklerin Kohonen Haritası

Şekil 18. Siyah/beyaz degrade renk düzeninde yiyeceklerin Kohonen Haritası

Ayrıca, degrade şeması seçimi için ColorScheme giriş parametresini ekledik.

Şu anda 4 renk şeması mevcuttur (ColorScheme=0,1,2,4=Siyah-Beyaz, DarkBlue-Mavi-Yeşil-Sarı-Kırmızı, Kırmızı-Siyah-Yeşil, Kırmızı-Beyaz-Yeşil).


Gradyanı CSOM::InitParameters() yöntemine ekleyerek kendi şemanızı kolayca ekleyebilirsiniz.

Renk şeması, Uzman Danışmanın giriş parametrelerinden seçilebilir:


Benzer şekilde İris çiçeği veri setini (iris-fisher.csv) hazırlayabiliriz:

Sepal length;Sepal width;Petal length;Petal width;Title
5.1;3.5;1.4;0.2;setosa
4.9;3.0;1.4;0.2;setosa
4.7;3.2;1.3;0.2;setosa
4.6;3.1;1.5;0.2;setosa
5.0;3.6;1.4;0.2;setosa
5.4;3.9;1.7;0.4;setosa
4.6;3.4;1.4;0.3;setosa
5.0;3.4;1.5;0.2;setosa
4.4;2.9;1.4;0.2;setosa
4.9;3.1;1.5;0.1;setosa
5.4;3.7;1.5;0.2;setosa
4.8;3.4;1.6;0.2;setosa
4.8;3.0;1.4;0.1;setosa
4.3;3.0;1.1;0.1;setosa
5.8;4.0;1.2;0.2;setosa
5.7;4.4;1.5;0.4;setosa
5.4;3.9;1.3;0.4;setosa
5.1;3.5;1.4;0.3;setosa
5.7;3.8;1.7;0.3;setosa
5.1;3.8;1.5;0.3;setosa
5.4;3.4;1.7;0.2;setosa
5.1;3.7;1.5;0.4;setosa
4.6;3.6;1.0;0.2;setosa
5.1;3.3;1.7;0.5;setosa
4.8;3.4;1.9;0.2;setosa
5.0;3.0;1.6;0.2;setosa
5.0;3.4;1.6;0.4;setosa
5.2;3.5;1.5;0.2;setosa
5.2;3.4;1.4;0.2;setosa
4.7;3.2;1.6;0.2;setosa
4.8;3.1;1.6;0.2;setosa
5.4;3.4;1.5;0.4;setosa
5.2;4.1;1.5;0.1;setosa
5.5;4.2;1.4;0.2;setosa
4.9;3.1;1.5;0.2;setosa
5.0;3.2;1.2;0.2;setosa
5.5;3.5;1.3;0.2;setosa
4.9;3.6;1.4;0.1;setosa
4.4;3.0;1.3;0.2;setosa
5.1;3.4;1.5;0.2;setosa
5.0;3.5;1.3;0.3;setosa
4.5;2.3;1.3;0.3;setosa
4.4;3.2;1.3;0.2;setosa
5.0;3.5;1.6;0.6;setosa
5.1;3.8;1.9;0.4;setosa
4.8;3.0;1.4;0.3;setosa
5.1;3.8;1.6;0.2;setosa
4.6;3.2;1.4;0.2;setosa
5.3;3.7;1.5;0.2;setosa
5.0;3.3;1.4;0.2;setosa
7.0;3.2;4.7;1.4;versicolor
6.4;3.2;4.5;1.5;versicolor
6.9;3.1;4.9;1.5;versicolor
5.5;2.3;4.0;1.3;versicolor
6.5;2.8;4.6;1.5;versicolor
5.7;2.8;4.5;1.3;versicolor
6.3;3.3;4.7;1.6;versicolor
4.9;2.4;3.3;1.0;versicolor
6.6;2.9;4.6;1.3;versicolor
5.2;2.7;3.9;1.4;versicolor
5.0;2.0;3.5;1.0;versicolor
5.9;3.0;4.2;1.5;versicolor
6.0;2.2;4.0;1.0;versicolor
6.1;2.9;4.7;1.4;versicolor
5.6;2.9;3.6;1.3;versicolor
6.7;3.1;4.4;1.4;versicolor
5.6;3.0;4.5;1.5;versicolor
5.8;2.7;4.1;1.0;versicolor
6.2;2.2;4.5;1.5;versicolor
5.6;2.5;3.9;1.1;versicolor
5.9;3.2;4.8;1.8;versicolor
6.1;2.8;4.0;1.3;versicolor
6.3;2.5;4.9;1.5;versicolor
6.1;2.8;4.7;1.2;versicolor
6.4;2.9;4.3;1.3;versicolor
6.6;3.0;4.4;1.4;versicolor
6.8;2.8;4.8;1.4;versicolor
6.7;3.0;5.0;1.7;versicolor
6.0;2.9;4.5;1.5;versicolor
5.7;2.6;3.5;1.0;versicolor
5.5;2.4;3.8;1.1;versicolor
5.5;2.4;3.7;1.0;versicolor
5.8;2.7;3.9;1.2;versicolor
6.0;2.7;5.1;1.6;versicolor
5.4;3.0;4.5;1.5;versicolor
6.0;3.4;4.5;1.6;versicolor
6.7;3.1;4.7;1.5;versicolor
6.3;2.3;4.4;1.3;versicolor
5.6;3.0;4.1;1.3;versicolor
5.5;2.5;4.0;1.3;versicolor
5.5;2.6;4.4;1.2;versicolor
6.1;3.0;4.6;1.4;versicolor
5.8;2.6;4.0;1.2;versicolor
5.0;2.3;3.3;1.0;versicolor
5.6;2.7;4.2;1.3;versicolor
5.7;3.0;4.2;1.2;versicolor
5.7;2.9;4.2;1.3;versicolor
6.2;2.9;4.3;1.3;versicolor
5.1;2.5;3.0;1.1;versicolor
5.7;2.8;4.1;1.3;versicolor
6.3;3.3;6.0;2.5;virginica
5.8;2.7;5.1;1.9;virginica
7.1;3.0;5.9;2.1;virginica
6.3;2.9;5.6;1.8;virginica
6.5;3.0;5.8;2.2;virginica
7.6;3.0;6.6;2.1;virginica
4.9;2.5;4.5;1.7;virginica
7.3;2.9;6.3;1.8;virginica
6.7;2.5;5.8;1.8;virginica
7.2;3.6;6.1;2.5;virginica
6.5;3.2;5.1;2.0;virginica
6.4;2.7;5.3;1.9;virginica
6.8;3.0;5.5;2.1;virginica
5.7;2.5;5.0;2.0;virginica
5.8;2.8;5.1;2.4;virginica
6.4;3.2;5.3;2.3;virginica
6.5;3.0;5.5;1.8;virginica
7.7;3.8;6.7;2.2;virginica
7.7;2.6;6.9;2.3;virginica
6.0;2.2;5.0;1.5;virginica
6.9;3.2;5.7;2.3;virginica
5.6;2.8;4.9;2.0;virginica
7.7;2.8;6.7;2.0;virginica
6.3;2.7;4.9;1.8;virginica
6.7;3.3;5.7;2.1;virginica
7.2;3.2;6.0;1.8;virginica
6.2;2.8;4.8;1.8;virginica
6.1;3.0;4.9;1.8;virginica
6.4;2.8;5.6;2.1;virginica
7.2;3.0;5.8;1.6;virginica
7.4;2.8;6.1;1.9;virginica
7.9;3.8;6.4;2.0;virginica
6.4;2.8;5.6;2.2;virginica
6.3;2.8;5.1;1.5;virginica
6.1;2.6;5.6;1.4;virginica
7.7;3.0;6.1;2.3;virginica
6.3;3.4;5.6;2.4;virginica
6.4;3.1;5.5;1.8;virginica
6.0;3.0;4.8;1.8;virginica
6.9;3.1;5.4;2.1;virginica
6.7;3.1;5.6;2.4;virginica
6.9;3.1;5.1;2.3;virginica
5.8;2.7;5.1;1.9;virginica
6.8;3.2;5.9;2.3;virginica
6.7;3.3;5.7;2.5;virginica
6.7;3.0;5.2;2.3;virginica
6.3;2.5;5.0;1.9;virginica
6.5;3.0;5.2;2.0;virginica
6.2;3.4;5.4;2.3;virginica
5.9;3.0;5.1;1.8;virginica

Sonuç, Şekil 19'da gösterilmektedir.

Şekil 19. İris çiçeği veri seti. Kırmızı-Siyah-Yeşil renk şemasındaki bileşen düzlemleri (ColorScheme=2, iris-fisher.csv)

Şekil 19. İris çiçeği veri seti. Kırmızı-Siyah-Yeşil renk şemasındaki bileşen düzlemleri (ColorScheme=2, iris-fisher.csv)

Artık gerçek uygulamalar için bir aracımız var.


2.6. Örnek 5. Pazar ısı haritaları

Kendi Kendini Düzenleyen Özellik Haritaları, piyasa hareket haritaları için kullanılabilir. Bazen pazarın küresel resmine ihtiyaç duyulur, piyasa ısı haritası çok kullanışlı bir araçtır. Hisse senetleri ekonomik sektörlere bağlı olarak birleştirilir.

Stokun mevcut rengi, mevcut büyüme oranına (% olarak) bağlıdır:

Şekil 20. S&P500 hisse senetleri için piyasa ısı haritası

Şekil 20. S&P500'den hisse senetleri için piyasa ısı haritası

S&P'den (http://finviz.com) hisse senetlerinin haftalık piyasa ısı haritası Şekil 20'de gösterilmektedir. Renk, büyüme oranına bağlıdır (% olarak):

Hisse senedi dikdörtgeninin boyutu piyasa değerine bağlıdır. Aynı analiz MetaTrader 5 istemci terminalinde Kohonen Haritaları kullanılarak yapılabilir.

Buradaki fikir, büyüme oranlarını (% olarak) birkaç zaman dilimi için kullanmaktır. Kohonen haritaları ile çalışmak için aracımız var, bu nedenle gerekli olan tek şey, verileri .csv dosyasına kaydeden komut dosyasıdır.

Amerikan hisse senetlerinin CFD fiyatlarına ilişkin fiyat verileri (#AA, #AIG, #AXP, #BA, #BAC, #C, #CAT, #CVX, #DD, #DIS, #EK, #GE, #HD, # HON, #HPQ, #IBM, #INTC, #IP, #JNJ, #JPM, #KFT, #KO, #MCD, #MMM, #MO, #MRK, #MSFT, #PFE, #PG, #T, #TRV, #UTX, #VZ, #WMT ve #XOM) MetaQuotes Demo sunucusunda bulunabilir.

dj.csv dosyasını hazırlayan komut dizisi çok basittir:

//+------------------------------------------------------------------+
//|                                                           DJ.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

string s_cfd[35]=
  {
   "#AA","#AIG","#AXP","#BA","#BAC","#C","#CAT","#CVX","#DD","#DIS","#EK","#GE",
   "#HD","#HON","#HPQ","#IBM","#INTC","#IP","#JNJ","#JPM","#KFT","#KO","#MCD","#MMM",
   "#MO","#MRK","#MSFT","#PFE","#PG","#T","#TRV","#UTX","#VZ","#WMT","#XOM"
  };
//+------------------------------------------------------------------+
//| Returns price change in percents                                 |
//+------------------------------------------------------------------+
double PercentChange(double Open,double Close)
  {
   return(100.0*(Close-Open)/Close);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   ResetLastError();
   int filehandle=FileOpen("dj.csv",FILE_WRITE|FILE_ANSI);
   if(filehandle==INVALID_HANDLE)
     {
      Alert("Error opening file");
      return;
     }
//---
   MqlRates MyRates[];
   ArraySetAsSeries(MyRates,true);

   string t="M30;M60;M90;M120;M150;M180;M210;M240;Title";
   FileWrite(filehandle,t);
   Print(t);

   int total_symbols=ArraySize(s_cfd);

   for(int i=0; i<total_symbols; i++)
     {
      string cursymbol=s_cfd[i];

      int copied1=CopyRates(cursymbol,PERIOD_M30,0,8,MyRates);
      if(copied1>0)
        {
         string s="";
         s=s+DoubleToString(PercentChange(MyRates[1].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[2].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[3].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[4].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[5].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[6].open,MyRates[0].close),3)+";";
         s=s+DoubleToString(PercentChange(MyRates[7].open,MyRates[0].close),3)+";";
         s=s+cursymbol;
         Print(s);
         FileWrite(filehandle,s);
         }
         else
           {
            Print("Error in request of historical data on symbol ",cursymbol);
            return;
           }
     }
   Alert("OK");
   FileClose(filehandle);

  }
//+------------------------------------------------------------------+

Geçmiş veriler indirilmelidir, bunu DownloadHistory komut dosyasını kullanarak otomatik olarak yapabilirsiniz.

dj.mq5 betiğinin bir sonucu olarak, dj.csv'yi aşağıdaki verilerle alacağız:

M30;M60;M90;M120;M150;M180;M210;M240;Title
0.063;-0.564;-0.188;0.376;0.251;0.313;0.627;0.439;#AA
-0.033;0.033;0.067;-0.033;0.067;-0.133;0.266;0.533;#AIG
-0.176;0.039;0.039;0.274;0.196;0.215;0.430;0.646;#AXP
-0.052;-0.328;-0.118;0.315;0.223;0.367;0.288;0.328;#BA
-0.263;-0.351;-0.263;0.000;-0.088;0.088;0.000;-0.088;#BAC
-0.224;-0.274;-0.374;-0.100;-0.274;-0.224;-0.324;-0.598;#C
-0.069;-0.550;-0.079;0.766;0.727;0.638;0.736;0.589;#CAT
-0.049;-0.168;0.099;0.247;0.187;0.049;0.355;0.266;#CVX
0.019;-0.058;0.058;0.446;0.174;0.349;0.136;-0.329;#DD
-0.073;-0.219;-0.146;0.267;0.170;0.292;0.170;0.267;#DIS
-1.099;-1.923;-1.099;0.275;0.275;0.275;-0.549;-1.374;#EK
-0.052;-0.310;-0.103;0.362;0.258;0.362;0.465;0.258;#GE
-0.081;-0.244;-0.326;-0.136;0.081;0.326;0.489;0.489;#HD
-0.137;-0.427;-0.171;0.427;0.445;0.342;0.325;0.359;#HON
-0.335;-0.363;-0.112;0.112;0.168;0.307;0.475;0.251;#HPQ
0.030;-0.095;0.065;0.190;0.071;0.214;0.279;0.327;#IBM
0.000;-0.131;-0.044;-0.088;-0.044;0.000;0.000;0.044;#INTC
-0.100;-0.200;-0.166;0.100;-0.067;0.033;-0.532;-0.798;#IP
-0.076;0.076;0.259;0.473;0.427;0.336;0.336;-0.076;#JNJ
-0.376;-0.353;-0.494;-0.259;-0.423;-0.329;-0.259;-0.541;#JPM
-0.057;-0.086;-0.029;0.086;0.114;0.057;0.257;-0.114;#KFT
0.059;-0.030;0.119;0.282;0.119;0.193;0.208;-0.119;#KO
-0.109;-0.182;0.206;0.352;0.279;0.473;0.521;0.194;#MCD
-0.043;-0.195;-0.151;0.216;0.270;0.227;0.411;0.206;#MMM
-0.036;-0.072;0.072;0.144;-0.072;-0.108;0.108;0.072;#MO
0.081;-0.081;0.027;0.081;-0.054;0.027;-0.027;-0.108;#MRK
0.083;0.083;0.041;0.331;0.083;0.248;0.166;0.041;#MSFT
0.049;0.000;0.243;0.680;0.194;0.243;0.340;0.097;#PFE
-0.045;0.060;0.104;0.015;-0.179;-0.149;-0.224;-0.224;#PG
0.097;-0.032;0.000;0.129;0.129;0.064;0.097;0.064;#T
-0.277;-0.440;-0.326;-0.358;-0.537;-0.619;-0.570;-0.733;#TRV
-0.081;-0.209;0.035;0.325;0.198;0.093;0.128;-0.035;#UTX
0.054;0.000;0.054;0.190;0.136;0.326;0.380;0.353;#VZ
-0.091;-0.091;-0.036;0.036;-0.072;0.000;0.145;-0.127;#WMT
-0.062;-0.211;0.087;0.198;0.186;0.050;0.347;0.508;#XOM

som.mq5(ColorScheme=3, CellsX=30,CellsY=30, ImageXSize=200, ImageXSize=200, DataFileName="dj.csv") başlatıldıktan sonra, her biri zaman aralıklarına karşılık gelen 8 resim elde edeceğiz. 30, 60, 90, 120, 150, 180, 210 ve 240 dakika.

23 Mayıs 2011 işlem seansının son 4 saatine ait piyasa büyüme oranı verilerinin (Amerikan hisse senetleri) Kohonen haritaları Şekil 21'de sunulmaktadır.

Şekil 21. Amerikan hisse senetleri için Kohonen haritaları (23 Mayıs 2011 seansının son 4 saati).

Şekil 21. Amerikan hisse senetleri için Kohonen haritaları (23 Mayıs 2011 ticaret seansının son 4 saati).

Şekil 21'den, #C (Citigroup Inc.), #T (AT&T Inc.), #JPM (JPMorgan Chase & Co), #BAC (Bank of America) dinamiklerinin benzer olduğu görülebilir. Uzun vadeli kırmızı bir kümede gruplandılar.

Son 1,5 saat boyunca (M30, M60, M90) dinamikleri yeşile döndü, ancak genel olarak (M240) stoklar kırmızı bölgedeydi.

Kohonen haritalarını kullanarak hisse senetlerinin göreli dinamiklerini görselleştirebilir, liderler ve kaybedenler ve bunların çevresini bulabiliriz. Benzer verilere sahip öğeler kümeleri oluşturur.

Şekil 21a'dan gördüğümüz gibi Citigroup Inc hisselerinin fiyatı düşüşte lider oldu. Genel olarak finans şirketlerinin tüm hisseleri kırmızı bölgedeydi.

Şekil 21a. 23 Mayıs 2011 tarihli piyasa ısı haritası (kaynak: http://finviz.com)

Şekil 21a. 23 Mayıs 2011 Pazar ısı haritası (Kaynak: http://finviz.com)

Benzer şekilde FOREX piyasasının Kohonen haritalarını da hesaplayabiliriz (Şekil 22):

Şekil 22. FOREX piyasası için Kohonen haritası (24 mayıs 2011, Avrupa oturumu)

Şekil 22. FOREX piyasası için Kohonen haritası (24 Mayıs 2011, Avrupa oturumu)

Aşağıdaki çiftler kullanılır: EURUSD, GBPUSD, USDCHF, USDJPY, USDCAD, AUDUSD, NZDUSD, USDSEK, AUDNZD, AUDCAD, AUDCHF, AUDJPY, CHFJPY, EURGBP, EURAUD, EURCHF, EURJPY, EURNZD, EURCAD, GBPCHF, GBPJPY, CADCHF. 

Büyüme oranları fx.mq5 komut dosyası kullanılarak fx.csv dosyasına aktarılır.

M30;M60;M90;M120;M150;M180;M210;M240;Title
0.058;-0.145;0.045;-0.113;-0.038;-0.063;0.180;0.067;EURUSD
0.046;-0.100;0.078;0.094;0.167;0.048;0.123;0.160;GBPUSD
-0.048;0.109;-0.142;-0.097;-0.219;-0.143;-0.277;-0.236;USDCHF
0.042;0.097;0.043;-0.024;-0.009;-0.067;0.024;0.103;USDJPY
-0.045;0.162;0.155;0.239;0.217;0.246;0.157;0.227;USDCAD
0.095;-0.126;-0.018;-0.141;-0.113;-0.062;0.081;-0.005;AUDUSD
0.131;-0.028;0.167;0.096;-0.013;0.147;0.314;0.279;NZDUSD
-0.047;0.189;-0.016;0.107;0.084;0.076;-0.213;-0.133;USDSEK
-0.034;-0.067;-0.188;-0.227;-0.102;-0.225;-0.234;-0.291;AUDNZD
0.046;0.039;0.117;0.102;0.097;0.170;0.234;0.216;AUDCAD
0.057;-0.016;-0.158;-0.226;-0.328;-0.215;-0.180;-0.237;AUDCHF
0.134;-0.020;0.024;-0.139;-0.124;-0.127;0.107;0.098;AUDJPY
0.083;-0.009;0.184;0.084;0.208;0.082;0.311;0.340;CHFJPY
0.025;-0.036;-0.030;-0.200;-0.185;-0.072;0.058;-0.096;EURGBP
-0.036;-0.028;0.061;0.010;0.074;-0.006;0.088;0.070;EURAUD
0.008;-0.049;-0.098;-0.219;-0.259;-0.217;-0.094;-0.169;EURCHF
0.096;-0.043;0.085;-0.124;-0.049;-0.128;0.206;0.157;EURJPY
-0.073;-0.086;-0.119;-0.211;-0.016;-0.213;-0.128;-0.213;EURNZD
0.002;0.009;0.181;0.119;0.182;0.171;0.327;0.284;EURCAD
-0.008;0.004;-0.077;-0.015;-0.054;-0.127;-0.164;-0.080;GBPCHF
0.079;-0.005;0.115;0.079;0.148;-0.008;0.144;0.253;GBPJPY
0.013;-0.060;-0.294;-0.335;-0.432;-0.376;-0.356;-0.465;CADCHF

Fiyatların yanı sıra farklı zaman dilimlerinde göstergelerin değerlerini de kullanabilirsiniz.


2.6. Örnek 6. Optimizasyon Sonuçlarının Analizi

MetaTrader 5 istemci terminalinin titlehttps://www.metatrader5.com/en/automated-trading/strategy-testertitleStrateji Test Cihazı, parametre alanının yapısını keşfetme ve en iyi strateji parametreleri kümesini bulma fırsatı sunar. Ayrıca, "Optimizasyon Sonuçları" sekmesinin içerik menüsünden "XML'ye Aktar (MS Office Excel)" seçeneğini kullanarak optimizasyon sonuçlarını dışa aktarabilirsiniz.

Test Kullanıcısı İstatistikleri, optimizasyon sonuçlarına da dahildir (41 sütun):

  1. Sonuç
  2. Kâr
  3. Brüt Kar
  4. Brüt Zarar
  5. Para çekme
  6. Beklenen Geri Ödeme
  7. Kâr Faktörü
  8. Kurtarma Faktörü
  9. Sharpe Oranı
  10. Marj Düzeyi
  11. Özel
  12. Minimum Bakiye
  13. Bakiye DD Maksimal
  14. Bakiye DD Maksimal (%)
  15. Bakiye DD Bağıl
  16. Bakiye DD Bağıl (%)
  17. Asgari Hisse Senedi
  18. Hisse Senedi DD Maksimal
  19. Hisse Senedi DD Maksimal (%)
  20. Hisse Senedi DD Bağıl
  21. Hisse Senedi DD Bağıl (%)
  22. Alım satımlar
  23. Yatırımlar
  24. Kısa Alım Satımlar
  25. Kar Kısa Alım Satımlar
  26. Uzun Alım Satımlar
  27. Kar Uzun Alım Satımlar
  28. Kâr Alım Satımları
  29. Zarar Alım Satımları
  30. Maks Kâr alım satımı
  31. Maks zarar alım satımı
  32. Maks ardışık kazançlar
  33. Maks ardışık kazançlar ($)
  34. Maks ardışık kar
  35. Maks ardışık kâr sayısı    
  36. Maks ardışık kayıplar
  37. Maks ardışık kayıplar ($)
  38. Maks ardışık zararlar
  39. Maks ardışık zarar sayısı
  40. Ort. ardışık kazançlar
  41. Ort. ardışık kayıplar

Test cihazı istatistiklerinin kullanılması, parametre alanının analizine yardımcı olur. İstatistiğin birçok parametresinin yakından ilişkili olması ve ticaret performansı sonuçlarına bağlı olması dikkat çekicidir.

Örneğin, en iyi ticaret sonuçları, Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı parametrelerinin en büyük değerlerine sahiptir. Bu gerçek, sonuçların analizinde bunları kullanmamıza izin verir.

MovingAverage.mq5 Uzman Danışman Optimizasyon Sonuçları

Bu bölümde, MetaTrader 5 istemci terminalinin standart paketinde bulunan MovingAverage.mq5 Uzman Danışmanın optimizasyon sonuçlarının analizini ele alacağız. Bu Uzman Danışman, fiyat ve hareketli ortalama göstergesinin çaprazlamasına dayanmaktadır. İki giriş parametresi vardır: MovingPeriod ve MovingShift, yani sonuç olarak 43 sütunlu XML dosyasına sahip olacağız.

43 boyutlu parametre uzayını dikkate almayacağız, en ilginç olanları:

  1. Kâr;
  2. Kâr Faktörü;
  3. Kurtarma Faktörü;
  4. Sharpe Oranı;
  5. Alım satımlar;
  6. ProfitTrades(%);
  7. MovingPeriod;
  8. MovingShift;

Not, ProfitTrades (%) parametresini ekledik (sonuçlarda yok), bu karlı işlemlerin yüzdesi anlamına gelir ve ProfitTrades'in (28) İşlemlere (22) bölünmesi, 100 ile çarpılması sonucu hesaplanır.

MetaTrader 5 Strategy Tester'ın 400 set giriş parametresi için 9 sütunlu optim.csv dosyasını hazırlayalım.

Profit;Profit Factor;Recovery Factor;Sharpe Ratio;Trades;ProfitTrades(%);MovingPeriod;MovingShift;Title
-372.3;0.83;-0.51;-0.05;71;28.16901408;43;6;43
-345.79;0.84;-0.37;-0.05;66;27.27272727;50;6;50
...

MovingPeriod değerini Başlık sütunu olarak kullandığımıza dikkat edin, Kohonen haritalarındaki kalıpları "işaretlemek" için kullanılacaktır.

Strateji Test Kullanıcısında MovingPeriod ve MovingShift değerlerini aşağıdaki parametrelerle optimize ettik:

  • Sembol - EURUSD,
  • Dönem - H1,
  • Onay oluşturma modu - "1 Dakika OHLC",
  • Test aralığı - 2011.01.01-2011.05.24,
  • Optimizasyon - Hızlı (genetik algoritma),
  • Optimizasyon - Bakiye maks.

Şekil 23. MovingAverage EA optimizasyon sonuçları için Kohonen haritası (bileşen düzlem gösterimi)

Şekil 23. MovingAverage EA'nın optimizasyon sonuçları için Kohonen haritası (bileşen düzlem gösterimi)

Üst sıranın bileşen düzlemlerini ele alalım (Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı).

Şekil 24'te birleştirilmiştir.

Şekil 24. Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı parametreleri için bileşen düzlemleri

Şekil 24. Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı parametreleri için bileşen düzlemleri

İhtiyacımız olan ilki, en iyi optimizasyon sonuçlarına sahip bölgeleri bulmaktı.

Şekil 24'ten görülebileceği gibi, maksimum değerlere sahip bölgeler sol üst köşede yer almaktadır. Rakamlar Hareketli Ortalama göstergesinin ortalama periyoduna karşılık gelmektedir (MovingPeriod parametresi, başlık olarak kullandık). Sayıların konumu tüm bileşen düzlemleri için aynıdır. Her bileşen düzleminin kendi değer aralığı vardır, değerler degrade panelinde yazdırılır.

En iyi optimizasyon sonuçları, Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı gibi en büyük değerlere sahiptir, bu nedenle haritadaki bölgeler hakkında bilgi sahibiyiz (Şekil 24'te özetlenmiştir).

Trades, ProfitTrades(%), MovingPeriod ve MovingShift için bileşen düzlemleri Şekil 25'te sunulmaktadır.

Şekil 25. İşlemler, ProfitTrades(%), MovingPeriod ve MovingShift parametreleri için bileşen düzlemleri

Şekil 25. Trades, ProfitTrades(%), MovingPeriod ve MovingShift parametreleri için bileşen düzlemleri

Bileşen Düzlem Analizi

İlk bakışta ilginç bir bilgi yok. Doğrudan ticaret sisteminin performansına bağlı oldukları için ilk 4 bileşen düzlemi (Kar, Kar Faktörü, Geri Kazanım Faktörü ve Sharpe Oranı) benzer görünmektedir.

Şekil 24'ten görülebilir, sol üst bölge çok ilginçtir (örneğin, MovingPeriod'u 45'ten 50'ye ayarlarsak en iyi sonuçlara ulaşılabilir).

Uzman Danışman, EURUSD'nin saatlik zaman diliminde, trende dayalı stratejisini test etti, bu değerleri bir "piyasa trendi" hafızası olarak kabul edebiliriz. Doğruysa, 2011'in ilk yarısı için piyasa trend hafızası 2 güne eşittir.

Diğer bileşen düzlemlerini ele alalım.

Şekil 26. Bileşen düzlemleri Ticaret-Hareket Dönemi

Şekil 26. Bileşen uçakları Ticaret-Taşıma Dönemi

Şekil 26'ya baktığımızda, MovingPeriod'un (mavi bölgeler) daha düşük değerlerinin daha yüksek Ticaret değerlerine (sarı-kırmızı bölgeler) yol açtığını görebiliriz. Hareketli ortalama periyodu düşükse, birçok geçiş (işlem) vardır.

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

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

MovingShift (sarı-kırmızı bölgeler) arttıkça işlem sayısı azalır (mavi bölgeler). MovingShift ve Fig.24 için bileşen düzlemleri karşılaştırıldığında, MovingShift parametresinin bu ticaret stratejisinin performansı için çok önemli olmadığı görülebilir.

Kârlı işlemlerin yüzdesi ProfitTrades(%) doğrudan bağlı değildir MovingPeriod veya MovingShift, ticaret sisteminin ayrılmaz bir özelliğidir. Başka bir deyişle, girdi parametreleriyle korelasyonunun analizinin bir anlamı yoktur.

Daha karmaşık ticaret stratejileri de benzer şekilde analiz edilebilir. Ticaret sisteminizin en önemli parametresini/parametrelerini bulmanız ve bir başlık olarak kullanmanız gerekir.


Sonuç

Kendi Kendini Düzenleyen Özellik Haritalarının ana avantajı, yüksek boyutlu verilerin iki boyutlu ayrıklaştırılmış bir temsilini üretme fırsatıdır. Benzer özelliklere sahip veriler kümeler oluşturur, korelasyon analizini kolaylaştırır.

Ayrıntılar ve diğer uygulamalar Guido Deboeck ve Teuvo Kohonen tarafından kaleme alınmış olan mükemmel bir kitapta bulunabilir Visual Explorations in Finance: with Self-Organizing Maps .


Ek

Rusça versiyonunun yayınlanmasından sonra, Alex Sergeev, sınıfların geliştirilmiş versiyonunu (SOM_Alex-Sergeev_en.zip) önerdi.

Değişiklik listesi:

1. Görüntülerin gösterilmesi değişti: cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)
2. Resimlerle klasörü açma özelliği eklendi:

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

input bool OpenAfterAnaliz=true; // open folder with maps after finish

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

  1. CSOM::HideChart yöntemi eklendi - grafiği gizler.
  2. Eklenen sınıf üyeleri m_chart, m_wnd, m_x0, m_y0 - (grafik, pencere ve görüntüleri göstermek için koordinatlar).
    + m_sID eklendi - nesne adları öneki. Ön ek dosya adını kullanır, varsayılan olarak "SOM" öneki kullanılır.
  3. Tüm haritalar m_sID adıyla klasöre kaydedilir.
  4. bmp dosyaları, kalıpların sütun adına göre adlandırılır.
  5. CSOM::ShowBMP yöntemi değiştirildi (haritalar,\Images yerine \Files klasörüne kaydedilir, çok daha hızlı çalışır).
  6. CSOM::NetDeinit, CSOM::HideBMP olarak değiştirildi.
  7. CSOM::ReadCSVData yöntemi değiştirildi, ilk sütun başlıkları içeriyor.
  8. CSOM::Train(bool bShowProgress) içinde ara haritaları göstermek için bir bayrak eklendi.
  9. CSOM::Train'de ara haritaların gösterilmesi her 2 saniyede bir (yineleme yerine) gerçekleştirilir, ilerleme Yorum kullanılarak grafikte gösterilir.
  10. Bazı değişkenlerin optimize edilmiş isimleri, kategoriye göre sıralanmış sınıf yöntemleri.

Bmp çizimi çok yavaş bir işlemdir. Gerçekten ihtiyacınız yoksa, her seferinde çizmeyin.

Optimizasyon sonuçlarına sahip SOM görüntüleri örneği arşive dahil edilmiştir.

MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/283

Ekli dosyalar |
Uzman Danışmanlar İçin Özel Optimizasyon Kriterleri Oluşturma Uzman Danışmanlar İçin Özel Optimizasyon Kriterleri Oluşturma
MetaTrader 5 Müşteri Terminali, Expert Advisor parametrelerinin optimizasyonu için çok çeşitli fırsatlar sunar. Strateji test cihazında yer alan optimizasyon kriterlerine ek olarak, geliştiricilere kendi kriterlerini oluşturma fırsatı verilir. Bu, Uzman Danışmanların test edilmesi ve optimize edilmesi için neredeyse sınırsız sayıda olanak sağlar. Makale, bu tür kriterleri oluşturmanın hem karmaşık hem de basit olan pratik yollarını açıklar.
İstatistiksel Tahminler İstatistiksel Tahminler
Matematiksel model ve yöntemlerin çoğu farklı varsayımlara dayandığı için bir dizinin istatistiksel parametrelerinin tahmini çok önemlidir. Örneğin, dağılım yasasının normalliği veya ayrılma değeri veya diğer parametreler. Bu nedenle, zaman serilerini analiz ederken ve tahmin ederken, ana istatistiksel parametreleri hızlı ve net bir şekilde tahmin etmeye izin veren basit ve kullanışlı bir araca ihtiyacımız var. Makale, rastgele bir dizinin en basit istatistiksel parametrelerini ve görsel analizinin çeşitli yöntemlerini kısaca açıklamaktadır. Bu yöntemlerin MQL5'te uygulanmasını ve Gnuplot uygulamasını kullanarak hesaplama sonuçlarının görselleştirilmesi yöntemlerini sunar.
Yeni Başlayanlar için MQL5 Sihirbazı Yeni Başlayanlar için MQL5 Sihirbazı
2011'in başlarında MQL5 Sihirbazı'nın ilk sürümünü yayınladık. Bu yeni uygulama, otomatik olarak ticaret robotları oluşturmak üzere basit ve kullanışlı bir araç sağlar. Herhangi bir MetaTrader 5 kullanıcısı, MQL5'te nasıl programlama yapılacağını bile bilmeden özel bir Uzman Danışman oluşturabilir.
Kaynak Kodun İzlenmesi, Hata Ayıklanması ve Yapısal Analizi Kaynak Kodun İzlenmesi, Hata Ayıklanması ve Yapısal Analizi
Yürütülen bir kodun yapısını oluşturma ve izleme sorunlarının tamamı, ciddi zorluklar olmadan çözülebilir. Bu olasılık, MQL5 dilinin yeni özelliği - karmaşık veri türlerinin (yapılar ve sınıflar) otomatik olarak oluşturulması ve yerel kapsam dışına çıkarken bunların ortadan kaldırılması nedeniyle MetaTrader 5'te ortaya çıkmıştır. Makale, metodolojinin ve hazır aracın açıklamasını içerir.