Обсуждение статьи "Еще раз о картах Кохонена" - страница 3

 
Кстати, взял другие данные. Снова в третьей картинке радуга. Полагаю, что такое получается из-за вашего вмешательства в код, с которого вы писали эту работу. Вы писали в статье, что сделали несколько модификаций.

Скриншоты торговой платформы MetaTrader

GBPUSD, H1, 2017.03.01

Alpari International Limited, MetaTrader 5, Demo

Что за радуга?

GBPUSD, H1, 2017.03.01, Alpari International Limited, MetaTrader 5, Demo


 
Viktor Vasilyuk:
Кстати, взял другие данные. Снова в третьей картинке радуга. Полагаю, что такое получается из-за вашего вмешательства в код, с которого вы писали эту работу. Вы писали в статье, что сделали несколько модификаций.



Нормализация рандома при инициализации узлов ни как не ограничивает сами узлы при обучении. Вы можете инициализировать узлы хоть единицами, это ни как не повлияет на результат.

А‌ вот на скорость достижения результата повлиять может.

Т‌о что я инициализирую ноды рандомными значениями из поля между минимумом и максимумом по каждому из столбцов в отдельности, просто ускоряет сходимость, потому как SOM не приходится в начале вгонять ноды в заданные поля.

П‌роцесс этот органично вплетён в само обучение поэтому даже сказать вот в этот момент сетка вгоняет а вот тут учится нельзя. Вгонять в заданное поле значит делать подстройку нода с очень большим коэффициентом изменения.

Т‌ак что принципиально, моё вмешательство ничего не изменило. Ускорилась лишь скорость сходимости.

Н‌о если у вас есть нарекания на этот механизм, вы вольны это исправить. Поменяйте инициализацию нодов при создании сетки в  Include\SOMNode.mqh

//+------------------------------------------------------------------+
//| Инициализация параметров узла в заданом пределе                  |
//+------------------------------------------------------------------+
void CSOMNode::InitNode(int x1,int y1,int x2,int y2,const double &min_values[],const double &max_values[])
  {
//--- устанавливаем координаты узла
   m_x1=x1;
   m_y1=y1;
   m_x2=x2;
   m_y2=y2;
//--- расчет координат центра узла
   m_x=x1+MathAbs((x2-x1))/2;
   m_y=y1+MathAbs((y2-y1))/2;
//--- подготавливаем массив весов  
   ArrayResize(m_weights,m_dimension);
//--- инициализация весов случайными значениями;
   for(int i=0; i<m_dimension; i++) {m_weights[i]=min_values[i]+(max_values[i]-min_values[i])*rand()/32768;}
  };

Поставьте ненормализованный rand() и будет точно как в оригинальном алгоритме. Как то вот так: m_weights[i]=rand();

 

Правильно ли я понимаю, что если создать файл "optim.csv" вот такого формата:

i;Title
-0.195;2017.04.04
0.086;2017.04.03
-0.195;2017.03.31
-0.195;2017.03.30
-0.195;2017.03.29
0.086;2017.03.28
-0.195;2017.03.27
-0.195;2017.03.24
0.086;2017.03.23
0.086;2017.03.22

здесь всего два значения:

  • -0.195
  • 0.086

то запуск "Sample5_SOM_Net_Player" покажет что-то вроде 

start 1 start 2

то есть сеть Кохена нашла, что в файле "optim.csv" есть два ... Два чего? Паттерна?


 

То есть, если я хочу исследовать два соседних бара - бычьи они или медвежьи, то мне нужно составить описание таких последовательностей, что то вроде:

Два соседних бара

В итоге будет четыре основных последовательности ("11", "12", "21", "22") и одна пятая - когда любой бар не является ни бычьим, ни медвежьим (размер тела бара равно нулю).


Затем просто пройтись по заданному количеству баров и составить файл  "optim.csv" в который и записать эти последовательности. Получится что-то вроде

i;Time
21;2017.04.03
11;2017.03.31
11;2017.03.30
11;2017.03.29
12;2017.03.28
22;2017.03.27
21;2017.03.24
11;2017.03.23
12;2017.03.22

После чего запустить "Sample5_SOM_Net_Player". Так?

 

Значения то у вас два, но вот нодов (узлов) вы заказали 250 (50х50), естественно что сетка натягивает ноды на всё поле промежуточных значений.

К тому же вы внесли в поле кластеризации незначимое значение Time. Если хотите использовать время, то в структуре данных как то должна быть отображена периодичность, иначе как сетка поймёт чем понедельник отличается от пятницы. Такая подача времени как у вас целесообразна хотя бы на данных за несколько лет, тогда в них будут встречаться повторы (если конечно убрать значения года).

Поймите простую мысль, сетка Кохонена помещает узлы, в окрестностях похожих (в многомерном плане) примеров. И тогда с пониманием работы всё встанет на свои места.

 
Nikolay Demko:

Значения то у вас два, но вот нодов (узлов) вы заказали 250 (50х50), естественно что сетка натягивает ноды на всё поле промежуточных значений.

К тому же вы внесли в поле кластеризации незначимое значение Time. Если хотите использовать время, то в структуре данных как то должна быть отображена периодичность, иначе как сетка поймёт чем понедельник отличается от пятницы. Такая подача времени как у вас целесообразна хотя бы на данных за несколько лет, тогда в них будут встречаться повторы (если конечно убрать значения года).

Поймите простую мысль, сетка Кохонена помещает узлы, в окрестностях похожих (в многомерном плане) примеров. И тогда с пониманием работы всё встанет на свои места.


Если я переделаю файл csv в виде такого формата: [размер тела свечи][день недели (1, 2, 3, 4, 5)] и заполню его для, скажем, 100 баров, то в итоге я получу в файле csv 100 ПРИМЕРОВ? И сколько нодов ставить в таком случае? 3*3?
 
Vladimir Karputov:

Если я переделаю файл csv в виде такого формата: [размер тела свечи][день недели (1, 2, 3, 4, 5)] и заполню его для, скажем, 100 баров, то в итоге я получу в файле csv 100 ПРИМЕРОВ? И сколько нодов ставить в таком случае? 3*3?


Это зависит от того что вы хотите получить, кластеризацию или регрессию.

Кластеризация объединит несколько примеров в один кластер, тогда количество нодов должно быть меньше чем примеров.

Регрессия потребует нодов больше чем самих примеров, для того чтоб покрыть поля в точках которые не представлены в примерах.

ЗЫ Опять же это процесс не бинарный, поэтому нельзя сказать что это кластеризация, а вот это уже регрессия, представьте это как разнонаправленный спектр, чем больше кластеризации тем меньше регрессии и наоборот. А в нулевой точке, когда количество нодов равно количеству примеров, имеем примерно поровну и кластеризации и регрессии.

 
Nikolay Demko:


Это зависит от того что вы хотите получить, кластеризацию или регрессию.

Кластеризация объединит несколько примеров в один кластер, тогда количество нодов должно быть меньше чем примеров.

Регрессия потребует нодов больше чем самих примеров, для того чтоб покрыть поля в точках которые не представлены в примерах.


Ну, если упростить, то я хотел получить визуализацию для четырёх последовательностей:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "Еще раз о картах Кохонена"

Vladimir Karputov, 2017.04.04 13:49

То есть, если я хочу исследовать два соседних бара - бычьи они или медвежьи, то мне нужно составить описание таких последовательностей, что то вроде:

Два соседних бара

В итоге будет четыре основных последовательности ("11", "12", "21", "22") и одна пятая - когда любой бар не является ни бычьим, ни медвежьим (размер тела бара равно нулю).


в заданном кол-ве баров. То есть я прохожу скриптом по заданному количеству баров, и присваиваю одну из пяти последовательностей ("0", "11", 12", "21", "22"). И также присваиваю день недели. В итоге для 100 баров я получаю 100 примеров [название последовательности][день недели].

 
Vladimir Karputov:


Ну, если упростить, то я хотел получить визуализацию для четырёх последовательностей:


в заданном кол-ве баров. То есть я прохожу скриптом по заданному количеству баров, и присваиваю одну из пяти последовательностей ("0", "11", 12", "21", "22"). И также присваиваю день недели. В итоге для 100 баров я получаю 100 примеров [название последовательности][день недели].


Извините не понимаю, если у вас есть комбинация условий и вы точно знаете их, то зачем вам сетка?

ЗЫ Если же нет, то лучше показать сетке что вас интересует, например разность Open[i]-Close[i] в одной колонке, и разность Open[i+1]-Close[i+1] в другой, а уже на основании кластеризации выставлять условия какой кластер как интерпретировать.

 
Nikolay Demko:


Извините не понимаю, если у вас есть комбинация условий и вы точно знаете их, то зачем вам сетка?

***

  1. Комбинации ("0", "11", 12", "21", "22") это я только сегодня, для примера привёл. Не представляю - рабочие они или нет. Вот и спросил - если я придумаю всяких комбинаций, то как мне поможет сетка? Я думал, что эта сетка покажет визуально (количество?) попаданий моих примеров в какие-то определённые группы (кластеры?).
  2. Ну а если я сделаю "... например разность Open[i]-Close[i] в одной колонке, и разность Open[i+1]-Close[i+1] в другой, ..." какая обратная связь? Ну увижу цвета разные - а кто из них кто?
Причина обращения: