Обсуждение статьи "Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее" - страница 13

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

Прочитал.

Вник.

Считаю, что приведенные Вами тесты не совсем корректны. Считаю необходимым об этом написать, так как сравнения быстродействия не последние. 

Дело в том, что МКЛ качественно отличается от R. И в случаях сравнения быстродействия эти качественные различия должны учитываться там, где это возможно. R - интерпретатор, а МКЛ - компилятор. Это качественно различие для промышленных программ идет в плюс МКЛ.

Вы посмотрите в исходный код R (он ведь опенсорсный). Там вся базовая математика на C/C++ вкомпилирована в движок. И большинство пакетов тоже написаны на С++, иначе результатов вычислений не дождешься.

Если бы R был интерпретатором в базовых/системных функциях, он бы отставал от MQL5 в 200-500 раз. Мы специально тестировали системные C/C++ функции R, а не строили ручную обработку в циклах (там мгновенный проигрыш в сотни раз у R).

В R разработках постоянно идет поиск "как бы мне пакет найти, чтобы не писать for/while/foreach цикл". Фактически есть только один метод ведения расчетов в R - это передача любых более-менее массивных расчетов в сторонние пакеты.


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

Качественным отличием R от МКЛ состоит в том, что элементарным объектом в МКЛ является скаляр, из которых составляются более сложные объекты, например вектора. Именно вектора подаются на вход функций распределения.

Посмотрите в /include/math/stat каталог на сотни векторных функций.


В R вообще отсутствует понятие "скаляр". Простейшим объектом является вектор. R широко эксплуатирует это обстоятельство и в нашем примере по сравнению функций распределения в коде R совершенно явно просматривается такой прим программирования, специфичный для R, как "векторизация", что недоступно в МКЛ. Так как это специфический прием в R, который ускоряет вычисления 10-100 раз (в зависимости от размеров матрицы), то код для R должен был бы содержать именно этот прием. Применение векторизации очевидно, так как в тестах берется входной вектор и 100 раз производятся вычисления над ним, т.е. это матрица с одинаковыми, а можно сделать что с разными столбцами. 

Нет никакой векторизации и никаких современных возможностей в R. Там код просто в лоб написан обычными джуниорами от программирования. Да, математики они приличные, но вот программисты посредственные.

GPU в R остаются исключительно сказками и единичными попытками в редчайших пакетах. 


Если обобщить сказанное: текст на R должен быть написан на R с использованием его возможностей, особенно при их отсутствии аналогов в МКЛ.

Вы просто не знаете ни R, ни MQL5.

Вы не смотрели исходники R, не знаете исходников MQL5. Не строили компиляторов последние 15 лет. Но пытаетесь спорить с теми, кто это все сделал.

 

На текущий момент в статистической библиотеке MQL5 (без учета Alglib, Fuzzy) уже больше 461 функции: https://www.mql5.com/ru/forum/86386/page222#comment_3867386

Это уже хорошо покрывает базовые статистические функции.


Кто читал статью раньше, рекомендую ее снова прочесть - вчера выпустили новую редакцию статьи с массой новых функций.
Машинное обучение: теория и практика (торговля и не только)
Машинное обучение: теория и практика (торговля и не только)
  • www.mql5.com
Добрый день всем, Знаю, что есть на форуме энтузиасты machine learning и статистики...
 
Renat Fatkhullin:

На текущий момент в статистической библиотеке MQL5 (без учета Alglib, Fuzzy) уже больше 461 функции: https://www.mql5.com/ru/forum/86386/page222#comment_3867386

Это уже хорошо покрывает базовые статистические функции.


Кто читал статью раньше, рекомендую ее снова прочесть - вчера выпустили новую редакцию статьи с массой новых функций.

Так и не понял, как пуш-сообщение послать Quantum. Добавьте, пожалуйста, вещь, которой, возможно, даже нет в R.

Это быстрый расчет Mean интервала при сдвиге его на единицу вправо. Аналогично - расчет коэффициента корреляции Пирсона.

Пирсон довольно тяжело считается, если в лоб. Но существуют итерационные методы расчета: K[i]  через K[i-1].

 

ЗЫ Прикольно, первый раз столкнулся с предложением на русском языке, где после каждого слова идет запятая:

Добавьте, пожалуйста, вещь, которой, возможно, нет.

 

А почему сами не напишите себе нужную функцию?

Посмотрите на полные исходники функций в /include/math/stat и напишите недостающие.

 
Renat Fatkhullin:

Нет никакой векторизации и никаких современных возможностей в R. Там код просто в лоб написан обычными джуниорами от программирования. Да, математики они приличные, но вот программисты посредственные.

Вы просто не знаете ни R, ни MQL5. 

Вы не смотрели исходники R, не знаете исходников MQL5. Не строили компиляторов последние 15 лет. Но пытаетесь спорить с теми, кто это все сделал.

У меня очень скромные познания в программировании, но не до такой степени, как Вы описали.

Во всяком случае я прекрасно понимаю, что внутренняя реализация R на С++, на которую Вы ссылаетесь, вообще не имеет отношения к поднятой мною  проблеме измерения скорости выполнения. Я пишу о технике написания кода собственно на R, а что внутри, то и меряем.

 

Итак, по поводу векторизации. 

В R нормально выглядит строка

с <- a+b

Это всегда, как минимум, векторные вычисления. Зависит от контекста - что такое а и b.

Более того,

c <- sqrt(a)

даст вектор с, каждый элемент которого является корнем квадратным из соответствующего элемента вектора а 

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

В МQL это всегда циклы.  

Более того векторизация в R подразумевает не только сами объекты, но:

  • процедурный аппарат в виде специфических операторов apply и его разновидностей
  • использование стандартной библиотеки MKL для совершения  всех этих векторизированных операций.

 

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

Я вообще ничего не пишу о качестве реализации функций на C++. Я как и Вы предлагаю их мерить такими как они есть. Но с использованием средств языка R, которые специально предназначены для векторных операций. 

 

Например.

Для всех Ваших тестов образуем матрицу M со 100 (как у Вас) , где каждый столбец моделирует котировку

 

Тогда на R минимум по всем столбцам выглядит как

apply(M,  2, min)

Результат будет вектор, который будет содержать минимум по каждому столбцу 

 

 

По этому образцу надо мерить скорость всех функций распределения, обернутых в соответствующую apply. Их много и они разные. Аналогов в МКЛ нет.

При этом надо проследить чтобы вместе с R была установлена библиотека MKL

Intel® Math Kernel Library (Intel® MKL) | Intel® Software
  • software.intel.com
Intel® Math Kernel Library (Intel® MKL) accelerates math processing routines that increase application performance and reduce development time.
 
Renat Fatkhullin:

А почему сами не напишите себе нужную функцию?

Посмотрите на полные исходники функций в /include/math/stat и напишите недостающие.

Интересная мысль.

Может быть найдется исполнитель по портированию  пакетов. Например, splines. Получили высшего качества машки, настоящие. 

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

У меня очень скромные познания в программировании, но не до такой степени, как Вы описали.

Во всяком случае я прекрасно понимаю, что внутренняя реализация R на С++, на которую Вы ссылаетесь, вообще не имеет отношения к поднятой мною  проблеме измерения скорости выполнения. Я пишу о технике написания кода собственно на R, а что внутри, то и меряем.

К сожалению, вы даже понятия не имели, что внутри R все на C/C++. Вы однозначно думали, что это интерпретатор даже в системных функциях.


Итак, по поводу векторизации. 

В R нормально выглядит строка

с <- a+b

Это всегда, как минимум, векторные вычисления. Зависит от контекста - что такое а и b.

Более того,

c <- sqrt(a)

даст вектор с, каждый элемент которого является корнем квадратным из соответствующего элемента вектора а 

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

В МQL это всегда циклы.  

Мы показали, как быстрей работаем в циклах. Причем в чистых исходниках на MQL5 без применения С++.

И простейший векторный sqrt мы тоже победим. Вот из библиотеки две штатные функции с полным аналогом R:

bool MathSqrt(double &array[])                           // результат в тот же вектор кладется
bool MathSqrt(const double &array[],double &result[])    // результат в отдельный вектор
Сравнивайте.

Вы еще не совсем поняли, что в этих 461 функциях стандартной математической библиотеке MQ5 огромное покрытие базовых математических операций.


Более того векторизация в R подразумевает не только сами объекты, но:

  • процедурный аппарат в виде специфических операторов apply и его разновидностей
  • использование стандартной библиотеки MKL для совершения  всех этих векторизированных операций.

Да, да. Теоретически.

А 99% всех операций вы делаете исключительно в простейших функциях без шанса на ускорение.

В MQL5 OpenCL вообще штатный и можете без сторонних библиотек все ускорить. Причем в обычном MQL5 вы можете получать результат на уровне С++.

А в R единственный вариант - искать пакет под ускорение каждого цикла. Да, именно каждого, если он хоть что-то из себя представляет по количеству итераций.


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

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

Мало кто понимает, но скорее всего при использовании MKL будет сказочный оверхед на перекладывании входных данных R в обычные массивы, на которых отработает MKL, а потом результат снова надо будет переложить во внутренний формат представления данных R.

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

В MQL5 таких потерь нет вообще, конечно. Только в OpenCL нужно копировать данные, но там простой и плоский memcopy.

 
Renat Fatkhullin:

А почему сами не напишите себе нужную функцию?

Написал когда-то, только не оформлял, как мат. функцию.

Посмотрите на полные исходники функций в /include/math/stat и напишите недостающие.

Вопрос в помещении в стандартную библиотеку с научным и программистким причесыванием, как это делает Quantum. 

Скорее всего, надо будет сделать сравнение по производительности c вашим решением. Тогда, думаю, получится убедить поместить велосипед в мат. библу. Сам такого в мат. пакетах не видел (за R не возьмусь утверждать).

 

Еще небольшой секрет - почему MQL5 такой быстрый, особенно когда библиотеки полностью в исходниках.

Наш компилятор занимается настолько глубокой оптимизацией и имеет возможность столько проверок и условий отсекать, что функции пропадают начисто, а циклы упрощаются донельзя. Конечно, только для x64 версии.

В отличии от использования библиотек/пакетов(где нельзя даже вызов оптимизировать) другими системами, компилятор MQL5 почти всегда работает с полным исходным кодом и всегда проводит глобальную оптимизацию на максимальную глубину. Это дает потрясающие результаты.

Поэтому для нас важно предоставлять все стандартные библиотеки в исходниках. Мы знаем, что в финале все будет заоптимизировано так, что по скорости можно победить почти всех. И даже оверхед на managed язык уже не так сильно влияет.