Alglib MLP (нейронная сеть) портировали неправильно?

 

Библиотека Alglib уже давно является частью MQL5. Нейронная сеть из этой библиотеки пока единственная из официально доступных.

Я попытался использовать эту сеть, но столкнулся с расхождением в результатах.

Модификация: MLPKFoldSplit() не перемешивает данные (сейчас нужно протестировать саму сеть, а не качество данных).

Результат: cvrep.m_avgerror * 100

График оптимизации

Расхождение меньше 1% объяснить ещё можно, но здесь расхождение в 2,5%

Возникает вопрос о правильном портировании библиотеки?

Файлы:
alglibtest.zip  2679 kb
 

Добрый день!

Проверить полностью всю работу нейронной сети включая её обучение по алгоритму LBFGS крайне трудоемкая задача.

Поэтому для проверки я взял один из самых распространенных тестов для машинного обучения - XOR:

#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double data[4][3]=
     {
      // inputs   outputs
        {-1, -1,    -1},
        {-1,  1,     1},
        { 1, -1,     1},
        { 1,  1,    -1}
     };
   int nrows=ArrayRange(data,0);
   int ncolumns=ArrayRange(data,1);
   CMatrixDouble matrix;
   matrix.Resize(nrows,ncolumns);
   for(int i=0; i<nrows; i++)
      for(int j=0; j<ncolumns; j++)
         matrix[i].Set(j,data[i][j]);

   CMultilayerPerceptron mlp;
   CMLPBase::MLPCreateR1(2,2,1,-1,1,mlp);

   int info=0;
   CMLPReport rep;
   CMLPTrain::MLPTrainLBFGS(mlp,matrix,matrix.Size(),0.001,2,0.01,100,info,rep);

   Print("Test start.");
   for(int i=0; i<nrows; i++)
     {
      double real=data[i][2];
      double x[2];
      x[0] = data[i][0];
      x[1] = data[i][1];
      double y[];
      CMLPBase::MLPProcess(mlp,x,y);
      Print("Actual: "+string(y[0])+" Expected: "+string(real));
     }

   CMLPCVReport cvrep;
   CMLPTrain::MLPKFoldCVLBFGS(mlp,matrix,matrix.Size(),0.001,2,0.01,100,10,info,rep,cvrep);
   Print("Average error = "+string(cvrep.m_avgerror));
   Print("Test finish.");
  }

Результат:

Test start.
Actual: -0.9706581896514489 Expected: -1.0
Actual: 0.9621222666301732 Expected: 1.0
Actual: 0.9621628440150716 Expected: 1.0
Actual: -0.9706527084520606 Expected: -1.0
Average error = 1.276264422944889e-311
Test finish.

Если же мы убираем строку с обучение из скрипта, то получим результат гораздо хуже:

Actual: 0.4466560346052408 Expected: -1.0
Actual: 0.3265451011586167 Expected: 1.0
Actual: 0.5149972547475861 Expected: 1.0
Actual: 0.3945188532756552 Expected: -1.0

Следовательно обучение действительно есть и проходит на этом примере корректно.

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

Судя по вашим исходникам вы задаёте максимальное количество эпох для обучения равное всего 5, что вероятно очень мало для этих данных:


 
Как тогда подбирать параметры, если нет стабильности в результатах тестирования?
 
Roffild:
Как тогда подбирать параметры, если нет стабильности в результатах тестирования?
А вы доказали нестабильность и применимость правильных методов?
 

Проверил через C# и результаты совпадают.


 
Оценку качества данных это затрудняет.
 
Roffild:


Возникает вопрос о правильном портировании библиотеки?

Обычно метаквоты делают свою работу аккуратно, а вот сам алглиб....

Кто сказал, что это работающая библиотека? Какое у нее количество пользователей?

Зачем Вам эта местечковая разработка?

Ведь магистральное направление в области машинного обучения, к котором относится НС, называется R. Все прекрасно доступно из МТ4/5. Огромный набор инструментов, в частности большой набор самых разных НС...

 
СанСаныч Фоменко:

Ведь магистральное направление в области машинного обучения, к котором относится НС, называется R. Все прекрасно доступно из МТ4/5. Огромный набор инструментов, в частности большой набор самых разных НС...

Осталось портировать из R в чистый MQL.
 
Stanislav Korotky:
Осталось портировать из R в чистый MQL.

Что алглиб библиотека, что R внешний инструмент, только очень солидный. R нельзя равнять с алглибом - совершенно разные весовые категории
 
СанСаныч Фоменко:

Что алглиб библиотека, что R внешний инструмент, только очень солидный. R нельзя равнять с алглибом - совершенно разные весовые категории


Людям не нужен весь этот геморрой, какова бы хороша среда и язык не были.. люди хотят работать в мт5 без левого софта

Ничего там прекрасно не доступно из мт4/5 а через кучу костылей, так работать просто невозмнжно, нужно быть великим энтузиастом что бы тратить нереальное кол-во времени на весь этот отстой, новички вообще никогда в жизни не станут этим заниматься

И нет ни одной доступной статьи для простого обывателя, как эффективно работать со связкой мт-R, есть 2-3 людей, включая Вас, кто этим занимается, и всё на этом. Все статьи по R написаны в специфическом жанре и со своими "тараканами", и нет ни одной статьи, которая бы доказывала что есть хоть малейший смысл его использовать, не жалея потом о потраченных месяцах

 
СанСаныч Фоменко:
Что алглиб библиотека, что R внешний инструмент, только очень солидный. R нельзя равнять с алглибом - совершенно разные весовые категории
Гипотетический R в виде библиотеки для МТ - это не внешний инструмент. ;-)
Причина обращения: