Выглядит прикольно :)
А вот что это, и как использовать, надо разобраться еще :)
Выглядит прикольно :)
А вот что это, и как использовать, надо разобраться еще :)
использовать можно как первый скрытый слой - для снижения размерности или собственно кластеризации, можно в вероятностных сетях, ну и куча других вариантов.
Спасибо за материал!
На досуге попытаюсь осилить :)
Спасибо за новую статью об интересном сетевом методе. Если порыться в литературе, их там десятки, если не сотни. Но проблема у трейдеров не в отсутствии иснтрументов, а в правильном их использовании. Статья была бы ещё интереснее если бы она содержала пример использования этого метода в советнике.
Спасибо за новую статью об интересном сетевом методе. Если порыться в литературе, их там десятки, если не сотни. Но проблема у трейдеров не в отсутствии иснтрументов, а в правильном их использовании. Статья была бы ещё интереснее если бы она содержала пример использования этого метода в советнике.
1. Статья хорошая. Изложено доступно, код не сложный.
2. К недостаткам статьи можно отнести то, что совсем ничего не сказано про входные данные для сети. Можно было написать пару слов о том, что подается на вход - вектор котировок за период/данных индикатора, вектор отклонений цены, нормализованные котировки или что-то еще. Для практического использования алгоритма, вопрос исходных данных и их предподготовки является ключевым. Я рекомендую использовать для таких алгоритмов вектор относительных изменений цены: x[i]=price[i+1]-price[i].
Кроме того, предварительно, входной вектор можно нормализовать(x_normal[i]=x[i]/M), для чего, в качестве M можно использовать максимальное отклонение цены за рассматриваемый период (здесь и далее для краткости не пишу объявления переменных):
M=x[ArrayMaximum(x)]-x[ArrayMinimum(x)];
В этом случае, все входные векторы будут лежать в единичном гиперкубе со стороной [-0.5,0.5], что существенно увеличит качество кластеризации. В качестве M также можно использовать стандартное нормальное отклонение или любые другие усредняющие величины по относительным отклонениям котировок за период.
3. В качестве расстояния между вектором весов нейрона и входным вектором в статье предлагается использовать квадрат нормы разности:
for(i=0, sum=0; i<m; i++, sum+=Pow(x[i]-w[i],2));
На мой взгляд, эта функция расстояния не эффективна, в данной задаче кластеризации. Более эффективной является функция вычисляющая скалярное произведение или нормализованное скалярное произведение, то есть косинус угла между вектором весов и входным вектором:
for(i=0, norma_x=0, norma_w=0; i<m; i++, norma_x+=x[i]*x[i], norma_w+=w[i]*w[i]); norma_x=sqrt(norma_x); norma_w=sqrt(norma_w); for(i=0, sum=0; i<m; i++, sum+=x[i]*w[i]); if(norma_x*norma_w!=0) sum=sum/(norma_x*norma_w);
Тогда в каждом кластере будут сгруппированы векторы похожие друг на друга направлениями колебаний, но не величиной этих колебаний, что существенно уменьшит размерность решаемой задачи и повысит характеристики распределений весов обученной нейросети.
4. Было правильно замечено, что необходимо определить критерий останова обучения сети. Критерий останова должен определить необходимое число кластеров обученной сети. А оно (число), в свою очередь, зависит от общей решаемой задачи. Если задача в прогнозировании временного ряда на 1-2 отсчета вперед, и для этого будет использован, например, многослойный персептрон, то количество кластеров не должно сильно отличаться от количество нейронов входного слоя персептрона.
В целом, количество баров в истории не превосходит 5 300 000 на самом подробном минутном графике (10 лет*365 дней*24 часа*60минут). На часовом графике - 87 000 баров. То есть создание классификатора с числом кластеров более 10000-20000 уже не оправдано из-за эффекта "переобученности", когда на каждый вектор котировок приходится свой отдельный кластер.
Прошу прощения за возможные ошибки.
1. Спасибо, для вас старался:)
2. Да, согласен. Но все таки входы - это отдельная большая проблема, по которой самой по себе можно не один десяток статей написать.
3. А вот здесь не соглашусь полностью. В случае нормализованных входов сравнение скалярных произведений эквивалентно сравнению евклидовых норм - разверните формулы.
4. Поскольку максимальное число кластеров и так уже один из параметров алгоритма
max_nodes
то я бы действовал, например, так: измеряем ошибку победителя на N последних шагах и оцениваем каким-либо образом ее динамику (например, измеряем наклон регрессионной прямой) Если ошибка изменяется мало, то останов. Если же ошибка все еще уменьшается, а данные для обучения уже закончились, то стОит подумать об их сглаживании с целью подавления шумов, или каким-то образом устранить дефицит примеров.
3. Не понял, где эквивалентность формул. Формула косинуса угла между векторами (x,w)/ (|x||w|) "не очень" похожа на |x-w|^2. Нормализация входов не меняет принципиальных различий этих мер:
эквивалентность в том, что максимум расстояния всегда соответствует минимуму скалярного произведения и наоборот. Связь в случае нормализованных векторов взаимно однозначная и монотонная, поэтому что вычислять - квадрат расстояния или угол, неважно.
Но достаточно старая - в компилятор внесли изменения и сейчас код выдает ошибки и предупреждения!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Растущий нейронный газ - реализация на языке программирования MQL5:
В статье приводится пример написания на языке MQL5 программы, реализующий адаптивный алгоритм кластеризации, называемый "Растущий нейронный газ" (Growing neural gas, GNG). Статья рассчитана на пользователей, изучивших документацию к языку, а также уже имеющих определенные навыки программирования и базовые знания в области нейроинформатики.
Автор: Алексей