Рыночный этикет или правила хорошего тона на минном поле - страница 21
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пока творю - должен выглядеть, как художник! А вот когда кодирую ... :о)))
PS: Серега, конкретно в MathCAD практически монопенисуально, а вот в C++/ФОРТРАНЕ ... будет отличаться, но в MathCAD - мягко говоря нет (для этого конкретного случая). А если использовать mean, то считать будет еще быстрее, а если использовать, напимер, corr, то твой "быстрый" алгоритм будет черепашкой :о) Как они это делают, не знаю, но что касается оператора "суиммирования" - он на много быстрее цикла. Если у тебя не так - тогда ставь свежую версию.
Понятно.
Спасибо за информацию!
Не забывай, что всё это хозяйство на каждом отсчёте желательно дообучать - мало не покажется.
Теперь понял! Я то все комитеты в одной куче считал...
Увеличивать число нейронов в скрытом слое я не буду. Зачем, если и с двумя хорошо работает.
Если ты не против, хотелось бы перейти вплотную к ОРО, т.к. двухслойная сетка у меня уже готова и работает(даже с весами "от фонаря"), если интересно - могу выложить код.
Пока что сделал вот что:
d = 17;
w = 17*3 + 4 = 55;
P = 4*55*55/17 = 712;
------------------------------------------------------------------------
Алгоритм ОРО пока понял вот как (только для весов выходного слоя):
for(int i = cikl; i > 2; i--)
{
out = OUT(i); // Получаем выход сетки
target = (Close[i]-Close[i+1])/Close[i+1];--------------------// Получаем целевое значение
delta = target - out;-----------------------------------------// Вычитаем выход сетки из целевого значения
pr = th(out);-------------------------------------------------// Вычисляем производную выходного сигнала
pr = 1 - pr*pr;-----------------------------------------------//
for(int n = 0; n < 4; n++)
{
Corr[n] += delta * pr * D2[n];--------------------------------// Вычисляем ошибку для каждого веса и суммируем её за всю эпоху
Norm[n] += Corr[n]*Corr[n];-----------------------------------// Считаем норму вектора коррекций для каждого веса за всю эпоху
}
}
// ------------------------------------- КОНЕЦ ЭПОХИ --------------------------------------------------
// ----------------------------------- КОРРЕКЦИЯ ВЕСОВ ------------------------------------------------
for(i = 0; i < 4; i++)
W2[i] += Corr[i]/MathSqrt(Norm[i]);
Вроде все работает! Но что-то все же не так. За 1000 эпох все веса стали очень маленькими:
W2 [0] = 0.0876 W2 [1] = 0.0772 W2 [2] = -0.0424 W2 [3] = -0.05
Что я упустил и как теперь протолкнуть ошибку к входным весам?
Глянь личные сообщения. Извиняюсь что тут пишу. но они сообщения часто не отражаються.
Сергей, глянь личку.
to paralocus
Чуть позже отвечу.
Сейчас вожусь со своими входными данными для НС-ки - идея пришла в голову. Кстати, чего это ты при подсчёте длины обучающего вектора умножил число весов на 3? Я так понимаю, у тебя должно быть w=17+4 и всё! Ты же обучаешь каждого члена комитета своим персональным вектором...
...Кстати, чего это ты при подсчёте длины обучающего вектора умножил число весов на 3? Я так понимаю, у тебя должно быть w=17+4 и всё! Ты же обучаешь каждого члена комитета своим персональным вектором...
В данном случае входной вектор один и тот же. Он читается один раз на каждом отсчете, а потом каждый член комитета "смотрит" на него через свои персональные "очки"(веса) и выносит суждение.
Можно, конечно читать его для каждого члена комитета отдельно, но какой в этом смысл, если результат будет одним и тем же? Входной вектор это 16 последовательных приращений котира + единичный вход.
А... я понял! Да, раньше у меня было два разных вх. вектора: приращения котира с dt по ряду Фибо - 2,3,5,8... а другой по ряду Люка - 3,4,7,11... и членов комитета было всего 2. Тогда каждый член комитета читал свой вектор, но сейчас я все упростил, чтобы сосредоточиться на понимании ОРО. Так что, вектор, в данном случае, один.
А веса могли так уменьшиться из-за того. что я обучал только второй слой?
Ну, так всёравно получается: w=17+4 и каждому члену одинаковые вектора.
paralocus, я вот, что думаю. Давай ты не будешь бежать впереди телеги, а для затравки решишь на MQL-е двуслойный неленейный персептрон с неленейностью на выходе и получишь положительный результат. Затем перейдёшь к комитету сетей (если потребуется).
Что скажешь?
Ну, так всёравно получается: w=17+4 и каждому члену одинаковые вектора.
paralocus, я вот, что думаю. Давай ты не будешь бежать впереди телеги, а для затравки решишь на MQL-е двуслойный неленейный персептрон с неленейностью на выходе и получишь положительный результат. Затем перейдёшь к комитету сетей (если потребуется).
Что скажешь?
Ок! Т.е. берем и убираем всех коммисаров и председателя. Типа "бандитские пули"... -:) Щас сделаем!
P/S кроме одного - первого
Ну, тоды поехали!
1. находим ошибку на выходе последнего нейрона: d2out=X[-1]-OUT2, (в смысле нумерация как MQL и это "будущий" отсчёт).
2. пересчитываем её с учётом нелинейности на его вход: d2in=d2out*(1-OUT2^2)
3. Эта же самая ошибка уходит по своему аксону на выход каждого нейрона первого слоя! Теперь, это ошибка на его выходах - d1out и повторяем процедуру (2) пересчитывая на вход: d1[1]in=d1out*(1-OUT1[1]^2) и так же на второй нейрон скрытого слоя.
Нет.
Сначала считаем микрокоррекцию по каждому весу: dw=in*din - дельта правило - умножаем входной сигнал на приведённую к конкретному входу ошибку. И суммируем её в отдельном по каждомку весу сумматору на протяжении всех отсчётов обучающего вектора. В пределах одной итерации эпохи обучения веса не корректируются. Только накапливаются микрокоррекции и их квадраты (в другом сумматоре).
P.S. Постом выше откорректировал ошибку. Производная находится так: *(1-OUT2^2).