Блог им. SciFi

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

    • 23 апреля 2017, 20:48
    • |
    • SciFi
  • Еще
Разобрался в том, как обучить нейронную сеть чему-то и решил поделиться этим. В первой части расскажу о том, как я научил нейронную сеть вычислять косинус угла. Во второй части — как использовать нейронные сети в трейдинге. Первая часть позволит лучше разобраться в минусах и плюсах нейронных сетей, что улучшит понимание их применения в трейдинге.

Я взял 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)


★9
30 комментариев
А как она вычисляет если она не знает ЧТО вычислять?))
avatar
Суслик, сначала ты ее обучаешь и она узнает, какие действия она должна совершить, чтобы выдать правильный результат.
avatar
SciFi, слишком большое число данных может тоже ухудшить результат.

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

Евгений Унеговский, ну я читал, что метод опорных векторов пока побеждает нейронные сети при машинном обучении в трейдинге по популярности, так как он проще и эффективнее
avatar
SciFi, а нельзя ей показать график доллара и показать ровную восходящую линию. и сказать «торгуй чтобы вот так вот было»?)
avatar
Суслик, хорошая идея, попробую
avatar
SciFi, и что, это прямо реально? 
avatar
Суслик, показать ровную восходящую линию еквити и сказать «торгуй чтобы вот так вот было»  :)
Евгений Унеговский, или нисходящую и сказать — делай че хочешь  чтобы только так не было)
avatar
Суслик, хотя я примерно это и делаю, только по другому формулирую правило обучения: на выходе — реальные доходности, к которым нужно стремиться, на входе — предикторы. 
avatar
SciFi, думаю его надо направить на путь истиный все же. Объяснить основные принципы. Убытки резать безжалостно, прибыль не обрезать, комиссию экономить. Можно показать опционы, сказать можешь не резать позу но будет линейный распад…
avatar
Суслик, это уже не нейронная сеть, а структурное программирование)   Зато нейронная сеть может по температуре в Санкт-Петербурге курс доллара на следующий день предсказывать
Суслик, это слишком сложно. Всегда есть сколько угодно сложный способ решить простую задачу. Вопрос в том, как наиболее простым и гениальным способом научиться прогнозировать движение цены в ближайшее время. Этого достаточно, чтобы начать зарабатывать на рынке.
avatar
SciFi, обучаешь тупо сопоставляя каждое случайное число и вычисленное для него значение косинуса?

Николай Скриган, да, рандомные числа
avatar
SciFi, Вывод должен быть один все системы опирающиеся на историю и обученные по правой стороне графика (т.е. на истории) не работоспособны и обречены на провал т.к. рынки не имеют памяти.

avatar
Евгений, я и многие другие верят, что имеют. Я помню, сколько стоил доллар в прошлый раз, когда взлетал в космос — в районе 84. Я помню, а значит, рынок помнит, так как я часть рынка.
avatar
SciFi, я не про то, каким образом берется число, а про то, что для него вычисляется косинус и дается сети для обучения.
Николай Скриган, да, косинус для обучающей выборки вычисляется классическим способом (вызовом стандартной функции)
avatar
Ничего она не вычисляет, она просто отбирает деньги у спекулей и отдает хитрым программистам. Караул, нас грабят!
avatar
хочу повторить, но язык R не изучал.  Владею только C# 
avatar
Арсений Овсянников, этих языков как грязи) То ли дело раньше — был один ассембелер — все ясно и понятно)
avatar
Арсений Овсянников, R легкий, если не писать свои функции и не углубляться, а только использовать готовые. Я использую пока только готовые, их хватает, так как их тонны.
avatar
Круто, не могу найти материалы на обучение R((
dmitr66, есть много сайтов, я по ним учился. Вот, например: http://www.rfortraders.com/

Купил пару книг и скачал тонны электронных книг, но особо не читал. Хватает вполне того, что есть в интернете. Важно не просто изучать R, а решать на нем свои задачи, так быстрее научитесь, в процессе экспериментов с кодом.
avatar
Смогут ли словить нейронные сети волну Эллиотта?
avatar
Андрей Зуев, не смогут. Это субъективная теория. То же что и ловить  какой-нибудь индикатор.
Андрей Зуев, можно научить, я думаю, волны Эллиота распознавать, создав базу для обучения. Но наша конечная цель — распознавать будущее движение. И волны Эллиота здесь будут лишним промежуточным этапом. 
avatar
+++
avatar

теги блога SciFi

....все тэги



UPDONW
Новый дизайн