Нейронная сеть. Создаем, учим и используем. В одной обработке




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

52 Comments

  1. insurgut

    А если не вникать в предметную область, каково может быть практическое применение используемых алгоритмов?

    Reply
  2. jobkostya1c8

    (1) insurgut, скоро 1С-ников нейросети заменят 🙂

    Reply
  3. dusha0020

    (1) insurgut, Самая главная и первая задача нейронных сетей — это обобщение множеств. Результатом обобщения может быть как аппроксимация внутренней связи между данными так и классификация. В практике 1С-нега таких задач, конечно, не много, но можно назвать вообще все связанное с прогнозом. Я не говорю про сугубо экономические прогнозы типа выручки или себестоимости — это само собой. А вот если Вам нужно отлучиться на часок, то можно оценить вероятность того, что в следующий час случиться обвал системы или неприятность помельче. Какие переменные для этого использовать (число одновременных пользователей, интенсивность обращения к серверу, объем ОЗУ и влажность воздуха, количество документов проведенных в минуту и скорость роста БД) решайте сами. Если соберете удачный комплект — нейронная сеть аппроксимирует зависимость и будет выдавать Вам вероятность.

    Столь длинным спитчем я попытался объяснить, что сфера применения зависит от Вашей прежде всего способности правильно собрать обобщаемое множество. А это прежде всего знания предметной области: экономики, IT, или, например, биржевого трейдинга.

    Reply
  4. TODD22

    (3) Как я понял из этого поста в жизни простого 1сника вещь бесполезная…..

    Reply
  5. Dmitri_1C

    (4) TODD22, Наверно не так, а скорее всего: «Не базой единой сыт 1С-ник»

    Reply
  6. dusha0020

    (4) TODD22, А что отличает «обычного» 1С-ника от необычного?

    Думаю, что обычному не нужно ничего кроме, а необычный выходит за рамки. Классифицируйте себя сами:)

    Reply
  7. John_d

    Вы бы могли пояснить смысл полученного результата в вашем первом скриншоте

    первая строка:

    х0=3,х1=5,х2=5,х3=6

    у0=67,55,у1=3,83

    Где задается формула? И какая формула была тут?

    Reply
  8. dusha0020

    (7) John_d, Формула не задается. Для демо обучения были созданы 2 таблицы. Одна со случайными переменными Х0 — Х3, а другая с результатами вычисления по этому набору 2-х величин по формулам:

    Y0 = (Х0#k8SjZc9Dxk2 + X1) * X2 — SQRT(X3) — подставьте в формулу Х0, Х1, Х2 и Х3 и получите 67,55

    Y1 = SQRT(X0 * X1) — 1 / (X2 * X3) = 3,83

    Но таблицы исходных данных — это есть муляж. Муляж какого-то массива реальных данных в котором функциональная взаимосвязь не определена или не поддается математическому описанию. Поэтому задать формулу в рамках обработки нельзя. В рамках обработки мы даем массивы аргументов и результатов и пытаемся данную связь перенести в структуру сети. В демо примере получилось, что после 2000 шагов обучения наша сеть в состоянии выдать приблизительный результат для произвольного набора аргументов с ошибкой в 10-12%. Если хотите вычислять значения указанных функций с определенной погрешностью.

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

    Reply
  9. TODD22

    (6)

    А что отличает «обычного» 1С-ника от необычного?

    Тем что «обычный» 1сник решает практические задачи, а не изобретает сферического коня… Хотя это то же полезно.

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

    А на это можно ответить анекдотом:

    -Какова вероятность того что вы встретите на улице динозавра?

    -50/50 или встречу или нет….

    Так же из с остальным или упадёт сервер или нет когда я отлучусь… а пользы от того что мне вероятность посчитает нейронная сеть я не вижу.

    Reply
  10. dusha0020

    (9) TODD22,

    что «обычный» 1сник решает практические задачи

    Я бы даже уточнил, что это идеальный 1сник. Вопрос в задачах. Для идеального 1сника нерешаемых задач быть не должно. Поэтому может быть когда-нибудь столкнувшись с очередной «практической задачей», Вы вспомните, что где-то в недрах Инфостарта есть и такая хрень и можно попытаться ее сюда прикрутить. А на большее и не претендую:)

    Reply
  11. serg1974

    (10) Абсолютно согласен — задачи бывают разные и СПАСИБО вам за очередной интересный механизм!!.

    В качестве примера «разной» задачи можно привести например: Будни автоматизации или «мне нужна программка для 3D упаковки»

    Reply
  12. asdfgcom

    Очень интересовался данной проблемой. Очень рад, что кто-то смог довести дело до опытного образца.

    3 года назад пытался сделать распознавание символов. Количество нейронов на входе равнялось матрице символа. На выходе абстрактное название символа, например «Квадрат», «Треугольник». Количество промежуточных нейронов, уже не помню, но пришел к выводу, не должно быть постоянным. Должно накапливаться в процессе обучения. Например, пустая матрица — ничего. Нет абстрактного решения.

    Шаг 1. Крадрат. Все точки квадрата должны создать 1 слой нейронов количеством точки квадрата/количество входов нейрона. Слоев до абстактного решения «Квадрат» будет создано столько, чтобы на выходе был 1 «нейрон» Указывающий на результат квадрат.

    На 1м шаге каждый задействованный нейрон будет нести 100% связь на следующий в слое нейрон ведущий к решению квадрат.

    Шаг 2, например, круг. Добавляются — убавляются задействованные нейроны в матрице 1го слоя.

    Формируются новые нейроны во 2м слое со 100% связью «Круг» и задействуются уже сложившиеся связи из «квадрата» снижая %»Квадрат» и т.д.

    В качестве «Нейрона» использовал то ли регистр сведений, то ли справочник… не помню, но едино. В котором была простейшая функция и память связи с процентной вероятностью с другими нижележащими элементами-нейронами.

    Сложилось мнение, что выходов нейронов должно быть более 1.

    Короче остановил изыскания на первом же опыте, когда расчет 1С проводил минуты. Отложил в долгий ящик.

    Успехов, коллега! Звезду заработал!

    Reply
  13. eugeniezheludkov

    «Так и водют шельмы» … сидел работал и тут на тебе заинтересовался, прочитал википедию нашел кучу интересных реализаций в пару строчек, интересные области применения http://habrahabr.ru/post/50265/. Нет я и раньше слышал про ANN, но как то не углублялся. Лишь распределенный, генетический алгоритм в паре реализаций и оптимизаций на С++ делал . Сократил время полного обучения с миллиарда лет до миллиона, придумав новый алгоритм нахождения геномов (не рандомный), он даже что-то изобретал … ПС: нужно нейронную сеть натравить на agar.io пусть обучается

    Reply
  14. Makushimo

    Правильно я понимаю, что нейронная сеть работает таким образом:

    На вход подаем набор параметров (П) и известный результат (Р)

    Скажем 100 строк:

    1. П1 П2 ….Пn = Р1

    ……..

    100. П1 П2 ….Пn = Р100

    на этом массиве сеть учится правильно получать результаты на основе параметров

    далее еще 100 строк:

    101. П1 П2 ….Пn = Р101 результат сети С101 отклонение С101-Р101

    ……..

    200. П1 П2 ….Пn = Р200

    сеть свои результаты сравнивает с реальными, отсюда получаем значение погрешности обучения сети

    на следующем массиве (10 строк)

    201. П1 П2 ….Пn = ? результат сети С201

    ……..

    210. П1 П2 ….Пn = ?

    мы имеем только массив параметров, но результатов не знаем

    а сеть с выявленной погрешностью предоставляет нам свои результаты расчетов для каждого набора (строки) параметров

    я все верно написал?

    Reply
  15. dusha0020

    (14) Makushimo, Да. Примерно так все и работает. Только есть одно замечание. Все входы и выходы нормируются перед началом обучения через минимальное и максимальное значения в ряду. Поэтому если неизвестные данные очень сильно отклонятся от известной ОДЗ ошибка может быть намного выше ожидаемой.

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

    Reply
  16. Kurt

    Интерсно. Слабо представляю данную область… только как вариант прогнозирования будущего чего либо, на основе уже каких-то ранее имевшихся в распоряжении данных.

    …А вот бы умудриться натравить нейронные две, а то и три сети друг на друга, что бы они сами контролировали процесс обучения друг друга… или друг другом.. сами осущесвляли подбор оптимальных параметров параметров, сами двигали себя к нужному результату.

    Ранне, в конце 90 читал статью, как на 11 нейронах была построена система распознавания голоса или любого другого полезного сигнала (соответственно и обучение другое). Человек перестает понимать речь, когда уровень шума вокруг в два раза выше. Эта сеть распознавала полезный сигнал (речь) даже когда уровень окружающего шума был в 200 раз выше. Разработку финансировали военные… хотели чтобы система могла распозновать шум подводных лодок (ибо уж очень они теперь тихие). Статью найти в инете не удалось. Про данный проект с тех пор тишина. Видно буржуйские военные всё-таки подмяли проект под себя.

    Reply
  17. dusha0020

    (16) Kurt, Насчет «сами себя контролировали и направляли» — есть специальные алгоритмы обучения без учителя. Но они скорее о классификации множеств, чем о прогнозе и распознавании.

    А про военных и т.п. — это же не секрет Полишинеля. Смотрим киношки Голливудские, как там злые спецслужбы подключаются ко всем камерам видеонаблюдения и распознают в лицо разыскиваемого. Это фантастика? Может быть, но думаю, что разработки таких систем по заказу ЦРУ, АНБ, ФСБ, ФБР … ведутся в десятках институтов и большинство из них на нейронных сетях. А десяток в той или иной степени работоспособных прототипов уже следят за нами:)

    Reply
  18. and_sk

    я думаю вам нужно создать пример скармливания вашей обработке курса доллара,

    и все закрутиться))))

    Reply
  19. dusha0020

    (18) and_sk, Слишком много неизвестных но важных факторов для такого примера. Откуда я узнаю с какой ноги вставала Набиулина и чего и сколько накануне выпил Сечин?:)

    Reply
  20. and_sk

    дата+курс за какойто период) мало будет данных?

    я думаю многие заинтересуются (алчность грех!!) и захотят попрогнозировать

    и если будет больше голов пойдет развитие и к набиулиной))

    Reply
  21. ivanov660

    (18) and_sk, на таких «роботах» относительно недавно много народу шишек набило. Экстраполирование относительно монотонной кривой может предсказать сможет, а вот что-то посерьезней нет.

    Reply
  22. Kurt

    (20) Когда-то в институте мы изучали «Статистику»… там же изучали и методы прогнозирования, а вернее некоторые коэффициенты показатели «будущего», которые выводились как раз на основании предыдущих данных некоторой кривой. Существут в общем-то несколько коэффициентов расчитывающихся по разным методикам и дающих разную степень точности… а так же (иногда) разное направление развития события…. один кричит «пойдёт вверх», а другой «неее, будет также или вниз» )))

    На бирже в программах Forex эти показатели (не один) как раз рассчитываются… но решение, что делать, остаётся за человеком… ибо всё это стихийно и зависит от кучи факторов… а показатели? просто показатели, чистая математика и ничего личного… чего не скажешь про участников биржи ))))))))

    На курсе на бирже играют спекулянты (особенно в нынешней нашей ситуации на фоне санкций), узнать что у них будет в голове завтра или через час не представляется возможным. Что в планах у ЦБ на завтра? …будут покупать валюту? ..будут снижать ставку рефинансирования? …будут делать вливания на поддержку текущего курса? Что с нефтью? Кто-то притормозит добычу? Кто-то обвалит цены? В зарубежных СМИ появятся «новые» фотографии «наших» регулярных войск и техники в Донбасе? Или какой-нибудь оппозиционер умрёт от алергии… и это как всегда «происки Кремля»? Приструнят какого-нибудь распоясавшегося гея? Случится эпидемия в Арабских Эмиратах? Землятресение развалит коммуникации по добыче сланцевого газа?…….. и это ещё не всё!!! что может влиять на колебания курсов валют…

    … а вы говорите «дата+курс за какойто период…» — это и будут те самые показатели от которых толку почти нет.

    Reply
  23. dusha0020

    (22) Kurt, В биржевой спекуляции есть для таких примочек специальный термин — «технический анализ». Есть книги по данной дисциплине и специальные курсы, но это все не более чем развод лохов на деньги. 100% надежные способы заработать на бирже: инсайд или машина времени.

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

    Reply
  24. Kurt

    (23) ну всё-таки «пользоваться сложными программами и формулами», а скорее программами — это даёт результат. На бирже всё так скоротечно, что обработать собственными мозгами эту «динамику» просто невозможно… хотя может и IQ (великих «шахматистов» никто не отменял), может и многолетний опыт, а на нём спонтанное чутьё и интуиция (а это батенька и есть, я считаю, ни что иное как определённым образом сконфигурированная нейроная сеть заточенная под определённый результат 😉 ..в мозгах-то нейроны… а аутисты говорят иногда показывают вообще запредельные невозможные для нас результаты).

    Была передача как-то (может тоже развод для лохов)… но! «мужик» написал робота для биржи. Робот оперировал несколькими десятками валют (да, не две, не три… как обыватели себе это представляют ))))))))) купил USD за рубли… подождал… продал USD за рубли). Робот оперирует на разницах курсов… но так сказать в глобальном масштабе:

    USD -> AUD -> JPY -> EUR -> GBP -> CHF -> CAD -> HUF -> ZAR -> SEK -> USD

    …вооОт такая перепродажа (например), в башке такое обработать… не представляю. Но вполне допускаю, что компьютер это легко просчитает причём с положительным для «хозяина» результатом.

    Как говорили в конце передачи, что пока они снимали сюжет у мужика дома, а это (не помню) 1-2 часа, робот на бирже заработал чуть более 5 тыс. $ …. но они не сказали какой суммой оперировал бот )))))) может там был лям или пол-ляма $. Но всё-равно, я считаю, что результат вполне закономерный и достойный. (…и может всё-таки развод, т.к. сказали, что этого робота у мужика периодически покупают «некоторые» люди )))))

    Reply
  25. dusha0020

    (24) Kurt, Эта передача, как и «технический анализ» — чистой воды развод. Как и продавцы счастья от TeleTrade и Forex и им подобных контор, как и программы и сервисы «помогающие» выиграть в тотализаторе, как и стратегии «беспроигрышной» игры в рулетку и электронных казино. Как и все прочее о чем я забыл сказать, так и то о чем я даже не слышал.

    «На дурака не нужен нож — ему покажешь медный грош, и делай с ним что хош!» (с) Кот Базилио & Лиса Алиса

    🙂

    Reply
  26. Kurt

    (25) ну всё-таки не соглашусь. Тотализатор и рулетка вещи весьма случайные (а значит вывисти какую-либо закономерность вообще не представляется возможным), хотя в первом случае, на скачках бывали случаи «подставных» результатов (по результатм ставок в пользу тотализатора «суперлошадь» почему-то не смогла..).

    Электронное казино — это вообще смешно, когда «все карты» (кости, фишки, барабаны) на руках у компьютера ))))))

    А вот на бирже… все курсы вот они в реальном времени (ну и просчёт ходов естественно должен вестись в реальном времени). Любая валюта к любой валюте покупка-продажа курс — нате, забирайте… думайте. Какая валюта к какой выгоднее покупка, какая валюта к какой выгоднее продажа? Расставляем коэффициенты (приоритетности, выгодности — ну это же шахматы, оценка хода) покупки, продажи. Подбираем последовательность валют с наилучшим результатом на выходе (опять шахматы — последовательность ходов)… и вот такая операция покупка-продажа (например):

    USD -> AUD -> JPY -> EUR -> GBP -> CHF -> CAD -> HUF -> ZAR -> SEK -> USD

    делается буквально в течении 5 минут, а может и меньше.. робот же. Курсы за такой период времени слишком критично не меняются, но и это можно держать под контролем в реальном времени, на ходу меняя приоритеты (как в шахматах, противник сделал «неожиданный» ход, нужно подкорректировать свой план игры). И обратите внимание… мы возвращаемся в ту же валюту, с которой начинали )))) и по возможности с плюсом (не забываем про процент отстёгиваемый бирже за сделку).

    Конечно будут ситуации когда все ходы не выгодны, «плохи» … но на бирже всё меняется, робот сидит ждёт «улучшения погоды»… без вашего участия. Кстати это могут быть и вообще не валюты… всё что угодно… золото, ценные бумаги, акции.

    Это далеко не рулетка и не тотализатор… тут всё на виду, всё прозрачно. Возможно в этой прозрачности робот выдаст вердикт, что вообще вариантов нет ))))))))

    Reply
  27. dusha0020

    (26) Kurt, Описанная Вами ситуация не имеет ничего общего с прогнозом. Это называется «финансовый арбитраж». И в тотализаторе он имеет место быть не реже, а даже чаще чем на валютных рынках. Дело в том, что букмекер — это продавец прогнозов, а совокупность букмекеров — это рынок прогнозов и на этом рынке можно отслеживать ситуации приводящие к извлечению прибыли, не связанному с исходами самих прогнозов. Например, букмекер А дает коэффициент на победу теннисиста X 2,05, а букмекер Б дает коэффициент 2 на его соперника. В этом случае поставив одинаковую сумму в разных конторах на разных спортсменов мы либо вернем ставки (проигрыш Х и получение 2-х ранее поставленных единиц) либо получим 2,5% прибыли (победа Х и возврат 2,05). Как видите данная схема не связана ни со случайностью, ни с нашим прогнозом и к прогнозированию и аппроксимации в общем и к нейронным сетям в частности не имеет никакого отношения.

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

    Reply
  28. Kurt

    (27) да, данная ситуация — «простой» расчет из некоторых переменных. Я хотел сказать, что в единый момент времени биржа весьма прозрачна в отличии от той же рулетки, хотя когда шарик остановился… тоже всё просто как 3 рубля ))))

    Но прогнозирование… как бы тоже расчет, точность которого зависит от количества учтённых «влияющих» факторов. Да и сами факторы могут быть не стабильными… и так же подвержены некоторой прогнозируемости. Выходит такой глобальный прогноз на основе «влияющих» прогнозов масштабом поменьше и узкоориентированных на какой-либо конкретный фактор. Прогноз погоды тому пример. Обещают «когда-нибудь» выдавать точный прогноз сразу на год.

    По поводу суперкомпьютеров и прогнозов был такой рассказ Айзека Азимова «Выборы» 1955 год (другое название «Назначает Мультивак»). Уже тогда учёные умы грезили «когда-нибудь» свалить всё на компьютер, который будет умнее, мудрее и добрее )))))))

    «Аннотация:

    К 2008 году в США президент страны избирался с помощью гигантского компьютера Мультивака, а также – одного любого среднестатистического американца. Такой подход к столь ответственным выборам стал возможен после многих лет усовершенствования ЭВМ, в результате чего компьютеры начали предсказывать результаты голосования на основании всего половины опрошенных, затем половины той половины и т.д. А в настоящее время Мультиваку необходимы были тонны статистических данных и всего один голос человека. И имя этого человека становилось таким же популярным, как и имя выбранного президента.»

    Вот так вот. Т.е. есть в стране такой «среднестатистический» человек, который проголосует как большинство электората. Зачем баламутить всех. Надо определить (найти, вычленить) этого человека и он изберёт президента. …. вот только чего они дальше-то не пошли? Компьютер же (уже) наверняка знает, кого выберет этот избиратель… так и пусть сразу же оглашал результаты выборов САМ. )))

    Reply
  29. Kurt

    (3) «Самая главная и первая задача нейронных сетей — это обобщение множеств. Результатом обобщения может быть как аппроксимация внутренней связи между данными так и классификация.»

    А вот собственно почему и нет… Обобщение, классификация! Вполне пригодно для распознования речи. Множества? Их есть у нас. Звук давно научились оцифровывать. Пусть 10 различных мужчин скажут в микрофон букву «А», тоже самое сделают 10 женщин, девочек, мальчиков, бабушек и дедушек. Кто-то скажет медленно, кто-то быстро, кто-то отчётливо, кто-то невнятно. Вот мы и получим некоторую кучу различных множеств, но одного и того же — буква «А». Найти закономерности и обощить, вынести вердикт, классифицировать — это буква «А»… ну и алфавит одной буквой не заканчивается.. а еще есть мягкие согласные, паузы. И чтоб получить на выходе удобочитаемый текст — дополнительная прогонка по словарю и расстановка синтаксиса (но это уже отдельно стоящая задача).

    Подозреваю, что программа «Ассистент» под Андроид так и работает. При этом вообще не различает кто говорит. Не отличает голос хозяина устройства от голоса любого другого человека (обращается к нему так же как к хозяину)… ну собственно да, обобщение множеств… разницы не видит. Т.е. тут ещё нужна классификация тембра, а это тоже отдельная задача.

    Кстати, у спецслужб некоторых стран, есть системы автоматического распознования стрелкового оружия (пистолет, автомат, пулемёт, винтовка — И конкретно модель огнестрела) по зафиксированному звуку… Ой чую без нейронных сетей не обошлось.

    Reply
  30. Гость

    Меня заинтересовала твоя обработка в практическом ее применении. Написал тебе в личку.

    Не уверен, что в личке письмо ушло…. продублирую здесь:

    Прочитал твою статью «Нейронная сеть. Создаем, учим и используем. В одной обработке».

    Как думаешь, возможно ли твою обработку использовать для дополнительного дохода на спортивных ставках, в частности на тотализаторе, например: https://www.marathonbet.com/su/toto/hda/home.htm

    Я в футболе ничего не понимаю, не играю в него. Но 4 года назад я применил чистую мат.статистику к футбольному тотализатору. Собирал данные, анализировал. К прогнозу исхода в футбольном матче исходил чисто из цифр, а не сил соперника или знаний той или иной команды или футболистов, как это делают многие фанаты, ставочники и т.д.

    К чему я это все сказал…. А к тому, что когда я применял подход к ставкам на тотализатор исходя из того, что мне показывают мои цифры, то я был в плюсе по итогу за месяц например. Однажды сорвал большие деньги (это было спустя 5 месяцев моего знакомства с тотализтором). Потом начал мешать человеческий фактор… один словом пару месяцев был в небольших минусах (от 50 до 100у.е.). Статистика + появились личные предпочтения к тем или иным футбольным командам = плохие прогнозы.

    Прочитав твою статью, мне стало интересно, можно ли твои знания в прогнозировании применить в ставках на футбольном тотализаторе.

    Если тебе интересно попробовать твою обработку в реальном применении, то можем обсудить.

    С уважением, необычный 1С-ник, Александр 😉

    Reply
  31. dusha0020

    (30) Александр, Ответил Вам в личку, но раз уж и коммент есть то выскажусь еще и публично. По пунктам:)

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

    2. Специальных знаний о формальной области у меня немного, как у обычного любителя посмотреть матч под пивко в спортбаре, так что едва-ли я смогу собрать качественную модель для прогноза.

    3. В реальном применении, если есть готовая методика прогноза применение сети возможно. Но здесь все тестируется довольно просто. Берете область исходных данных и результатов, оставляете достаточно большой массив для проверки, а на остальных данных учите сеть. После этого подаете обученной сети проверочный массив исходных данных и выгружаете расчетные результаты в эксель. Смотрите есть ли прибыль и оцениваете ее достоверность (методику я дал в личке). Если вероятность быть в прибыли хорошая — работаем дальше!:) ОК?

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

    Заранее благодарен всем читателям и участникам обсуждения. Спасибо:)

    Reply
  32. pvlunegov

    Что то вас всех не туда потянуло. В сторону прогнозов все мыслят применение нейронных сетей.

    Все гораздо проще!

    Что нужно от искусственного интелекта непосредственно 1с-нику?

    Прежде всего — динамическая подсказка нужных функций и процедур в процессе ввода!

    Можно нейронную сеть научить помогать вполне определенному человеку, автоматизировав процесс обучения следующим образом:

    1). Конкретный человек работает в Конфигураторе 1с.

    2). Получаем статистику введенных символов, статистику времени, дня недели, погоды, температуры, настроения

    3). Эти Статистики скармливаем нейронной сети

    4). Обучаем ее.

    5). Готово! Сеть может предложить вероятные слова и символы, которые человек будет вводить в определенный день и час.

    Получим персонального помощника, который будет угадывать вводимые символы и ускорять ввод!

    Это реально прикладная задача для меня!

    Reply
  33. pvlunegov

    Кстати, например, подобные алгоритмы используются в олнайн-распознавании голоса (например в СИРИ-помощнике в Айфонах).

    Там алгоритм подстраивается под модуляционные интонации конкретного человека.

    Чем чаще использовать онлайн-распознавание, тем точнее оно будет для определенного человека.

    При этом используются суперкомпьютеры, на которых работают настроенные нейронные сети.

    Народ, эти алгоритмы давно работают, а вы все каких то спортивных применениях.

    Мыслите шире, мыслите в сторону повседневной жизни!

    Reply
  34. pvlunegov

    Еще одно пришедшее мне в голову СУМАСШЕДШЕЕ немного оприменение нейронных сетей.

    Можно настроить нейронную сеть под конкретного человека.

    Для этого нужны:

    1). Статистика настроения (например любая таблица, которую заполнит человек раз в день — пишет свое настроение по 10 бальной шкале)

    2). Статистика дня, времени недели, погоды,

    3). Статистика движений мыши по экрану, вызова определенных программ, расположение ярлыков на экране.

    Все эти статистики скармливаем генетическому алгоритму.

    обучаем.

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

    Двигаешь мышью, а он сразу подсвечивает ярлык, который мы хотим открыть — ускоряет использование Виндовс!

    Reply
  35. Makushimo

    (15)

    что в таблице исходных данных есть нейрон?

    в визуальном представлении один шарик это одна строка таблицы исходные данные?

    или ячейка одной строки исходных данных?

    можно привести наглядный пример построения сети и ее использования?

    Да на той же таблице курсов валют, про которую тут было обсуждение.

    Reply
  36. dusha0020

    (35) Makushimo, Один нейрон это математический аналог нейрона. Нейрон имеет входы и выходы. Входы взвешиваются и от средневзвешенной входов получается значения выходов (всех) по функции активации. Функция активации в нашем случае логистический сигмоид с постоянным коэффициентом кривизны 2. То есть первый слой нейронов — это исходные данные. Каждый нейрон первого слоя выдает свое значение без преобразований на все нейроны второго слоя. Второй слой вычисляет среднюю от пришедших в него сигналов, вычисляет от нее величину сигмоиды и раздает полученное значение третьему слою и т.д. пока в последнем слое не соберется на выходе набор результатов. То есть нейроны первого слоя — это факторы, нейроны последнего — результаты. Все внутренние слои — предмет Вашей фантазии. Суть процесса обучения сети заключается в том, что мы подаем N-ное количество известных наборов факторов на вход сети и смотрим, что получается на выходе. В зависимости от того насколько расчетное значение результата (последнего слоя) отклонилось от известного для обучения проводим коррекцию весов сигналов у каждого нейрона. Метод коррекции — обратное распространение ошибки (отклонения между фактическим и расчетным результатом). И так от набора данных к набору, от этапа к этапу сеть настраивает веса таким образом, чтобы эта ошибка была все меньше и меньше. В итоге по завершению обучения мы подаем набор переменных на вход для которого пока еще не известен результат и вычисляем его через настроенную сеть. Это и есть прогнозирование при помощи нейронной сети.

    Постарался коротко:) А на примеры нет времени.

    Reply
  37. Makushimo

    (36)

    1. Входной слой нейронов — это одна строка таблицы «Исходные данные» на форме обработки. А каждая ячейка строки — это один нейрон. Так?

    2. В чем заключается «фантазия» во внутренних слоях? Я могу как то влиять на средние слои и как?

    3. Сложно понять: для чего можно (нужно) добавлять внутренние слои и количество нейронов в них?

    Могу ли я менять значения нейронов во внутренних слоях или только управлять количеством слоев и нейронов в них?

    4. Как и где на обработке производить «коррекцию весов нейронов» ?

    5. Если я меняю параметры сети, например ставлю число выходных нейронов = 1, то при загрузке задания в таблице результатов все равно 2 колонки, т.е 2 выходных нейрона. Получается мне нужно где-то там вручную менять (составлять) задание для сети?

    Reply
  38. dusha0020

    (37) Makushimo,

    1. Да. Все правильно.

    2. Редактором сети. Количество внутренних слоев и количество нейронов в каждом их них устанавливаете сами.

    3. Внутренние слои — это синапсы (связи) для каждого из которых сеть подбирает и запоминает вес. Чем больше слоев и нейронов тем больше связей и весов и тем больше, грубо говоря область поиска решения. Для простых задач достаточно сетей с одним скрытым слоем, а если переменных много и связи между ними далеки от линейных то гибкость и адаптивность решения повышается за счет увеличения количества внутренних нейронов. Но при этом увеличивается и время обучения.

    4. Никак и нигде. Веса корректируются алгоритмом обучения при нажатии на кнопку «Начать». Вы лишь можете судить о том насколько удачно подобраны веса по значениям ошибок аппроксимации. (Интересно как Вы вообще собирались их менять вручную? Для одного этапа коррекции, например, на демо данных нужно проделать сотни тысяч вычислений. Давайте оставим это машине:)

    5. При загрузке данных обработка сама определяет сколько входных и выходных нейронов должно быть в Вашей сети. Если вы хотите иметь 3 входа и 1 выход загрузите исходными переменными (аргументами) ТЗ с 3-я колонками, а исходными результатами подайте ТЗ с 1-й колонкой. Редактор сети сам сформирует первый и последний слои.

    5.1. Получается что нужно. Формируете ТЗ с данными и сохраняете в произвольный файл командой ЗначениеВФайл(). Загружаете отдельно ТЗ с аргументами и ТЗ с результатами для этих аргументов с формы обработки. Получаете в редакторе сеть с первым и последним слоями по количеству колонок в загруженных ТЗ. Внутренние слои добавляете и редактируете как хотите. Настраиваете параметры обучения и нажимаете кнопку «Начать». Ждете. Если результат Вас удовлетворил сохраняете сеть в файл. В будущем загрузив эту сеть из файла и подав только ТЗ с аргументами без известных результатов можете получить и сохранить в файл результаты для этих аргументов предсказанные ранее обученной сетью. Можете просто ввести набор исходных аргументов с формы и увидеть ожидаемый результат.

    В общем: сети нужны данные, чтобы обучиться, и нужно провести сам процесс обучения на этих данных. После этого сеть готова и может обрабатывать произвольные наборы аргументов, рассчитывая ожидаемые результаты.

    Reply
  39. Makushimo

    (38)

    значит обучение сети выглядит так:

    1. загрузил аргументы и результаты

    2. указал порог ошибки тестя, порог ошибки обучения, макс количество итераций

    3. нажимаем «Начать»

    4. Если полученные ошибки обучения/тестирования сильно отличаются от заданных, то

    добавляем/убираем внутренние слои, меняем количество нейронов в них

    и/или

    меняем количество итераций

    5. Нажимаем «Начать»

    то есть индикатор правильно обученной сети, это совпадение заданных порогов ошибок обучения/тестирования с рассчитанными в процессе обучения. Так?

    1. А задания на обучение это то же самое что и таблица аргументов?

    2. как тогда увидеть решения к этим заданиям?

    в целом не понятен алгоритм использования обученной сети.

    3. почему если я делаю только все вышеперечисленное, нет гиперссылок «просмотр сети» и «Расчет по данным текущей сети» ?

    Reply
  40. dusha0020

    (39) Makushimo,

    индикатор правильно обученной сети, это совпадение заданных порогов ошибок обучения/тестирования с рассчитанными в процессе обучения. Так?

    Не так. Главный индикатор ошибка аппроксимации на верификационной выборке (ошибка верификации). Это указывает на то, на сколько в среднем будет ошибаться сеть на новых для нее данных. Если величина ошибки для Вас приемлема то сеть можно считать обученной.

    1. Не совсем. Задание (Вы же скачали спецификацию) включает также сеть, параметры обучения, параметры сохранения и еще некоторые вещи, но они уже не столь принципиальны.

    2. Решения сохраняются для загруженных аргументов по ссылке «Сохранить результаты для текущей сети»

    3. Очевидно не до конца обучилась сеть. Советую попробовать на маленьком примере (3-4 аргумента, 1-2 результата и таблицы данных в 30-40 строк) с количеством итераций около 100. Он обучится достаточно быстро до минуты времени. В конце обучения появятся ошибка верификации, и не найденные Вами гиперссылки. Не забудьте также указать имена файлов для сохранения сети и задания! После обучения результаты сохраняются и только после этого загружаются на форму.

    Reply
  41. Makushimo

    (40)

    с индикатором обученности сети понятно

    1. А как самому генерировать задание для обученной сети?

    2. т.е я загружаю аргументы и сразу жму «Сохранить результаты для текущей сети» и получаю готовые ответы. Верно?

    3. Флаг «Сохранять задание» и путь указываю до начала обучения, Это значит что задание для сети сформируется автоматом и будет содержать аргументы, которые загрузил для обучения и ответы, которые загрузил для обучения?

    Reply
  42. dusha0020

    (41) Makushimo, Ответ на 1 так как Вы написали в 2:) Результаты рассчитываются и сохраняются для загруженных на этот момент аргументов.

    3. Да. По окончании обучения может быть сохранено задание (сеть и данные для обучения) — это удобно, когда Вы обучаете этапами, допустим по 1000 шагов постепенно уменьшая шаг обучения. В данном случае для очередной итерации загружаете задание целиком и изменив (или нет) несколько параметров обучения продолжаете с того места откуда закончили. Или же можно сохранить только саму сеть для получения на ее основе прогнозных оценок. А можно сохранить и то и другое.

    Сначала я написал спецификацию сети на листочке. Потом дополнил до спецификацию задания. Так как разработка велась в свободное время и с большими перерывами то одними из первых были написаны загрузчик задания (и как его составная часть) сети из файла и процедура сохранения сети и задания в файл. Это позволяло быстро возвращаться к разработке восстанавливая данные из сохраненных ранее файлов, а не формируя по 10-15 минут их вручную с формы. Когда работа была в основном закончена я не стал городить новый огород из прямого возвращения результатов обучения на форму. У меня на тот момент были прекрасно работающие и вылизанные до блеска процедуры сохранения результатов в файл и восстановления из файла на форму. Поэтому файл сохранения результатов это не прихоть, если хотите, а необходимое звено для передачи результатов обучения обратно на форму.

    Reply
  43. Makushimo

    (42)

    «это удобно, когда Вы обучаете этапами, допустим по 1000 шагов постепенно уменьшая шаг обучения»

    тут не понятна терминология

    «1000 шагов» — это 1000 итераций ?

    а «постепенно уменьшая шаг обучения» это что значит?

    «норме скорости обучения» или все тоже «количество итераций» ? В смысле обучать сеть нужно уменьшая количество итераций?

    еще вопросы:

    1. Какое должно быть соотношение «количество строк аргументов» х «количество итераций», чтобы не переучить сеть и обучение шло эффективно?

    2. для чего нужен параметр «норма скорости обучения»? в каких пределах изменять его значение — от 0 до 1 ? и на что это влияет?

    что будет, если я поставлю. 0 и что будет если я поставлю 1?

    и какое значение рекомендуется ставить в самом начале обучения?

    Reply
  44. dusha0020

    (43) Makushimo, 1000 шагов это 1000 итераций. Под итерацией в данном случае понимается один проход алгоритма корректировки весов ребер по всем данным для обучения.

    В данном контексте 1000 это, конечно итерации.

    Норма скорости обучения как шаг обучения (и такой термин возможен) всегда в пределах от 0 до 1. При 0 сеть не обучается совсем.

    Норма скорости это множитель на который домножается сдвиг веса ребра в направлении антиградиента. То есть аналитически вычисляется градиент веса ребра или частная производная. Производная это скорость изменения функции в точке или на бесконечно малом отрезке в окрестностях данной точки. Или угол наклона касательной к функции в точке. Проблема в том, что градиент показывает нам только направление движения для увеличения общей ошибки (антиградиент, соответственно, направление уменьшения ошибки), но не показывает на сколько нужно продвинуться в сторону противоположную градиенту, чтобы сразу достичь возможного минимума. Почему не показывает? Потому что движение вдоль градиента — это движение вдоль прямой, а функция ошибки явно нелинейна. И вот есть некая дельта, которая вычисляется в зависимости от градиента в точке с существующим весом ребра, но эта дельта переведет целевую функцию в ноль только если эта функция будет линейной. На практике же мы проскочим минимум, потому что функция ошибки вскоре отклонится от прямой. Норма скорости обучения — это и есть коэффициент, на который домножается вычисленное на основе градиента (или антиградиента, т.е. градиента с «-«) смещение веса в сторону минимизации ошибки сети. При норме равной 1 обучение идет очень быстро, но никогда не достигнет минимума ошибки, потому что точка минимума будет постоянно «проскакиваться» и очень скоро от шага к шагу сеть будет колебаться у минимума, но никак его не «поймает». При норме обучения близкой к нулю обучение будет очень медленным, но решение имеет шанс подойти очень близко к реальному минимуму.

    Вот поэтому обучение лучше проводить этапами. Сначала на большой скорости (0,4-0,7), а потом постепенно уменьшать ее для достижения самого дна ошибки сети.

    А вот конкретно нормы, количество итераций на этапе и этапов — это все очень индивидуально. Зависит от данных для обучения и архитектуры сети.

    Reply
  45. automatizator

    (17) Насчет «сами себя контролировали и направляли» используются другие механизмы с соответствующими задачами из той же биологии. Точнее генетические алгоритмы.

    Reply
  46. Dmitri_1C

    Тестовый вариант, вроде как что-то делает, но увы, не получилось создать свою нейронную сеть и обучить её.

    После доработок удалось заполнить аргументы X и Y, то есть входы и выходы, но при запуске обучения проходит один цикл и завершается.

    Побывал создать двоичное И, то есть

    входной набор:

    0 0

    0 1

    1 0

    1 1

    выходной набор:

    0

    0

    0

    1

    Reply
  47. Lama12-1

    Почему-то обучение падает на функции «НормализоватьДанные». При попытке деления на ноль.

    Есть какие-то требования к исходным данным кроме того, что они должны быть числами?

    Reply
  48. white-mount

    (44)

    решить с удовлетворяющим меня результатом я так и не смог (но нужно оговориться, что и задачи были сверхсложные)

    Вы с алгоритмом «пасьянс Медичи» не сталкивались?

    Хороший метод обучения нейронов.

    Скачал. На интерфейсе такси выглядит приятно.

    С функционалом разбираюсь.

    Проблему «гсч» в 1С давно обошёл выборкой из чисел Пи и е.

    Reply
  49. Lama12-1

    (47) Lama12-1,

    Вроде обошел ошибку. Оказалось что такая ситуация возможна когда и числитель, и знаменатель равны нулю. Сделал предварительную проверку на значение числителя. Если равен нулю, то и результат равен нулю без использования знаменателя.

    Reply
  50. Overtone

    (1) Не знаю, упоминалось ли здесь или нет, но что-то практическое имеется по распознаванию рукописного ввода: http://infostart.ru/public/200922/

    Reply
  51. sojuznik

    Очень интересная обработка, и что самое главное, за пол-дня благодаря статье и комментариям разобрался как работают нейронные сети. Очень интересный механизм и его можно применять. Спасибо!

    Reply
  52. pashamix

    Давно хотел попробовать написать на 1с пример работы нейросети. Но не хватало понимания принципов работы. Надеюсь с этой обработкой разберусь что к чему )

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *