Библиотеки: ALGLIB - библиотека численного анализа - страница 2

 
Я когда писал свою статью, то использовал ALGLIB. И даже удалось на форуме у автора библиотеки кое-что спросить, что мне было тогда непонятно. Автор был весьма любезен и подробно мне ответил. За что ему отдельный респект и уважуха. Рад, что работа Бочканова С.А. была замечена MQ Co...
 
Очень рад появлению этой библиотеки. Спасибо!
 
Красавцы MQ! Серьезная работа!

Пример использования библиотеки - обучение нейронной сети MLP таблице умножения.

#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+
#define _rand(min,max) ((rand()/(double)SHORT_MAX)*((max)-(min))+min)
//+------------------------------------------------------------------+
void OnStart()
{
   CMultilayerPerceptron net;
   CMLPReport rep;
   CMatrixDouble patterns;
   double vector[2], out[1];
   int info;
   // подготовка данных
   patterns.Resize(100,3);
   int m=0;     // first pattern
   for(int i=1; i<=10; i++)
      for(int j=1; j<=10; j++)
      {
         patterns[m].Set(0,i/10.0);       // input 1
         patterns[m].Set(1,j/10.0);       // input 2
         patterns[m].Set(2,(i*j)/100.0);  // target
         m++; //next pattern
      }
   // создание сети с одним скрытым слоем(5 нейронов)
   CMLPBase::MLPCreate1(2,5,1,net);
   // обучение сети
   CMLPTrain::MLPTrainLM(net,patterns,100,1e-3,5,info,rep);     //Levenberg-Marquardt
   //CMLPTrain::MLPTrainLBFGS(net,paterns,100,1e-3,10,0.001,1000,info,rep);//L-BFGS
   Print("Info=",info,"  Error=",CMLPBase::MLPError(net,patterns,100)); 
   // проверка сети на целочисленных данных
   string s="Тест 1 >> ";
   for(int i=1; i<=10; i++)
   {
      int d1=(int)_rand(1,10), d2=(int)_rand(1,10);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
      CMLPBase::MLPProcess(net,vector,out);
      s+=(string)d1+"*"+(string)d2+"="+DoubleToString(out[0]*100,0)+" // ";
   }
   Print(s);
   // проверка сети на дробныx данных
   s="Тест 2 >> ";
   for(int i=1; i<=5; i++)
   {
      double d1=NormalizeDouble(_rand(1,10),1), d2=NormalizeDouble(_rand(1,10),1);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
      CMLPBase::MLPProcess(net,vector,out);
      s+=DoubleToString(d1,1)+"*"+DoubleToString(d2,1)+"="+DoubleToString(out[0]*100,2)+
         "("+DoubleToString(d1*d2,2)+") // ";
   }
   Print(s);
}
2012.10.13 12:44:31     Test_MLP(Alglib) (EURUSD,M30)   Info=2  Error=0.0005349624857861839
2012.10.13 12:44:31     Test_MLP(Alglib) (EURUSD,M30)   Тест 1 >> 3*6=18 // 1*1=0 // 7*8=56 // 1*5=5 // 4*6=24 // 7*6=42 // 8*2=16 // 1*5=5 // 3*2=6 // 6*7=42 // 
2012.10.13 12:44:31     Test_MLP(Alglib) (EURUSD,M30)   Тест 2 >> 6.3*8.2=51.83(51.66) // 7.0*8.1=57.04(56.70) // 9.0*8.1=73.36(72.90) // 4.1*9.6=39.05(39.36) // 6.3*8.8=55.63(55.44) // 

:( Вот только боюсь подумать, что будет с облаком, когда пользователи начнут активно использовать библиотеку в своих экспертах.
Данный простой скрипт весит под мегабайт.
Файлы:
 
Yurich:Пример использования библиотеки - обучение нейронной сети MLP таблице умножения.

где взяли такой пример? )))))))))))))) 

спасибо, только собирался такой же примерчик для себя изучить, а можете выяснить, чей код обучения НС таблице умножения быстрее обучится, ВАш https://www.mql5.com/ru/code/596 или же портированный ALGLIB ?

 
Спасибо за новинку.
Прорывом будет реализация с использованием OpenCL.

Только вот Метаквоты помрут молодыми при реализации этого проекта.

Планируется ли полноценная поддержка данной библиотеки?

Если - да, то может поставлять её в двоичном виде?

Если поставлять в двоичном виде, то пора добавлять галочку в настройках Терминала "Разрешить вызов  DLL MetaQuotes"  :0)



 
Через MetaEditor закачивает только 11 файлов mqh
 
The source could be updated to the last version 3.8.2.
 

Добрый день, спасибо за библиотеку, действительно шустрая, но есть пара вопросов.

Нужен был метод PCABuildBasis, передавал ему синхронизированную по времени матрицу с ценами K строк x N столбцов, где К - набор валютных пар, а N - набор цен для этих пар. в Среднем матрица получалась размером 7 pairs х 500 open prices.

Скачивал библиотеку в конце прошлого года, возможно в декабре, работало вроде нормально, независимо от того, цены были расположены в строках матрицы или в столбцах, неделю назад скачал новый вариант и начал периодически получать такие ошибки

        2014.07.09 22:25:31.604    Synthetics (USDCHF,D1)    zero divide in 'alglibinternal.mqh' (3333,21)
        2014.07.09 22:25:31.603    Synthetics (USDCHF,D1)    CAp::Assert CBaseStat::SampleMoments: x is not finite vector

Попытался и логарифмировать цены, и приводить к общему знаменателю, в данном случае USD, но даже если ошибки, упомянутые выше исчезали, то результат выполнения PCABuildBasis почему-то всегда возвращал :

примерно такие собственные значения - eigenvalues

1.#INF0

1.#INF0

1.#INF0

0

0

0

0

и примерно такую матрицу собственных векторов

0 0 0 0 0 0 0 ...

0 0 0 0 0 0 0 ...

0 0 0 0 0 0 0 ...

0 0 0 0 0 0 0 ...

1 1 1 1 1 0.99999 1 ...

0 0 0 0 0 0 0 ...

0 0 0 0 0 0 0 ...

потом попытался развернуть исходную матрицу с ценами чтобы валюты стали столбцами, а цены строками и все, вроде как, заработало. Т.е. сейчас если K - это цены, а N - валюты, то так матрица векторов выглядит вполне рабочей. Хотя вроде тут, во втором посте, автор говорит, что расположение элементов по строкам и столбцам не играет роли.

Поэтому хотел бы спросить - есть ли разница как создавать исходную матрицу row-based or column-based или же это у себя где-то в другом месте ошибку искать?

 

Скрипт Scripts\Alglib\usealglib искрит при запуске (деление на ноль).

заменил строку 120 на

HPR[i]=balance_total.At(i+1)*pow(balance_total.At(i),-1.);

 всё заработало.

 
Дальнейшей поддержки библиотеки для MQL с момента публикации статьи больше нет?