Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2011, 15:07
Новичок

Отправить личное сообщение для stanislav.l Посмотреть профиль Найти все сообщения от stanislav.l
 
Регистрация: 23.03.2011
Сообщений: 6

Новичок: укажите на ошибки, пожалуйста.
Приветствую всех.
Мое появление в теме - захотелось своими руками пощупать что же такое "нейронные сети" и насколько они сегодня пригодны для практического применения (сложность освоения, эффективность и т.п.)

Для экспериментов была выбрана библиотека FANN, просто как самая близкодоступная (работаю в основном в Линуксе, пишу на C, а эта библиотека устанавливается без прыжков одной командой). Задумался над тестовой задачей. Браться сразу за распознавание не хотелось, но и слишком простые примеры тоже не хотелось.

Придумал следующее: у меня на компьютере ведется лог напряжения сети 220В - просто так, на всякий случай. Прикрепляю кусочек графика - чтоб было понятно как оно выглядит:
Название: pwr.png
Просмотров: 134

Размер: 2.3 Кб
И вот - подумал я - пускай мне нейронная сеть попробует апроксимировать этот график!
Вопрос: может уже здесь я сделал ошибку, и данный инструмент для этой задачи абсолютно не подходит ?
На графике невооруженным глазом видны суточные колебания; если приглядываться внимательно, то можно увидеть и недельный период. Т.е., подадим на входы время суток и день недели, и посмотрим что получится.

Задумался над вопросом: а как "правильно" подать время суток ? Если от 0 до 86399 секунд, а потом скачок на 0 - это ведь не соответствует "природе" параметра ... Единственное что мне пришло в голову - сделать 2 входа, и подать на них синус и косинус времени суток:
sin ( ( 2 * M_PI * ( t % 86400 ) ) / 86400 )
, и аналогично
sin ( ( 2 * M_PI * ( t % 604800 ) ) / 604800 )
- для недели.
Т.е. имеем 4 входа (вместо одного параметра t) , зато гарантирована "плавность" перехода через полночь и через границу недели.
Вопрос: правильно ли я сделал, или есть более удачные решения этой задачи ?

Сконвертировал свой лог в файл для обучения: sin/cos для суток, sin/cos для недели, и значение напряжения (деленное на 1000 - нормализация) - выход.
Скормил сразу весь лог за 3 месяца. Обучилась быстро. Отрезаю кусочек данных для теста, прогоняю, рисую график и вижу:

Вокруг линии около 220 вольт вьется чистая синусоида с недельным периодом. (По амплитуде - ну, похоже на правду, но точно не сказать - глазом недельный период виден не слишком явно). При этом ни намека на суточный период, ни намека на какие-то нелинейности!

Начинаю играть параметрами сети: 1 или 2 скрытых слоя, число нейронов меняю от балды от 8 до 128, меняю количество эпох обучения от 20 до 200, обучаю по всем данным, либо по вырезке за 1 неделю. Результат неизменен: синусоида с недельным периодом; в "плохих" случаях - с дурацкой амплитудой и далеко от 220, в "хороших" - близко, и с правдоподобной амплитудой. А больше ничего не меняется!

Вопрос: в каком месте я мог сделать глупость ?

(Вообще, опытные люди, подскажите: какие параметры сети кажутся "оптимальными" для этой задачи, чтоб мне впустую числом нейронов не играть ?)

Спасибо...

Последний раз редактировалось stanislav.l, 23.03.2011 в 15:29.
  #2  
Старый 23.03.2011, 18:05
гocть

 
Сообщений: n/a

входное представление неразумно. для предсказания временных рядов на вход обычно подаются предыдущие значения ряда, на некоторых фиксированных смещениях. как минимум, нужно включить несколько предыдущих отсчетов. раз ты подозреваешь период в сутки и неделю, то добавь еще отсчеты соответствующие этим интервалам
  #3  
Старый 23.03.2011, 19:53
Новичок

Отправить личное сообщение для stanislav.l Посмотреть профиль Найти все сообщения от stanislav.l
 
Регистрация: 23.03.2011
Сообщений: 6

Сообщение от гocть Посмотреть сообщение
входное представление неразумно.
Не понял. А какое будет разумно ?
Цитата:
для предсказания временных рядов на вход обычно подаются предыдущие значения ряда, на некоторых фиксированных смещениях. как минимум, нужно включить несколько предыдущих отсчетов. раз ты подозреваешь период в сутки и неделю, то добавь еще отсчеты соответствующие этим интервалам
Мне не надо "предсказывать", я хотел чтоб НС просто "усреднила" все имеющиеся данные, потому в начале опыта скормил ей в обучении ВСЕ данные - за 3 месяца с интервалом минута. (Потом уже подумал, что может быть это слишком много, и вырезал ровно за 1 неделю. Но на результат это не повлияло)

Вот так выглядит исходный лог:
2010-12-30 20:03 : 218.3
2010-12-30 20:04 : 218.3
...
а вот полученный из него файл для обучения:
10080 4 1
-0.969231 -0.246153 0.595324 0.803486
0.218300
-0.970296 -0.241922 0.595824 0.803115
0.218300
...
  #4  
Старый 23.03.2011, 20:46
гocть

 
Сообщений: n/a

Сообщение от stanislav.l Посмотреть сообщение
Не понял. А какое будет разумно ?
я же написал какое. подаешь на вход y(t-1), y(t-2), ... еще несколько членов, ..., y(t - <число около размера периода>), ...
это называется авторегрессионная модель (AR), один из стандартных способов моделирования временных рядов

Цитата:
Мне не надо "предсказывать", я хотел чтоб НС просто "усреднила" все имеющиеся данные,
Тогда не думаю что тебе нужны там все эти синусы, косинусы на входе, они только искажают данные. Посмотри на график sin(t) vs. y(t), наверняка какая-то муть будет. Например одно и то же значене синуса может быть соответствует двум разных временам суток.

Подавай просто t по модулю день. Чтобы сгладить функцию на концах, продублируй за предел периода немного данных с другого конца.
  #5  
Старый 05.04.2011, 18:32
Новичок

Отправить личное сообщение для stanislav.l Посмотреть профиль Найти все сообщения от stanislav.l
 
Регистрация: 23.03.2011
Сообщений: 6

А вот и неправда ваша... Дело было таки в идиотской ошибке в программе
input[0] = ...
input[1] = ...
input[0] = ...
input[1] = ...
Дети, когда копируете строчки - проверяйте это место ТРИЖДЫ, блин ! В 2-х последних просто не заменил 0,1 на 2,3 ...
А поскольку это уже тест, который всегда клепается на коленке - я проверял всё, кроме этого - подготовку файла обучения, само обучение, а сюда не заглядывал...

В общем, после исправления результат получился такой (красный - исходные данные, зеленый - выход сети) :
Название: pwr2.png
Просмотров: 119

Размер: 3.3 Кб

Последний раз редактировалось stanislav.l, 05.04.2011 в 18:35.
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новичок в нейронных сетях Sarge Искусственный интеллект, нейронные сети 23 13.04.2011 09:25
Умножение многочленов (где ошибки?) neitrosha Реализация, исходники, языки 0 22.03.2011 16:47
Новичок в НС Sargez Искусственный интеллект, нейронные сети 3 31.08.2010 03:40
Ошибки в реализации алгоритма Дейкстры k1r1ch Реализация, исходники, языки 2 26.12.2009 21:03
Проблема угасания ошибки в алгоритме обратного распространения гость Искусственный интеллект, нейронные сети 1 09.07.2009 16:33