Нейросети.

Тема в разделе "Нейросети", создана пользователем лёксус, 2 авг 2009.

  1. лёксус

    лёксус Активный пользователь

    Поделитесь полученным опытом?

    Я сегодня видел эту статью. Но качать материалы и разбираться не стал. Это уже будет для меня явный перебор. А статья действительно интересная.
     
  2. yu-sha

    yu-sha Активный пользователь

    Имею вопрос по саморганизующимся сетям Кохонена, которые работают без учителя
    Где и для чего это можно использовать в трейдерстве?
     
  3. лёксус

    лёксус Активный пользователь

    Карты Кохонена используются для классификации ограниченной совокупности (участка, объема, последовательности...) информации. Классификация отвечает на вопрос "похожести", т.е. одинаковый класс у разных (казалось бы) совокупностей говорит о том, что у таких совокупностей есть какой-то, объединяющий их, общий признак. В нашем случае такой совокупностью может быть группа свечек. И эту группу можно назвать более привычным для нас словом "паттерн" (или "кластер"). Зачем нам классифицировать паттерны? Затем, что выискивать самостоятельно паттерны, работа трудная и неблагодарная. А сеть справляется с этим сама и дает нам уже готовые ответы. А мы просто знаем, что основной характеристикой паттерна (теперь уже класса) является поведение рынка ПОСЛЕ этого паттерна (класса). Невооруженным глазом видно, что жить становится существенно легче. =)

    Вот пример из описания NSDT (один из вариантов применения классификации).

    <i>Cluster Indicators
    Индикаторы Cluster Indicators пытаются классифицировать текущее состояние рынка, то есть ответить на вопрос такого типа, как: к какому типу относится текущее состояние - хорошей возможности для открытия длинной либо короткой позиции (либо закрытия позиций), или , возможно, ничего делать не стоит. В основе индикаторов лежат самоорганизующиеся карты Кохонена (Kohonen Self Organizing Map), тренируемые генетическим алгоритмом.
    Предположим, у вас есть два хороших индикатора. Нанесем на плоскость точки, соответствующие некоторому временному периоду, взяв по осям значения этих двух индикаторов. Предположим, что ваши индикаторы настолько хорошо описывают состояние рынка, что в результате на плоскости образуются два хорошо различимых кластера: один соответствующий хорошей возможности для игры на повышение, другой для игры на понижение. Можно предположить, что в зависимости от того, насколько ваша точка близка к одному из кластеров, вы можете сделать выводы о характере динамики рынка в данный момент.
    Индикаторы Cluster Indicators информируют вас, насколько "далеко" текущее состояние находится от центров кластеров, соответствующих "повышательным" и "понижательным" кластерам. Вы можете использовать эти индикаторы в механических торговых стратегиях для генерирования сигналов покупки и продажи, когда они четко относят текущий паттерн к определенному классу. Вы можете также подавать эти индикаторы на вход нейронной сети.

    На графике изображены "повышательные" и "понижательные" кластеры для кластерного индикатора, построенного на основе индикаторов MACD и CCI.</i>
    clasters.png

    Ещё пример здесь <span class='inv'><![CDATA[<noindex>]]></span><a href="http://www.onix-trade.net/forum/go.php?http://www.tora-centre.ru/library/ns/spekulant03.htm" rel="nofollow" target="_blank">Задача номер один - поиск соседей</a><span class='inv'><![CDATA[</noindex>]]></span>
     
  4. yu-sha

    yu-sha Активный пользователь

    <!--fonto:Arial--><span style="font-family:Arial"><!--/fonto--><b><!--sizeo:3--><span style="font-size:12pt;line-height:100%"><!--/sizeo--><div align="center">Самоликбез по нейросетям. Урок №2. Саморганизующиеся сети Кохонена.</div><!--sizec--></span><!--/sizec--></b><!--fontc--></span><!--/fontc-->
    <blockquote>Насколько я усвоил из теории, для таких сетей учитель не требуется, а значит на вход мы будем подавать просто точки пространства (в нашем случае плоскости). Задача у сети одна - найти между точками нечто схожее и сгруппировать их в классы. Эта самая "схожесть" в классическом случае ни что иное, как близость расположения (евклидово расстояние).
    На какое количество классов разделять точки в пространстве - это наш выбор.
    Как поведет себя сеть, если количество классов будет маленьким, большим, очень большим? - попробую ответить на эти вопросы для конкретного случая.

    Исходный набор данных - это 301 пара точек на плоскости, сгруппированных достаточно "кучно" - по 100 точек в каждой группе.

    <div align="center"> kohonen0.PNG </div>

    Импортируем входные данные, получаем

    <div align="center"> kohonen4.PNG </div>
    Создаем "Самоорганизующуюся сеть Кохонена" с 2мя входами и N выходами.
    N - это максимальное количество классов, на которые сеть может разбить входные данные.
    Не забываем установить "Случайный выбор примеров" - в выборке данные идут по порядку.
    Вот настройки архитектуры (для начала выбрали 5 выходов/классов) и результаты после 10000 эпох:

    <div align="center"> kohonen1.PNG kohonen5_1.PNG </div>
    В процессе обучения можно открыть диаграмму разбивки по классам и наблюдать за происходящим
    Ближе к концу обучения сеть стабилизируется на 3х классах, но количество точек в них постоянно меняется в пределах примерно +/-10. Другими словами после 10001 эпохи диаграмма могла бы быть несколько иной.

    Применил сеть к .pat файлу, потом приписал результаты к файлу оригинала
    В итоге сеть ошиблась в 3х случаях из 300
    Результат можно считать очень хорошим
    -----------------------------------------------------------------
    При N=10 сеть "не сходится" при большом количестве эпох обучения. Если остановить тренировку в любом месте, то можно увидеть картину, совершенно не похожую на ту, что была 100 эпохами ранее
    Вот два примера распределения при количестве эпох обучения 10000 и 15000
    <div align="center"> kohonen10_1.PNG kohonen10_2.PNG </div>

    -----------------------------------------------------------------
    При N=3
    <div align="center"> kohonen3_1.PNG </div>

    </blockquote>

    Подведем первые итоги:
    Да, сети Кохонена как-то разбивают входные данные на классы
    При выборе количества классов нужно быть очень внимательным - это важный момент
    Но с другой стороны, если я знаю на какое количество классов надо разбить данные, то значит я уже имею какие-то критерии сравнения и могу попытаться выделить эти критерии.

    Возможно, при построении нейронных сетей имеет смысл попытаться проанализировать выборку сетью Кохонена с N=2,5,7,.. и уже, глядя на результаты, принимать решение (какое?)

    В общем и целом процесс понятен, но как это можно применить в торговле фин.инструментами пока не ясно. На уровне ощущений могу предположить, что этот метод можно как-то применять не к результирующей функции, а к набору входов других сетей для каких-то оценок. Но "как", "с какой стороны" и "о чем скажут результаты"?
    В общем пока для меня это - темный лес.
     
  5. лёксус

    лёксус Активный пользователь

    При такой-то дискретности данных... Чтоб мы всегда только с такими и работали.
    Для такой дискретности 10000 эпох совершенно ни к чему. И 10 эпох вполне достаточно.

    Вопрос на засыпку. А как бы ты разделил, например такую дискретность?

    post_9759_1259700094.png

    Вопрос очень существенный. Я однозначного решения так и не нашел.
    В каждом конкретном случае приходится решать проблему каким-то частным образом. А это не гуд.

    Странно, что при N=10 сетка не сошлась. Должно было бы получиться 7 пустых классов.
    Дискретность-то очень хорошая.
    Попробуй скорость обучения сделать 0.7 - 0.9, а начальные веса 0.1 - 0.3
     
  6. yu-sha

    yu-sha Активный пользователь

    При количестве нейронов в выходном слое = 3, второй класс появился на диаграмме только после 5000-6000 эпох, а третий ближе к 10000. Честно говоря, не ожидал такого. Возможно, что-то делал не так, хотя в трех соснах заблудиться сложно - сеть-то очень простая и настроек минимум
    Присоединил файл с входными данными для желающих поиграться
    Посмотреть вложение Kohonen.xls

    Еще пришла мысль о применении сетей Кохонена
    Можно провести анализ непротиворечивости входных данных для других сетей.
    1) Проводим разбивку всех входных данных и отдельно разбивку входы+выход (пространство на 1 порядок выше).
    2) Если "как-то" эти распределения совпадают, то можно вести речь о непротиворечивости данных для обучения сети.
    Сплошь и рядом как-то что-то, ...)))
    Эх, видимо, зря я скурил учебники по вышке и статистике в институте)))
    Кручусь вокруг да около прописных истин
     
  7. yu-sha

    yu-sha Активный пользователь

    Я не могу разрулить элементарный пример, о чем дальше говорить???

    1) Изменил порядок следования элементов в выборке - характер обучения изменился - исчезла "задерганность", сеть плавно меняет распределение
    Вывод: флажок "Выбор примеров поочередный/случайный" в Параметрах архитектуры НЕ РАБОТАЕТ
    2) Менял скорость и веса, при 10 выходных нейронах результат нулевой - все десять классов заполняются

    Лёксус, помогай)) - Дальше не пойду, пока не разберусь
     
  8. лёксус

    лёксус Активный пользователь

    В параметрах тренировки хелп не смотрел?

     
  9. лёксус

    лёксус Активный пользователь

    И ещё. Где-то на первых трех страницах я писал о вредности рандомизации начальных весов.
    А такой принцип "приготовления" начальных весов использкется во всех пакетах и в 99% случаев.
    Потому что цена вопроса ниже плинтуса. Но для науки это может быть действительно единственный способ.
    А вот к анализу временных рядов все-таки не совсем подходит.

    И это одна из причин, почему я перешел на самописание. Как минимум, я могу использовать в своем арсенале 2 других, описываемых теорией метода - среднее арифметическое и выпуклая комбинация. А есть еще вагон мелких приемчиков. Но в НШ это нереализуемо, а про другие пакеты я не знаю. Но, думаю, и там тоже. Поскольку интерфейс этих нейро-пакетов доведен до такого состояния, что и даун справится. Т.е. изначально разработчики освободили пользователя от любых хлопот.
     
  10. yu-sha

    yu-sha Активный пользователь

    Сделал себе вот такой примерчик : по 1000 точек в каждой из трех областей - комар носа не подточит)))
    <div align="center"> kohonen1000.PNG </div>
    Буду бороться )))
    Генератор здесь Посмотреть вложение Kohonen.xls
     
  11. yu-sha

    yu-sha Активный пользователь

    Выдержки из Хэлпа Deductor'a

    Настройка параметров обучения карты Кохонена

    Обучение карты производится итерационными циклами, каждый из которых называется эпохой. Во время каждой эпохи происходит подстройка весов нейронов карты Кохонена. Подстройка весов во время одной эпохи происходит следующим образом: каждый входной вектор (строчка таблицы) обучающей выборки "подтягивает" к себе ближайший по расстоянию нейрон (нейрон-победитель) карты Кохонена с определенной силой (скорость обучения). Вместе с нейроном-победителем подтягиваются и его соседи. Соседство определяется положением нейронов на 2-х мерной четырехугольной или шестиугольной сетке. Здесь расстояние – это обычное Евклидово расстояние между 2-мя точками в многомерном пространстве (входной вектор и веса нейрона победителя).

    Способ начальной инициализации

    Способ начальной инициализации карты позволяет определить как будут установлены начальные веса нейронов карты. Возможны три варианта:
    ▪ случайными значениями – начальные веса нейронов будут случайными значениями.
    ▪ из обучающего множества – в качестве начальных весов будут использоваться случайные примеры из обучающего множества.
    ▪ из собственных векторов – начальные веса нейронов карты будут проинициализированы значениями подмножества гиперплоскости, через которую проходят два главных собственных вектора матрицы ковариации входных значений обучающей выборки.

    При выборе способа начальной инициализации следует руководствоваться следующей информацией:
    1. объемом обучающей выборки;
    2. количеством эпох, отведенных для обучения;
    3. размерами обучаемой карты.

    Между указанными параметрами и способом начальной инициализации существует много зависимостей. Однако можно выделить несколько главных:
    1. Если объем обучающей выборки значительно (скажем, в 100) превышает количество нейронов карты и время обучения не играет первоочередную роль, то лучше выбрать инициализацию случайными значениями, т.к. это даст меньшую вероятность попадания в локальный минимум ошибки кластеризации.
    2. Если объем обучающей выборки не очень велик или ограничено время обучения или необходимо уменьшить вероятность появления после обучения "пустых" нейронов (в которые не попало ни одного экземпляра обучающей выборки), то следует использовать инициализацию примерами из обучающего множества.
    3. Инициализацию из собственных векторов можно использовать при любом стечении обстоятельств. Единственное вероятность появления после обучения "пустых" нейронов выше чем если была бы использована инициализация примерами из обучающего множества. Именно этот способ необходимо выбирать при первом ознакомлении с данными.

    Скорость обучения

    Элементы группы Скорость обучения позволяют задать скорость обучения в начале и в конце обучения карты Кохонена. Значения можно выбрать из списка или ввести вручную с клавиатуры. Процесс обучения можно условно разделить на две фазы – грубую подстройку и точную подстройку. Для этапа грубой подстройки характерна достаточно большая коррекция весов нейронов сети по прохождении каждой эпохи. На этапе точной подстройки величина коррекции значительно уменьшается. При этом коэффициент (скорость обучения), с которым многомерные координаты (веса) нейрона победителя и его соседей будут двигаться в сторону очередного экземпляра данных, изменяется в зависимости от текущей эпохи обучения по правилу, определяемому следующей функцией (вид функции показан на рисунке):

    v = vначало*(vконец / vначало)^(T / Tmax),
    где:
    ▪ v – текущий радиус обучения.
    ▪ vначало – начальная скорость обучения.
    ▪ vконец – конечная скорость обучения.
    ▪ Tmax – количество эпох обучения (задается на предыдущем шаге).
    ▪ T – текущая эпоха обучения.

    Рекомендуемые значения для скорости обучения:
    ▪ в начале обучения 0,1-0,3,
    ▪ в конце обучения 0,05-0,005.

    Радиус обучения

    Элементы группы Радиус обучения позволяют задать радиус обучения в начале и в конце обучения карты Кохонена, а также тип функции соседства.
    Радиус обучения - это параметр, который определяет сколько нейронов кроме нейрона-победителя участвуют в обучении. В процессе обучения радиус обучения обычно должен постепенно уменьшается так, что на заключительных этапах в обучении участвует только нейрон-победитель. При этом радиус обучения изменяется в зависимости от текущей эпохи обучения по правилу, определяемому следующей функцией:
    r = rначало*(rконец / rначало)^(T / Tmax), где:
    ▪ r – текущий радиус обучения.
    ▪ rначало – начальный радиус обучения.
    ▪ rконец – конечный радиус обучения.
    ▪ Tmax – количество эпох обучения (задается на предыдущем шаге).
    ▪ T – текущая эпоха обучения.

    Радиус обучения в начале должен быть достаточно большой – примерно половина или меньше размера карты (максимальное линейное расстояние от любого нейрона до другого любого нейрона). а в конце должен быть достаточно малым – примерно 1 или меньше. Чем больше текущий радиус обучения, тем более грубо подстраивается карта, т.к. приходится корректировать большое количество весов нейронов, и чем меньше текущий радиус обучения, тем более точно подстраивается карта.

    Примечание. Начальный радиус обучения подбирается автоматически в зависимости от размера карты. Автоматически подобранный радиус – это всего лишь рекомендуемое значение.

    Параметр Функция соседства определяет, какие нейроны и в какой степени будут считаться соседними по отношению к нейрону-победителю. Этот параметр может принимать два значения: "Ступенчатая" и "Гауссова".

    Если функция соседства ступенчатая, то "соседями" для нейрона-победителя будут считаться все нейроны, линейное расстояние до которых не больше текущего радиуса обучения. При этом варианте функции соседства процесс обучения происходит немного быстрее, но качество результата может быть немного хуже, чем если бы использовалась Гауссова функция соседства.

    Если используется Гауссова функция соседства, то "соседями" для нейрона- победителя будут считаться все нейроны карты, но в разной степени полноты. При этом степень соседства определяется следующей функцией:
    h = exp((-d * d) / (2 * r)), где
    ▪ h – значение, определяющее степень соседства.
    ▪ d – линейное расстояние от нейрона победителя до нейрона "соседа",
    ▪ r – текущий радиус обучения.

    После определения степени соседства очередного нейрона, его веса будут изменены не с текущей скоростью обучения, а со скоростью равной текущей скорости обучения умноженной на коэффициент, определяющий степень соседства h.

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

    Кластеризация

    Секция Кластеризация предназначена для указания способа определения количества кластеров. Это можно делать автоматически или вручную.
    ▪ Автоматически определять количество кластеров – после установки этого флажка программа будет автоматически определять количество кластеров.
    ▪ Уровень значимости – параметр автоматического определения кластеров. Чем больше этот параметр, тем большее количество кластеров будет получено.
    ▪ Фиксированное количество кластеров – параметр доступный при ручном определении количества кластеров. Собственно задает желаемое количество кластеров, на которое будут разбиты нейроны карты Кохонена.
     
  12. yu-sha

    yu-sha Активный пользователь

    2 Лёксус

    А вот как Дедуктор разложил по классам два моих "простых" примера
    1) на 300 точек

    <div align="center"> deductor300.PNG </div>

    и на 3000 точек

    <div align="center"> deductor3000.PNG </div>

    Не все так очевидно, как кажется
    Что русскому хорошо, то немцу - смерть )))
     
  13. лёксус

    лёксус Активный пользователь

    Я посмотрел твой екселевский файл. Мелькнула шальная мысль - может изменить способ ориентации точек на плоскости? Т.е. что-то не так с входными данными. Я ещё не встречал, чтобы настолько явно различимые данные давали такую ерунду в результатах работы.


    Жванецкий (с)
    Консерватория, аспирантура, мошенничество, афера, суд, Сибирь.
    Консерватория, частные уроки, еще одни частные уроки, зубные протезы, золото, мебель, суд, Сибирь.
    Консерватория, концертмейстерство, торговый техникум, зав. производством, икра, крабы, валюта, золото, суд, Сибирь.
    Может, что-то в консерватории подправить?
     
  14. yu-sha

    yu-sha Активный пользователь

    Ну уж нет - взялся за гуж, не говори, что не дюж
    Есть вариант, но не знаю насколько он "универсален" (в данном примере все видно, а как понять, что попали не туда в 20-тимерном пространстве?):
    - 10 (20,30, ... - как оценить количество?) раз прогоняем данные через сеть Кохонена с разными настройками
    - потом результаты (веса нейронов полученных нейросетей - это евклидовы центры классов) снова гоним через сеть Кохонена

    Надо-таки сделать свою сеть в МТ4/5 ))
     
  15. лёксус

    лёксус Активный пользователь

    Я не отказываюсь. Уже придумал вариант эксперимента о том же самом. Думаю, что всё получится. Но только немного позже. У меня сегодня винда ласты загнула. На текущий момент я её восстановил из резервной копии, но копия эта 2-х месячной давности, поэтому я пока "в настройках". К завтрашнему дню восстановлю полностью "вчерашнее" состояние. После этого продолжим.

    Sorry for my Windows. :unsure:
     
  16. yu-sha

    yu-sha Активный пользователь

    Продолжаем изобретать велосипед )))
    Дедуктор делает так
    1) разбивает входные данные на немалое количество (десятки, сотни) нейроно-"ячеек" выходного слоя сети Кохонена
    эти ячейки отображаются на плоскости (карте)
    т.о. каждому входному вектору ставится в соответствие ячейка (выходной нейрон)
    каждая ячейка выступает представителем многих (бывает, что ни одного) входных векторов
    2) полученные ячейки группируются в кластеры (каким образом пока не выяснил, но почему бы не НС Кохонена?))

    P.S. Более продолжительная по времени работа сети Кохонена привела к ожидаемому результату - количество кластеров стало равным 3
    <div align="center"> deductor3000_3class.PNG </div>
     
  17. лёксус

    лёксус Активный пользователь

    ya-sha, я тут подумал немного (между этапами восстановления своей винды) над твоим экспериментом по классификации. Фактически, поставив задачу решить вопрос классификации, ты начал решать вопрос кластеризации. Это очень разные задачи. В твоем первом примере, который выглядит, как неудачный, на самом деле всё нормально. Классификация так и работает. Принцип неопределенности классификации. Не зная структуры данных, степени их дискретизации, невозможно выбрать правильное количество классов. Но зато решение очень быстрое и простое. Но зато, сколько классов задашь, столько и получишь. Это не минус подхода. Все равно количество классов задается не совсем от балды и в большинстве случаев достаточно такой (обычной) классификации, невзирая на все минусы сопутсвующих непределенностей. А в некоторых редких случаях классификации недостаточно. Нужна кластеризация. Правда, у меня ещё таких потребностей не было, но твой эксперимент показал настолько разный конечный результат, что я подумал, что такой подход можно будет использовать в самых "мутных" случаях, когда качество входных данных приобретает особый смысл. Описанным тобой способом можно оценивать это качество.
     
  18. yu-sha

    yu-sha Активный пользователь

    У меня сложилась такая картина
    - <b>классификация </b>используется, когда заранее известны классы и есть обучающий набор, позволяющий соотнести входной вектор (образ) с соответствующим классом (например, вручную разметили график на участки тренд вверх / тренд вниз / флет; обучили НС на этом наборе и используем НС для классификации неизвестных участков графика). Эта задача решается сетями, обучающимися с учителем, - никак не НС Кохонена
    - <b>кластеризация </b>- это, собственно, поиск классов ("как-то так", "где-то в этом месте", ...)))- здесь нужны НС Кохонена с последующей визуализацией (например, Deductor) и оценкой профпригодности

     
  19. лёксус

    лёксус Активный пользователь

    Долгообещанный пример для NeuroShell 2

    Посмотреть вложение Make_Neuro_Net.pdf

    Тоже самое, но видео. Время около 3 минут, размер 49 Мб. <span class='inv'><![CDATA[<noindex>]]></span><a href="http://www.onix-trade.net/forum/go.php?http://www.sharemania.ru/0100669" rel="nofollow" target="_blank">Лежит тут</a><span class='inv'><![CDATA[</noindex>]]></span>
     
  20. лёксус

    лёксус Активный пользователь

    Файл данных, который использовался в описанном выше примере выкладывать сразу не стал. Хотел проверить одну штуку. Проверил. Включил в файл строчки от противоположных сигналов с нулем в качестве учителя. Мысль оказалась правильной. При настройке параметров входов/выходов НШ сам поставил минимум, максимум и среднее для значения последней колонки С6. И после применения сетки R квадрат рассчитался и значение его составило 0.9327. В общем, все говорит о том, что сетку мы сделали.

    В архиве два файла csv с сигналами бай и сел. Можно пример повторит самостоятельно.
    Кроме этого в архиве и сами сетки.
    Посмотреть вложение RSI_5.rar

    А это советник, кторый работает с этими сетками
    Посмотреть вложение e_RSI_5.mq4


    Замечание. Для работы сетки нужна библиотека NS2-32.DLL. Те, кто установил себе НШ2 эта библиотека лежит в системной папке System32. Но если какие-то проблемы возникнут, надо эту библиотеку скопировать в папку Experts\Libraries. Для тех, кто не устанавливал НШ, но хочет попробовать, в архиве эта библиотека.
    Посмотреть вложение NS2_32.rar


    Желаю успехов.
     

Поделиться этой страницей