Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 211

 
Renat Fatkhullin:

1) К сожалению, вы неполно сформулировали вопрос и получили непроработанный и краткий вежливый ответ "это не имеет значения".

Вы хотели получить ответ "так договорились/convention", сформулировав его в самом вопросе. Но Дункан ушел от ответа "что есть правильно" в первый раз, а во второй раз повторил его.

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


3) Наша позиция:

выражение для dgamma

(x)= 1/(s^a Gamma(a)) x^(a-1) e^-(x/s)

for x ≥ 0, a > 0 and s > 0


в точке 0 является неопределенным.

В R считают, что можно включать эту точку в расчет, но при этом взять предельные значения, даже если они равны бесконечности как в случае dgamma(0,0.5,1).

Однако, если рассчитывать вероятности с учетом бесконечности в нулевой точке, все интегралы от dgamma формально становятся бесконечными и по этой логике pgamma должна быть равна бесконечности для всех значений x.

Однако это противоречит результатам pgamma, где все значения оказываются конечными. Они правильные, будто в точке x=0 считается что плотность =0.

1) Да, я не получил развернутого ответа. Хотя подводил под это... Я не навязываю своего мнения, спорить тоже устал, если честно. Обращу ваше внимание, что слова этого человека почти дословно совпали с нашим изначальным посылом. Как определить в крайней точки плотность не важно, главное, чтобы правильно считались интегралы: 

Заявляем, что строго говоря, плотность гамма распределения в точке ноль не определена. А при взятии предела справа плотность равна единице.

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

 2) Про точность разговор даже не велся с моей стороны. Плотность в точке ноль - это не про точность; это про то, как вы ее выведете в результате работы функции - несходимость (NaN) или приравняете к пределу или к нулю. Главное, что это не важно для расчета интеграла. 

3)  Перечитал исправленный текст статьи. И я рад, что ошибкой поведение dgamma вы решили не считать. 

Но вот это :

все интегралы от dgamma формально становятся бесконечными и по этой логике pgamma должна быть равна бесконечности для всех значений x.

 странно, Ренат.

pgamma в принципе не может быть бесконечной, так как ингеграл ограчена сверху значением 1.

Возьмем нормальное распределение. Оно определено на [-inf,+inf]. Интеграл функции распределения = 1 на всем этом промежутке. Но как-то получается, что суммирование (интегрирование) плотности на бесконечно большом саппорте не выливается в бесконечную сумму. Хотя плотность на всем саппорте != 0 ни в какой области.

А для dgmamma точка x ==0 с ее плотностью == inf (а кстати, вы никак не обошли вниманием случай, где плотность стремиться к 1 в этой точке и какие из этого вы делаете выводы об интегрировании...) как часто встречается? Скажу - никак. Вероятность реализации случ.величины любой точке == 0 в любом непрерывном распределении... Это знают все статистики. Плотность считается приближением вероятности к бесконечно малой области вокруг x.

Из этого факта следует, что какая бы огромная плотность ни была в крайней точке, ее влияние на полный инграл  = 0. Подумайте...

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

Спасибо. 

 

R - потрясающая система, которая лично мне открыла глаза на то, как далеки мы были в MetaTrader/MQL от реальных потребностей "сделать сложные вычисления просто и прям сейчас".

У нас (С++ девелоперов) в крови подход "все можете сделать сами, а мы даем низкоуровневую базу и скорость вычислений". Мы фанатично относимся к производительности и у нас получается - MQL5 на 64 битах великолепен.

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

Поэтому мы сделали резкий поворот и начали апгрейд MetaTrader 5:

  • включили ранее переписанные математические библиотеки Alglib и Fuzzy в стандартную поставку, покрыли юнит-тестами
  • разработали аналог статистических функций из R, провели исследования и покрыли тестами. работа еще продолжается и библиотека расширяется
  • разработали первую бета-версию графической библиотеки Graphics как аналог plot в R. добавили однострочные функции для быстрого вывода
  • начали менять интерфейсы в окнах вывода терминала, чтобы можно было оперировать табличными данными. сменили направление вывода, добавили отключение лишних колонок, заменили шрифт на моноширинный в окне вывода экспертов
  • добавили мощную функцию ArrayPrint для автоматической распечатки массивов, включая структуры
  • добавили функции FileLoad и FileSave для быстрой записи/чтения массивов на диск


Конечно, мы в начале пути, но уже понятен правильный вектор приложения сил.

 

 

7 шагов при интегрировании это конечно мало. Вот 1000: 

> pgamma(0.8, 0.5, 1)
[1] 0.7940968

#а теперь велосипедное интегрирование:
> integration_steps <- seq(0, 0.8, length.out=1001)
> integration_result <- 0
> for(i in 2:length(integration_steps)){
+ integration_result <- integration_result + dgamma(integration_steps[i], 0.5, 1) * (integration_steps[i] - integration_steps[i-1])
+ }
> integration_result
[1] 0.7709089
#погрешность ~0.02, но тут способ уже проще некуда, и так сойдёт :) . Бесконечность при x=0 не мешает.
 
Alexey Burnakov:

1) Да, я не получил развернутого ответа. Хотя подводил под это... Я не навязываю своего мнения, спорить тоже устал, если честно. Обращу ваше внимание, что слова этого человека почти дословно совпали с нашим изначальным посылом.

Это был вежливый ответ без деталей и проверки. И ответ не совпал с Wolfram Alpha и Matlab, что является проблемой.

Уходить в сторону не надо - корневой вопрос был четко обозначен.

 
Dr.Trader:


#погрешность ~0.02, но тут способ уже велосипедней некуда, и так сойдёт :) . Бесконечность при x=0 не мешает.

Проинтегрируйте функцию 1/x, от 0 до 1, включая граничные точки и сравните с результатом аналитических расчетов.

Wolfram говорит что интеграл не сойдется из-за сингулярности в точке x=0.

 
Quantum:

Проинтегрируйте функцию 1/x, от 0 до 1, включая граничные точки и сравните с результатом аналитических расчетов.

С тем-же кодом - 7.485471. R дошёл до 76.3342 и сказал что дальше не пойдёт, и это не точный результат, и неправильный. Вольфрам просто сразу сказал что результат не сходится и ничего не ответил.
Правильный ответ я не знаю, сколько?

Только не говорите что раз интеграл 1/x не нашёлся, то и интеграл dgamma(x) тоже не найдётся. Обе эти функции хоть и стремятся к бесконечности при x -> 0+ , но стремятся они с разной скоростью, и эта скорость влияет на то можно ли найти интеграл. или нет

 

Есть функция -log(x). Она стремится в бесконечность при x->0. Можно и без минуса, тогда она будет стремится вниз, мне так неудобно.

И у неё находится интеграл от 0 до 1. Бесконечность не мешает.


 
Renat Fatkhullin:

R - потрясающая система, которая лично мне открыла глаза на то, как далеки мы были в MetaTrader/MQL от реальных потребностей "сделать сложные вычисления просто и прям сейчас".

...

Поэтому мы сделали резкий поворот и начали апгрейд MetaTrader 5:

  • включили ранее переписанные математические библиотеки Alglib и Fuzzy в стандартную поставку, покрыли юнит-тестами
  • разработали аналог статистических функций из R, провели исследования и покрыли тестами. работа еще продолжается и библиотека расширяется
  • разработали первую бета-версию графической библиотеки Graphics как аналог plot в R. добавили однострочные функции для быстрого вывода
  • начали менять интерфейсы в окнах вывода терминала, чтобы можно было оперировать табличными данными. сменили направление вывода, добавили отключение лишних колонок, заменили шрифт на моноширинный в окне вывода экспертов
  • добавили мощную функцию ArrayPrint для автоматической распечатки массивов, включая структуры
  • добавили функции FileLoad и FileSave для быстрой записи/чтения массивов на диск


Конечно, мы в начале пути, но уже понятен правильный вектор приложения сил.

R, как и многие другие ЯП, пока более удобен для машинного обучения по сравнению с MQL за счёт того, что в нём заведомо предусмотрен функционал для обработки данных в виде массивов. Дело в том, что выборка для машинного обучения - это чаще всего двумерный массив данных, а соответственно необходим функционал для работы с массивами:

  1. Вставка строк и столбцов в виде массивов меньшей размерности в другой массив
  2. Замена строк и столбцов в массиве в виде массивов меньшей размерности
  3. Удаление строк и столбцов из массива (например, для удаления малозначимых предикторов или примеров с явными "выбросами" из выборки).
  4. Деление массивов на части, в результате чего из исходного массива получаются два или более массивов, являющихся его частями (необходимо для деления выборки на обучающие и тестовые части или на большее количество частей, например для Wallking Forward).
  5. Случайное перемешивание строк и столбцов в массиве с равномерным распределением (необходимо, чтобы те или иные примеры из выборки попали в разные части, желательно равномерно распределившись по этим частям).
  6. Различные функции для обработки данных по отдельным строкам или столбцам (например, вычисление среднеарифметического значения по строке или по столбцу, дисперсии, или поиск максимального либо минимального значения в строке для последующей нормировки).
  7. И т.д. и т.п.

А пока в MQL не будет реализован вышеуказанный функционал необходимый для обработки выборок в виде массивов, то значительная часть разработчиков алгоритмов машинного обучения предпочтёт другие ЯП, в которых всё это уже давно имеется в наличии. Или будет пользоваться неприхотливым MLP (алгоритмом 60-х годов прошлого века) из библиотеки AlgLib, в котором, если мне не изменяет память, для удобства двумерные массивы представлены в виде одномерных.

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

 
Renat Fatkhullin:

R - потрясающая система, которая лично мне открыла глаза на то, как далеки мы были в MetaTrader/MQL от реальных потребностей "сделать сложные вычисления просто и прям сейчас".

У нас (С++ девелоперов) в крови подход "все можете сделать сами, а мы даем низкоуровневую базу и скорость вычислений". Мы фанатично относимся к производительности и у нас получается - MQL5 на 64 битах великолепен.

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

Поэтому мы сделали резкий поворот и начали апгрейд MetaTrader 5:

  • включили ранее переписанные математические библиотеки Alglib и Fuzzy в стандартную поставку, покрыли юнит-тестами
  • разработали аналог статистических функций из R, провели исследования и покрыли тестами. работа еще продолжается и библиотека расширяется
  • разработали первую бета-версию графической библиотеки Graphics как аналог plot в R. добавили однострочные функции для быстрого вывода
  • начали менять интерфейсы в окнах вывода терминала, чтобы можно было оперировать табличными данными. сменили направление вывода, добавили отключение лишних колонок, заменили шрифт на моноширинный в окне вывода экспертов
  • добавили мощную функцию ArrayPrint для автоматической распечатки массивов, включая структуры
  • добавили функции FileLoad и FileSave для быстрой записи/чтения массивов на диск


Конечно, мы в начале пути, но уже понятен правильный вектор приложения сил.

Это взвешенная и на удивление объективная оценка R. 

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

Конечно Вы в начале пути но в любом случае "прививки" от R усилят  МКЛ.

Удачи в Вашем нелегком деле. 

 

По поводу конвенций, о которых говорил Бурнаков.

Рассмотрим три совершенно разных случая.

1. Деление на константу, равную нулю.

В R мы имеем результат

> 1/0
[1] Inf

Правильный это результат?

Для интерпретатора - это результат следует считать правильным, так как по любому нельзя прекращать работу среды R

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

Заметим насколько отличается!

 

2. Деление на переменную, равную нулю.

> a<-0
> 1/a
[1] Inf

Строго говоря этот вариант отличается от предыдущего. 

Функция 1/а непрерывна везде, кроме а=0. причем в этой точке предел слева = -Inf, а предел справа  = +Inf.

R этого не понимает, но можно смириться так как различие между минус бесконечность и плюс бесконечность имеет смысл в математике, а не в программном коде


3. Деление двух бесконечно малых величин при их стремлении к нулю

> sin(a)/a
[1] NaN

Значение NaN вообще для меня не имеет объяснения. Но совершенно ясно с учетом п.2, что R не понимает пределов как таковых. 

Это ошибки R как системы программирования? Не знаю. Скорее всего в документации R надо было бы информировать о таких нюансах, но как это потом реализовать при децентрализованной разработке на данных момент около 130 000 функций? А нужно? 

 

Что из этого следует в смысле возникшей дискуссии?

На берегу  принимаются решения.

1. Берем R и тупо переносим в МКЛ код. При этом отдаем себе отчет, что перечисленные выше варианты в разных функциях R может иметь разное толкование

2. Объявляем соглашения какие значения будут приниматься в перечисленных мною (может быть список не полон) случаях. Тщательно проверяем код R и в случае не соответствия нашим установкам портируем из R в МКЛ с исправлениями согласно нами установленными соглашениями. При этом за счет централизации разработки последовательно выполняем принятые соглашения и в этом смысле имеем более качественную систему.