Нейронная сеть и алгоритм (ы), предсказывающие будущие результаты прошлого
Я работал над алгоритмом, где мне дали некоторый вклад, и мне дается вывод для них, и, учитывая вывод в течение 3 месяцев (дайте или возьмите), мне нужен способ найти/рассчитать, что может быть будущим выходом.
Теперь эта проблема может быть связана с фондовой биржей, нам даются полномочия и определенные результаты, и нам нужно найти следующий.
Я наткнулся на предсказание фондового рынка нервной сети, вы можете Google его, или вы можете прочитать об этом здесь, здесь и здесь.
Чтобы начать работу над созданием алгоритма, я не мог понять, какова должна быть структура слоев.
Данное ограничение:
- Выход всегда будет целым.
- Выход всегда будет от 1 до 100.
- Нет точных данных, например, как на фондовом рынке, мы просто знаем, что цена акций будет колебаться между 1 и 100, поэтому мы можем (или нет?) рассматривать это как единственный вход.
- У нас есть запись за последние 3 месяца (или более).
Теперь, мой первый вопрос: сколько узлов я беру для ввода?
Вывод только один, отлично. Но, как я уже сказал, должен ли я взять 100 узлов для входного слоя (учитывая, что цена акций всегда будет целочисленной и всегда будет равна 1 и 100?)
Как насчет скрытого слоя? Сколько там узлов? Скажем, если я тоже принимаю 100 узлов, я не думаю, что это сильно обучило бы сеть, потому что я думаю, что для каждого входа нам нужно также учитывать все предыдущие входные данные.
Скажем, мы вычисляем вывод на 1-й день 4-го месяца, у нас должно быть 90 узлов в скрытом/среднем слое (для каждого случая каждый месяц составляет 30 дней). Теперь есть два случая
- Наш прогноз был правильным, и результат был таким же, как мы и предсказывали.
- Наш прогноз не удался, и результат был иным, чем мы предсказали.
В любом случае, теперь, когда мы вычисляем вывод на 2-й день 4-го месяца, нам нужны не только эти 90 входов, но и последний результат (а не предсказание, будь то то же самое!) тоже, поэтому теперь мы имеем 91 узел в нашем среднем/скрытом слое.
И так далее, он будет увеличивать количество узлов каждый день, AFAICT.
Итак, мой другой вопрос: как определить/установить количество узлов в скрытом/среднем слое, если оно динамически меняется.
Мой последний вопрос: есть ли какой-нибудь другой конкретный алгоритм там (для этого рода вещей/вещей), о котором я не знаю? Что я должен использовать вместо того, чтобы возиться с этой нейронной сетью?
Наконец, есть ли что-нибудь, что я мог бы упустить, что могло бы заставить меня (а скорее я должен сделать algo) предсказать выход, я имею в виду любые оговорки или что-нибудь, что может заставить его пойти не так, как я мог бы не заметить?
Ответы
Ответ 1
В ответ на ваш вопрос можно многое рассказать. Фактически, ваш вопрос затрагивает проблему прогнозирования временных рядов в целом и приложение нейронных сетей для этой задачи. Я пишу здесь только несколько наиболее важных ключей, но, прочитав это, вы должны, возможно, заглянуть в результаты Google для запроса time series prediction neural network
. Существует множество работ, в которых принципы подробно описаны. Также существуют различные программные реализации (с исходными кодами) (вот только один из примеров с кодами в С++).
1) Я должен сказать, что проблема составляет 99% от предварительной обработки данных и выбора правильных факторов ввода/вывода, и только 1% от конкретного инструмента для использования, будь то нейронные сети или что-то другое. Как и в качестве примечания, нейронные сети могут внедрять большинство других методов анализа данных. Например, вы можете использовать нейронную сеть для анализа основных компонентов (PCA), которая тесно связана с SVD, упомянутая в другом ответе.
2) Очень редко значения ввода/вывода строго соответствуют определенному региону. Данные реальной жизни могут считаться неограниченными по абсолютным значениям (даже если его изменения, похоже, создают канал, его можно разбить только через мгновение), но нейронная сеть может работать только в стабильных условиях. Вот почему данные, как правило, сначала преобразуются в приращения (путем вычисления дельтами между i-й точкой и i-1 или принятия log
из их отношения). Я предлагаю вам сделать это с вашими данными в любом случае, хотя вы заявляете его внутри региона [0, 100]. Если вы этого не сделаете, нейронная сеть, скорее всего, перейдет в так называемый наивный предиктор, который производит прогноз с каждым следующим значением, равным предыдущему.
Затем данные нормируются на [0, 1] или [-1, +1]. Второй подход подходит для случая предсказания временных рядов, где +1 обозначает движение вверх, а -1 - вниз. Используйте функцию активации гипертанов для нейронов в вашей сети.
3) Вы должны подавать NN с входными данными, полученными из sliding window
дат. Например, если у вас есть данные за год, а каждый день - день, вы должны выбрать размер окна - скажем, месяц - и сдвигать его изо дня в день, из прошлого в будущее. День, который находится справа от окна, является целевым выходом для NN. Это очень простой подход (есть намного сложнее), я упоминаю это только потому, что вы спрашиваете, как обращаться с данными, которые постоянно поступают. Ответ: вам не нужно менять/расширять свой NN каждый день. Просто используйте постоянную структуру с фиксированным размером окна и "забудьте" (не предоставляйте NN) самую старую точку. Важно, чтобы вы не обрабатывали все данные, которые у вас есть как один вход, но делите его на множество небольших векторов и обучите NN на них, поэтому сеть может обобщать данные и находить регулярность.
4) Размер скользящего окна - это ваш размер ввода NN. Выходной размер равен 1. Вы должны играть со скрытым размером слоя, чтобы найти лучшую производительность. Начните со значения, которое имеет значение между входом и выходом, например sqrt (in * out).
Согласно последним исследованиям, Рекуррентные нейронные сети работают лучше для задач прогнозирования временных рядов.
Ответ 2
Я согласен со Стэном, когда он говорит
1) Я должен сказать, что проблема составляет 99% от предварительной обработки данных
Я применил Neural Networks в течение более 25 лет к различным аэрокосмическим приложениям, включая управление полетом вертолета - настройка набора данных ввода/вывода - это все - все остальное вторично.
Я удивлен, в комментарии smirkman, что Neural Networks были быстро сброшены, "поскольку они ничего не дали", - это говорит мне, что тот, кто работал с Neural Networks, имел мало опыта с ними.
Учитывая, что в этой теме обсуждается прогнозирование фондового рынка нейронной сети - я скажу, что я заработал. Результаты тестов можно загрузить с моего сайта по адресу www.nwtai.com.
Я не отдаю, как это было сделано, но есть достаточно интересных данных, которые должны заставить вас более серьезно исследовать с помощью Neural Networks.
Ответ 3
Эта проблема была особенно хорошо исследована тысячами людей, которые хотели выиграть 1M $приз NetFlix.
Ранее заявки часто основывались на K Nearest Neigbours. Более поздние представления были сделаны с использованием Разделение сингулярного значения, Поддержка векторных машин и Стохастический градиентный спуск. Победитель использовал смесь нескольких методов.
Чтение отличных форумов сообщества даст вам много информации о лучших методах предсказания будущего из прошлого. Вы также найдете множество исходного кода для разных методов.
Интересно, что нейронные сети были быстро сброшены, так как они ничего не дали (и мне лично еще предстоит увидеть, что нетривиальные NN производят что-то ценное).
Если вы начинаете, я бы предложил SVD как первый путь; это довольно легко сделать и часто дает удивительное понимание данных.
Удачи!