Нужен совет (нейросеть) - страница 5

 
lasso:


в архиве в папке mt4_fann лежат исходники от Mariusz Woloszyn ? Или как?

Нет - это одна из первых попыток использовать FANN в МТ. Даже не помню откуда брал. Так и не воспользовался - делал свою.

ЗЫ Одна из реализаций PNN для МТ - и FANN не нужен:

//+------------------------------------------------------------------+
//|                                                          PNN.mq4 |
//|                                          Copyright © 2007, Klot. |
//|                                            http://www.fxreal.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Klot."
#property link      "http://www.fxreal.ru/"
#property library

//+------------------------------------------------------------------+
//| C - is the number of classes, N - is the number of examples,     |
//| Nk - are from class k                                            |
//| d - is the dimensionality of the training examples,              |
//| sigma - is the smoothing factor                                  |
//| test_example[d] - is the example to be classified                |
//| Examples[N][d] - are the training examples                       |
//+------------------------------------------------------------------+
int PNN(int C, int N, int Nk, int d, double sigma, double test_example[d], double Examples[N][d]) 
   { 
   int classify = -1; 
   double largest = 0; 
   double sum[];
   ArrayResize(sum,C);
   // The OUTPUT layer which computes the probability density function for each class C 
   for ( int k=0; k<C; k++ ) 
      {
      sum[ k ] = 0; 
      // The SUMMATION layer which accumulates the probability density function  
      // for each example from the particular class k 
      for ( int i=0; i<Nk; i++ ) 
         {
         double product = 0; 
         // The PATTERN layer that multiplies the test example by the weights 
         for ( int j=0; j<d; j++ )  product += test_example[j] * Examples[i][j];
         //-----
         product = (product-1)/(sigma*sigma); 
         product = MathExp(product); 
         sum[k] += product;
         } 
      sum[k]/=Nk;
      }
   //----
   for ( k=0; k<C; k++ )
   if ( sum[ k ] > largest ) 
      {
      largest = sum[ k ]; 
      classify = k;
      }
   //----
   return (classify);
   } 
//+------------------------------------------------------------------+  
 
VladislavVG:

PNN в МТ:

Вы кладезь полезностей. ))

Буквально сегодня подумал типа, ну что такое PNN? Это MLP с количеством нейронов в скрытом слое равном кол-ву обучающих примеров.

А далее ступор из-за незнания мат.части....

............

Я правильно понял по рисунку, что p/k=2 ?

И как реализовать второй суммирующий слой, ведь он на половину связан с радиальным?

Вопросов много...

 
VladislavVG:

Нет - это одна из первых попыток использовать FANN в МТ. Даже не помню откуда брал. Так и не воспользовался - делал свою.

ЗЫ Одна из реализаций PNN для МТ - и FANN не нужен:

Кстати, сайтa http://www.fxreal.ru/ не существует.

И куда подевался klot?




 
lasso:


Я правильно понял по рисунку, что p/k=2 ?


В принципе - не обязательно .... Это тоже PNN:

Удачи.

 
VladislavVG:

В принципе - не обязательно .... Это тоже PNN:

Удачи.

Главный вопрос: как организовать неполносвязную сеть через Fann2MQL.dll?

Нам не нужны связи отмеченные на рисунке цветом цветом.

А штатной в FANN функции fann_create_sparse( ....) у нас нет.

.......................

Может быть есть какая то хитрость?



 
lasso:

Главный вопрос: как организовать неполносвязную сеть через Fann2MQL.dll?

Нам не нужны связи отмеченные на рисунке цветом цветом.

А штатной в FANN функции fann_create_sparse( ....) у нас нет.

.......................

Может быть есть какая то хитрость?



Так а в чем проблема ее сделать доступной ? Нужно ее (эту функцию) просто внести в деф файл .... Исходники библиотеки FANN же есть ....

Самый главный вопрос: зачем FANN для построения PNN ? это все руками пишется за пару часов\минут. Можно просто отредактировать вариант Клота....

В PNN нет обучения - она просто выбирает наиболее близкий ответ из представленных примеров.

И еще, ИМХО: SVM - более предпочтительный вариант по отношению к FANN, а наиболее предпочтительный - использовать ГА: в принципе, теоретически, можно забыть про всякие хитрости типа нормировок входных данных - нужно следить за пределами варьирования весовых коэффициентов, можно как входные данные задать и архитектуру сети и не только обучать сеть, но и подбирать оптимальную архитектуру для данного типа входных данных ... Все, что Вам понадобится в этом случае - процедура умножения матрицы (весов сети) на вектор (входные данные). Учитывая возможность передачи адресов функций (указатель на функцию) как параметры, в С\С++ можно оптимизировать еще и использование функций активации .... В МКЛ тоже можно, если немного поколдовать ;) .....

 

С Fann я знаком только поверхностно, читал пару статей здесь на сайте.

Могу в качестве еще одного инструмента создания нейросетей порекомендовать (без рекламы) бесплатно распространяемую прогу Membrain http://www.membrain-nn.de/english/details_en.htm В ней в ручном режиме, гибко задается почти любая конфигурация сети, прямого распространения, рекурентные, SOM. Там можно удалять связи как хочется. Некоторые сети, однако, не поддерживаются, например PNN.

 

Продолжая мою тему, решил провести пару экспериментов, поскольку назрела необходимость. Исследовал зависимость между ошибкой обобщения сети (на OoS-периоде) и ошибкой на тестовой выборке, изменяя 1) размер обучающей выборки (читай, глубину истории котировок), 2) способ формирования тестовой выборки (использую для ранней остановки обучения сети).

1 блок данных показывает результаты моей нейросетевой модели на данных 5-ти минутных баров. Историю подгружаю не из data-center, а непосредственно с торгового сервера (по умолчанию, то, что предлагает терминал MT4 с сайта разработчиков). Глубина истории котировок для таймфрейма M5, которую я смог подгрузить Page Up-ом, составляет 3 месяца, или примерно 17000 баров. Для нейросетей это вполне достаточный объем. Валидационный отрезок здесь - самая последняя неделя (1440 баров), тестовая выборка также фиксирована и составляет одну неделю перед валидационным периодом, то есть, тоже 1440 баров. В эксперименте меняем объем обучающей выборки и смотрим на показатели ошибки. Строил каждый раз по 5 сетей с минимальной найденной ошибкой на тестовой выборке, на графике показываю средние значения ошибки. По оси ординат - объем обучающей выборки в неделях.

Отметим, что минимум ошибки на валидационном (OoS) отрезке достигается на минимальном проверенном объеме обучающей выборке в 1 неделю. Второе, что отметим, это отсутствие прямой связи - а даже, скорее, наличие обратно пропорциональной связи - между ошибкой на тестовой выборке и ошибкой на валидационной выборке. Вывод, достижение маленькой ошибки на тесте не индицирует маленькую ошибку обобщения сети на новых данных...

А теперь попробуем по-иному формировать тестовую выборку. Будем ее выбирать случайно из массива примеров. Объем я определял, исходя из ошибки выборки, и брал доверительный уровень 0,99, доверительный интервал 0,05. Соответственно, считал необходимый объем выборочной совокупности каждый раз при изменении объема обучающей выборки. Обращаю внимание, что нижеследующий блок данных представляет результаты на модели H1, которую я и обсуждал в этой теме. И объем массива примеров для обучающей+тестовой выборок варьируется от 12 до 3 месяцев.

Обратим внимание на то, что минимальная ошибка обобщения нейросети на валидационной выборке достигается при максимальном протестированном объеме массива обучающих примеров. Вывод, если формируем тестовую выборку случайно - берем глубину истории побольше (год для H1 - это максимум, принудительно подкачиваемый с торгового сервера).

Ситуация с ошибкой обобщения на OoS-периоде получается прямо противоположная по сравнению с предыдущим опытом. Значит, способ формирования тестовой выборки влияет на качество обобщения нейросети при различных объемах обучающей выборки.

Интерпретировать такие результаты в лоб сложно. Обобщать результат для произвольных нейросетевых моделей - пока нельзя... Для меня это еще один способ потенциально улучшить показатель моей модели.

Причина обращения: