SciFi
SciFi личный блог
23 апреля 2017, 20:48

Вычисление косинуса угла с помощью нейронной сети на R

Разобрался в том, как обучить нейронную сеть чему-то и решил поделиться этим. В первой части расскажу о том, как я научил нейронную сеть вычислять косинус угла. Во второй части — как использовать нейронные сети в трейдинге. Первая часть позволит лучше разобраться в минусах и плюсах нейронных сетей, что улучшит понимание их применения в трейдинге.

Я взял 100 равномерно распределенных случайных чисел в промежутке от -4 до 4 Pi и научил по этим данным нейронную сеть, состоящую из 10 скрытых нейронов вычислять косинус угла. Вот что в итоге получилось, когда я вычислил 600 значений между -4 и 4 Pi. 
Вычисление косинуса угла с помощью нейронной сети на R
Не плохо, правда? Нейронная сеть не знает ничего о том, что такое косинус, она не знает, зачем он нужен, в чем его геометрический смысл, какое у него разложение Тейлора и тд. И тем не менее, она научилась его вычислять.

Выглядит сеть примерно так:
Вычисление косинуса угла с помощью нейронной сети на R



Затем я попробовал уменьшить количество значений в обучающей выборке в 5 раз до 20 чисел. Результат ухудшился:
Вычисление косинуса угла с помощью нейронной сети на R

Если поменять топологию сети и добавить нейроны, результат лучше не становится. Здесь 27-9-3 внутренних нейронов.
Вычисление косинуса угла с помощью нейронной сети на R
Выглядит такая сеть вот так:
Вычисление косинуса угла с помощью нейронной сети на R

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

Первая нейронная сеть, которая обучается по 100 значениям с 10 нейронами, плохо вычисляет значения за пределами обучающей выборки:
Вычисление косинуса угла с помощью нейронной сети на R

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

Выводы

Минусы:
— Если данных при обучении мало, усложнение сети бесполезно и нейронные сети работают плохо
- С новыми необычными данными нейронные сети не справляются

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


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


А вот код на R:
# ВЫЧИСЛЕНИЕ КОСИНУСА УГЛА С ПОМОЩЬЮ НЕЙРОННОЙ СЕТИ

#system.time(source('D:/Dropbox/R/MachineLearning/NeuralNetworks/Cosine.r'))
#Вызов этого скрипта

#install.packages('neuralnet')
library('neuralnet')
#Если ввести ?neuralnet можно узнать более подробную информацию

#dev.off()
#Очистка графиков

rm(list = ls())
# Очистка среды R от лишних переменных в памяти, если требуется

#Генерим случайные равномерно распределенные числа
#И сохраняем их в виде data frame
traininginput <-  as.data.frame(runif(100, min=-4, max=4))
trainingoutput <- cospi(traininginput)

#Создаем единую структуру из входящих и исходящих значений
trainingdata <- cbind(traininginput,trainingoutput)
colnames(trainingdata) <- c('Input','Output')

#Обучение нейронной сети
#Используем 10 внутренних нейронов
net.cos <- neuralnet(Output~Input, trainingdata, hidden=10, threshold=0.01)
#print(net.cos)

#Графическое представление сети
plot(net.cos)

testdata <- as.data.frame(runif(600, min=-4, max=4))
net.results <- compute(net.cos, testdata) #Run them through the neural network

#Свойства объекта net.results можно посмотреть так:
#ls(net.results)

#Результаты
#print(net.results$net.result)

#Результаты в виде таблицы, в которой видно теор. значение и вычисленное
cleanoutput <- cbind(testdata, cospi(testdata), as.data.frame(net.results$net.result))
colnames(cleanoutput) <- c('Input', 'Expected Output', 'Neural Net Output')
#print(cleanoutput)

#Ошибка нейронной сети
MSE.nn <- sum((net.results$net.result - cospi(testdata)) ^ 2) / nrow(testdata)
#print('Error:')
#print(MSE.nn)

#Построение графика по вычисленным с помощью нейронной сети значениям
testdata$cos <- net.results$net.result
colnames(testdata) <- c('Angle in Radians', 'Cosine')
plot(testdata)


30 Комментариев
  • Суслик
    23 апреля 2017, 21:15
    А как она вычисляет если она не знает ЧТО вычислять?))
      • Евгений Унеговский
        23 апреля 2017, 21:35
        SciFi, слишком большое число данных может тоже ухудшить результат.

        А что касается трейдинга — нейронные сети оказываются не очень-то эффективны. Может не так уж и повторяется история?
        Т.е. в половине случаев повторяется, в половине не повторяется?

      • Суслик
        23 апреля 2017, 21:47
        SciFi, а нельзя ей показать график доллара и показать ровную восходящую линию. и сказать «торгуй чтобы вот так вот было»?)
          • Суслик
            23 апреля 2017, 22:16
            SciFi, и что, это прямо реально? 
        • Евгений Унеговский
          23 апреля 2017, 22:16
          Суслик, показать ровную восходящую линию еквити и сказать «торгуй чтобы вот так вот было»  :)
          • Суслик
            23 апреля 2017, 22:17
            Евгений Унеговский, или нисходящую и сказать — делай че хочешь  чтобы только так не было)
          • Суслик
            23 апреля 2017, 22:19
            SciFi, думаю его надо направить на путь истиный все же. Объяснить основные принципы. Убытки резать безжалостно, прибыль не обрезать, комиссию экономить. Можно показать опционы, сказать можешь не резать позу но будет линейный распад…
            • Евгений Унеговский
              23 апреля 2017, 22:22
              Суслик, это уже не нейронная сеть, а структурное программирование)   Зато нейронная сеть может по температуре в Санкт-Петербурге курс доллара на следующий день предсказывать
      • neophyte
        24 апреля 2017, 06:32
        SciFi, обучаешь тупо сопоставляя каждое случайное число и вычисленное для него значение косинуса?

          • Евгений
            24 апреля 2017, 08:37
            SciFi, Вывод должен быть один все системы опирающиеся на историю и обученные по правой стороне графика (т.е. на истории) не работоспособны и обречены на провал т.к. рынки не имеют памяти.

          • neophyte
            24 апреля 2017, 10:07
            SciFi, я не про то, каким образом берется число, а про то, что для него вычисляется косинус и дается сети для обучения.
  • zidikaltus
    23 апреля 2017, 21:43
    Ничего она не вычисляет, она просто отбирает деньги у спекулей и отдает хитрым программистам. Караул, нас грабят!
  • Фима
    23 апреля 2017, 21:45
    хочу повторить, но язык R не изучал.  Владею только C# 
    • Суслик
      23 апреля 2017, 21:48
      Арсений Овсянников, этих языков как грязи) То ли дело раньше — был один ассембелер — все ясно и понятно)
  • Дмитрий Шихалев
    23 апреля 2017, 21:47
    Круто, не могу найти материалы на обучение R((
  • Андрей Зуев
    24 апреля 2017, 00:26
    Смогут ли словить нейронные сети волну Эллиотта?
    • Правильный трейдинг
      24 апреля 2017, 00:32
      Андрей Зуев, не смогут. Это субъективная теория. То же что и ловить  какой-нибудь индикатор.
  • Konstantin
    24 апреля 2017, 08:04
    +++

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн