Russian Qt Forum

Программирование => Алгоритмы => Тема начата: m_ax от Октябрь 17, 2019, 17:12



Название: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 17, 2019, 17:12
Приветствую)

Задача формулируется следующим образом:
У нас есть функция, которая на каждом шаге возвращает только одно из двух значений: либо 0 либо 1.
Мы не знаем как она устроена внутри, но предполагаем, что какая то корреляция относительно её значений существует. Более того, у нас есть достаточно большой массив её значений  в прошлом. Что даёт возможность "обучить" алгоритм находить эти корреляции (какие-нибудь свойственные для неё закономерности). 

И так, мы хотим, взяв N её последних значений, предсказать какие следующие  n значений она выдаст. Т.е. всего может быть 2^n различных последовательностей и для каждой  хотелось бы сопоставить свою вероятность.

Есть идеи как это лучше сделать?
Я заранее ответа не знаю :) (есть только абстрактные, почти философские соображения  :))

     


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 17, 2019, 18:51
Можно попробовать обучить нейросеть.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 17, 2019, 19:13
Можно попробовать обучить нейросеть.
Да, здесь нейросетью попахивает)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 17, 2019, 19:17
 Но закономерности должны быть иначе пустая трата времени.


Название: Re: К проблеме предсказания событий
Отправлено: Igors от Октябрь 18, 2019, 06:09
Был похожий случай. Есть пр-во заполненное какой-то ф-цией, но очень "жиденько". Ну и при трассировке луча "львиная доля" расчетов уходит на "пустоты" как вода в песок. А от самой ф-ции тоже добиться ничего не удается. Ну я перешел к параметру "плотность", для него построил гистограмму и вычислял минимальный шаг по лучу на основании текущей плотности. Какой-то эффект был - но это все что я помню спустя много лет  :)


Название: Re: К проблеме предсказания событий
Отправлено: ssoft от Октябрь 18, 2019, 08:41
Если нет никаких предположений о виде функции, то можно грубо оценить вероятность возвращения функцией 0 или 1 по её статистическим значениям.
Например, как отношения P0=N0/N и P1=N1/N. Тогда вероятности получения последовательности n следующих значений получится как

P=P0n0P1n1, где n0 и n1 - ожидаемое количество получения 0 и 1.

То есть нет необходимости оценивать все 2n вариантов, так как, например, 00110 01010 01100 10001 и т.п. равновероятны.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 10:53
Цитировать
Но закономерности должны быть иначе пустая трата времени.
Да, разумеется) Но даже случай с белым шумом мы в принципе можем распознать. Т.е. мы запускаем ботов: первая группа использует "обученный" алгоритм и предсказывает поведение функции на основе его прогнозов, и контрольный бот, который просто кидает монетку. В случае с белым шумом все боты окажутся неразличимы статистически.

Цитировать
Если нет никаких предположений о виде функции, то можно грубо оценить вероятность возвращения функцией 0 или 1 по её статистическим значениям.
Например, как отношения P0=N0/N и P1=N1/N. Тогда вероятности получения последовательности n следующих значений получится как

P=P0n0P1n1, где n0 и n1 - ожидаемое количество получения 0 и 1.
Идея понятна, но это слишком грубое приближение для которого, например функции вида:
1) 10101010101010...
2) 1111000011110000...
3) белый шум
...
будут неразличимы( Т.е. такая оценка не запоминает важных закономерностей..


Название: Re: К проблеме предсказания событий
Отправлено: ssoft от Октябрь 18, 2019, 11:18
Идея понятна, но это слишком грубое приближение для которого, например функции вида:
1) 10101010101010...
2) 1111000011110000...
3) белый шум
...
будут неразличимы( Т.е. такая оценка не запоминает важных закономерностей..

Возьмите тогда более сложные комбинации битов, вместо 0 и 1.

Два бита - 00 01 10 11
Три бита - 000 001 ...
...
Восемь бит
...

Посчитайте статистику встречаемости таких комбинаций в последовательности.

Можно графики построить даже и попытаться приблизить к какому-нибудь разложению Фурье.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 11:33
Цитировать
Возьмите тогда более сложные комбинации битов, вместо 0 и 1.

Два бита - 00 01 10 11
Три бита - 000 001 ...
...
Восемь бит
...

Посчитайте статистику встречаемости таких комбинаций в последовательности.
Да, это уже лучше) Однако это опять даст мне только наиболее часто встречающиеся последовательности, но информация о том, какая последовательность в среднем встречается после другой будет потеряна( Т.е. я хочу следующее: я беру N предыдущих значений функции (скажем N = 10) (которые мне известны) и на основе "нейросети" получить наиболее вероятную группу последующих n значений (скажем, n = 3). Размер обучающей выборки у нас значительно больший >> N, n.

Я, по возможности, вечером постараюсь свои соображения на этот счёт привети.. Но они пока такие, сырые ещё..  


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 18, 2019, 11:57
Если закономерности есть, то нейросеть будет работать.

Пусть есть исходные данные - последовательность от 0..M

Параметры сети:
Вход - N значений
Выход - 2 значения (0 или 1)

Обучение:
Выбираем случайное значение X в последовательности (N+1)..M - правильный ответ.
N значений до X подаем на вход.
В зависимости от X устанавливаем значение выхода (если X=0 - то выход 1/0, если X=1 - то выход 0/1)

Крутим это в цикле пока не переберем все значения в исходной последовательности (точнее M-N значений)
Меняем эпоху и крутим еще всю выборку. Так несколько эпох.

Получение результата:
На вход N значений - на выходе вероятности 0 или 1.

Можно попробовать использовать 1 выход - и смотреть к чему ближе будет результат, к 0 или 1.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 12:12
Цитировать
Если закономерности есть, то нейросеть будет работать.
Ну с этим я не спорю)

Цитировать
Параметры сети:
Вход - N значений
Выход - 2 значения (0 или 1)
А почему выход только 2 значения? Я бы хотел на несколько шагов  вперёд смотреть (в разумных пределах, конечно).. Т.е. 2^n выходов..
Прогноз на один шаг вперёд - один слой? Или как?


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 18, 2019, 12:24
А почему выход только 2 значения?
Вероятность выпадения для значения 0 и для значения 1. :)
Можно попробовать обойтись одним и смотреть к чему оно ближе к 0 или 1.

Я бы хотел на несколько шагов  вперёд смотреть (в разумных пределах, конечно)..
Я думал вы хотите по текущей последовательности предсказать следующее значение.
Если хотите несколько, то и выходов нужно несколько.  :)


Название: Re: К проблеме предсказания событий
Отправлено: ViTech от Октябрь 18, 2019, 13:11
Я бы ради интереса вместо 0 поставил -1 и посмотрел на график "нарастающей суммы" (на каждом шаге (X) прибавляем текущее значение к предыдущей сумме (Y)). Может нейронная сеть хомо сапиенс там сразу какую-нибудь закономерность распознает :). Вдруг там синусоида вообще :).


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 18:31
Цитировать
Я бы ради интереса вместо 0 поставил -1 и посмотрел на график "нарастающей суммы"
Ну качественно замена 0 на -1 ничего не изменит, главное, что функция возвращает только два значения..

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

Цитировать
Если хотите несколько, то и выходов нужно несколько.   :)
В принципе да, можно сделать и два выхода. А потом, на основе этого смоделировать стат. ансамбль на n шагов вперёд.
Поэтому разумно остановиться пока на таком варианте: Мы знаем N предыдущих значений: нужно получить вероятность для 1 и 0 на следующем шаге.

Мои мысли по архитектуре такой "сети" (для наглядности, пусть N=4):
1) Сеть формируется при обучении.
2) Сеть состоит из списка групп. Каждая группа представляет из себя некий объект у которого есть два счётчика: один указывает на число исходов 1, а ругой на исходов 0.
Группа создаётся и инициируется последовательностью из N значений и в последующем может определять входит ли другая последовательность из N в данную (в качестве критерия логично использовать Manhetten lenght) Например, мы говорим, что последовательность a и b принадлежат одной группе если их manhetten lenght <= m (пусть m = 2).

Пример обучения такой сети. Обучающая последовательность:
111001101101110...
Вначале список групп пуст, мы стартуем с нулевой позиции. Создаём первую группу в списке и инициализируем её последовательностью 1110. При этом счётчик исхода_0 = 1.
Перемещаемся на шаг вперёд, теперь наша последовательность = 1100, а исход 1. Смотрим, входит ли такая последовательность в уже существующую группу? Входит: 1110 - 1100 = 1 < 2. В результате у нас по прежнему одна группа в сиске, но оба счётчика равны 1.  И так далее..

После обучения, мы скармливаем сети последовательность x, для которой хотим предсказать вероятности для 1 и 0. Ищем в списке к какой группе принадлежит последовательность x и смотрим на значения счётчиков: наиболее вероятный исход будет соответствовать наибольшему значению счётчика.

Вот вся логика  :)
Осталось реализовать и проверить  :)  


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 18, 2019, 19:30
m_ax, ну это не совсем та нейросеть, в традиционном ее представлении. :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 19:32
Цитировать
m_ax, ну это не совсем та нейросеть, в традиционном ее представлении.  :)
Поэтому и в кавычках  :)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 18, 2019, 19:35
Поэтому и в кавычках  :)
А почему не взят традиционную, так сказать? :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 19:37
Поэтому и в кавычках  :)
А почему не взят традиционную, так сказать? :)
Можно) Интересно было бы сравнить)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 20:04
Цитировать
Можно) Интересно было бы сравнить)
https://github.com/tiny-dnn (https://github.com/tiny-dnn) вроде, не плохая?)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 18, 2019, 20:04
Можно) Интересно было бы сравнить)
А можете выложить последовательность?


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 18, 2019, 20:05
https://github.com/tiny-dnn (https://github.com/tiny-dnn) вроде, не плохая?)
Эту не видал, сейчас заценю.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 18, 2019, 20:06
Можно) Интересно было бы сравнить)
А можете выложить последовательность?
Да, конечно) Но позже..)


Название: Re: К проблеме предсказания событий
Отправлено: Azazello от Октябрь 18, 2019, 22:21
Мои мысли по архитектуре такой "сети" (для наглядности, пусть N=4)..............

Осталось реализовать и проверить  :)  


Это не сработает.
Ничего из вышеперечисленного.

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

Обучение на исторических данных - полный провал. Тем более по одному критерию. Должны быть десятки "других критериев", чтобы это хоть как то давало предсказание лучше 60%.

В вашем случае, я бы советовал просто использовать статистический анализ, а на него уже вешать дерево решений.
Пример:
1 секунда: решений 40/60
2 секунды: решений 30/70

Это исторические данные.
Т.е. мы цепляем какие-то факторы, которые нам неизвестны, на временной интервал.

И при построении вашей нейросети (или дерева решений), вам столько нужно будет по***, настраивая коэффициенты и выбор интервалов, что ищите другие условия, которые влияют на "предсказания выбора". В принципе, с такими условиями, ваша "нейросеть" просто превратится в обычную RC цепочку, или в апериодическое звено, если вам так удобно.





Название: Re: К проблеме предсказания событий
Отправлено: Igors от Октябрь 19, 2019, 10:38
...пусть N=4
...
...если их manhetten lenght <= m (пусть m = 2).
Уже сделано немало произвольных (чисто "вкусовых") допущений, боюсь что рез-т будет зависеть от них "dramatically"

После обучения, мы скармливаем сети последовательность x, для которой хотим предсказать вероятности для 1 и 0. Ищем в списке к какой группе принадлежит последовательность x и смотрим на значения счётчиков: наиболее вероятный исход будет соответствовать наибольшему значению счётчика.
Ну а почему бы и не реализовать это "в лоб" на ассоциативном контейнере? Может это внесет новые мысли, "свежую струю". Ожидаемый рез-т - ну да, что-то будет "не белый шум", но точность предсказания невелика. И будет сильная зависимость от тестовых данных.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 19, 2019, 11:03
Реализовал) Результаты сильно порадовали. Всё распознаётся с высокой точностью)

Код
C++ (Qt)
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
 
#include "maxnet.h"
 
static constexpr unsigned int period = 10; // число предыдущих шагов для определения вероятности следующего шага  
static constexpr size_t SIZE = 550; // Полный размер данных
static constexpr size_t TRAINING_SIZE = 500; // Часть данных, для обучения сети
 
template <class V, class F>
void apply(V & data, F f)
{
   for (size_t i = 0; i < data.size(); ++i)
   {
       data[i] = f(i);
   }
}
 
int main()
{    
   std::vector<bool> data(SIZE);
 
   apply(data, [](size_t i)->bool { return (sin(i) + cos(4*i) >= 0); }); // периодическая функция
 
   vanda::maxnet<period, 0> maxnet; // Наша сеть)
 
   // Разделяем данные на две части:
   // для обучения и тестирования
   auto end = data.begin()+TRAINING_SIZE;
 
   maxnet.training(data.begin(), end); // обучаем сеть
 
   auto beg = end;
   end += period;
   // Тестируем её на оставшейся части данных
   while (end != data.end())
   {
       auto p = maxnet.prediction_for(beg++, end);
       std::cout   << "observed value = " << *end++
                   << "\t p(1) = " << p.probability_for_1
                   << "\t  p(0) = " << p.probability_for_0 << std::endl;
   }
 
   std::cout << std::endl << "number of groups = " << maxnet.num_groups() << std::endl;
 
   return 0;
}
 

И вот, собственно, результаты тестов: В первой колонке наблюдаемое значение, во второй вероятность того, что будет 1, в третьем, вероятность выпадения 0.  (Впечатляет  8))
Код
C++ (Qt)
observed value = 1 p(1) = 0.894737  p(0) = 0.105263
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 1 p(1) = 0.941176  p(0) = 0.0588235
observed value = 0 p(1) = 0  p(0) = 1
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 1 p(1) = 0.47619  p(0) = 0.52381
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0.454545  p(0) = 0.545455
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0.5  p(0) = 0.5
observed value = 1 p(1) = 0.5  p(0) = 0.5
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0.894737  p(0) = 0.105263
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0.47619  p(0) = 0.52381
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 0.3  p(0) = 0.7
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0.5  p(0) = 0.5
observed value = 0 p(1) = 0  p(0) = 1
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 1  p(0) = 0
observed value = 0 p(1) = 0  p(0) = 1
 
number of groups = 59
 

Проект приаттачен, можно поиграться)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 19, 2019, 17:19
Можно) Интересно было бы сравнить)
А можете выложить последовательность?
Да, конечно) Но позже..)

Прикрепляю для сравнения реальные данные. На них сеть просто идеально отработала)
Код
C++ (Qt)
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
observed value = 0 p(1) = 0.921875  p(0) = 0.078125
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0  p(0) = 1
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 0 p(1) = 0.0448878  p(0) = 0.955112
observed value = 1 p(1) = 0.0448878  p(0) = 0.955112
observed value = 1 p(1) = 0.944444  p(0) = 0.0555556
observed value = 1 p(1) = 0.941176  p(0) = 0.0588235
observed value = 1 p(1) = 1  p(0) = 0
observed value = 1 p(1) = 0.921875  p(0) = 0.078125
 

Файлик с данными в аттаче)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 19, 2019, 21:12
Поигрался с tiny_dnn, на тестовой последовательности (sin(i) + cos(4*i) >= 0) вот такой результат:
Код:
Generate source...
Prepare datas...
Training...
epoch = 100/1000
epoch = 200/1000
epoch = 300/1000
epoch = 400/1000
epoch = 500/1000
epoch = 600/1000
epoch = 700/1000
epoch = 800/1000
epoch = 900/1000
epoch = 1000/1000
Checking...
i = 500 observed = 0 predicted0 = 0.982339 predicted1 = 0.0130699
i = 501 observed = 0 predicted0 = 0.463006 predicted1 = 0.54449
i = 502 observed = 0 predicted0 = 0.964694 predicted1 = 0.0568292
i = 503 observed = 1 predicted0 = -0.0217657 predicted1 = 1.01777
i = 504 observed = 1 predicted0 = -0.0199576 predicted1 = 1.02494
i = 505 observed = 0 predicted0 = 1.00691 predicted1 = -0.0121645
i = 506 observed = 1 predicted0 = -0.0239787 predicted1 = 1.02294
i = 507 observed = 0 predicted0 = 0.962106 predicted1 = 0.0530213
i = 508 observed = 0 predicted0 = 0.972935 predicted1 = 0.0304997
i = 509 observed = 1 predicted0 = -0.020028 predicted1 = 1.04145
i = 510 observed = 1 predicted0 = 0.104954 predicted1 = 0.902725
i = 511 observed = 1 predicted0 = -0.0344391 predicted1 = 1.03813
i = 512 observed = 1 predicted0 = -0.0232968 predicted1 = 1.02557
i = 513 observed = 0 predicted0 = 0.977863 predicted1 = 0.0280755
i = 514 observed = 0 predicted0 = 0.965899 predicted1 = 0.0414848
i = 515 observed = 1 predicted0 = 0.0409188 predicted1 = 0.977059
i = 516 observed = 0 predicted0 = 0.987053 predicted1 = 0.0240999
i = 517 observed = 1 predicted0 = -0.0230293 predicted1 = 1.02866
i = 518 observed = 1 predicted0 = -0.0182573 predicted1 = 1.02402
i = 519 observed = 0 predicted0 = 0.988447 predicted1 = 0.0201739
i = 520 observed = 0 predicted0 = 0.979333 predicted1 = 0.0346248
i = 521 observed = 0 predicted0 = 0.982198 predicted1 = 0.0327407
i = 522 observed = 1 predicted0 = 0.488875 predicted1 = 0.523117
i = 523 observed = 1 predicted0 = -0.0182998 predicted1 = 1.02597
i = 524 observed = 0 predicted0 = 0.996294 predicted1 = 0.00668677
i = 525 observed = 0 predicted0 = 0.524088 predicted1 = 0.479666
i = 526 observed = 0 predicted0 = 0.976493 predicted1 = 0.029696
i = 527 observed = 0 predicted0 = 0.981843 predicted1 = 0.0314973
i = 528 observed = 1 predicted0 = -0.0170248 predicted1 = 1.02021
i = 529 observed = 1 predicted0 = 0.000147805 predicted1 = 0.991886
i = 530 observed = 0 predicted0 = 0.495998 predicted1 = 0.501123
i = 531 observed = 1 predicted0 = 0.463006 predicted1 = 0.54449
i = 532 observed = 0 predicted0 = 0.965241 predicted1 = 0.0396554
i = 533 observed = 0 predicted0 = 0.974981 predicted1 = 0.0321968
i = 534 observed = 1 predicted0 = -0.0154935 predicted1 = 1.01879
i = 535 observed = 0 predicted0 = 0.104954 predicted1 = 0.902725
i = 536 observed = 1 predicted0 = -0.0244336 predicted1 = 1.04083
i = 537 observed = 1 predicted0 = -0.0257705 predicted1 = 1.03416
i = 538 observed = 0 predicted0 = 0.989959 predicted1 = 0.00164001
i = 539 observed = 0 predicted0 = 0.948124 predicted1 = 0.0420177
i = 540 observed = 0 predicted0 = 0.97792 predicted1 = 0.0555568
i = 541 observed = 0 predicted0 = 0.488875 predicted1 = 0.523117
i = 542 observed = 1 predicted0 = -0.0205053 predicted1 = 1.02438
i = 543 observed = 1 predicted0 = 0.645398 predicted1 = 0.362072
i = 544 observed = 0 predicted0 = 0.982339 predicted1 = 0.0130699
i = 545 observed = 0 predicted0 = 0.463006 predicted1 = 0.54449
i = 546 observed = 0 predicted0 = 0.964694 predicted1 = 0.0568292
i = 547 observed = 1 predicted0 = -0.0217657 predicted1 = 1.01777
i = 548 observed = 1 predicted0 = -0.0199576 predicted1 = 1.02494
i = 549 observed = 0 predicted0 = 1.00691 predicted1 = -0.0121645

Завтра попробую данные из файла.

Нужно будет поиграться с размером запроса.


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 19, 2019, 21:22
Нужно будет поиграться с размером запроса.
Увеличил запрос с 10 до 20 значений и сразу 100% точность.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 19, 2019, 21:28
Цитировать
Поигрался с tiny_dnn, на тестовой последовательности (sin(i) + cos(4*i) >= 0) вот такой результат:
Спасибо) Такое ощущение, что хуже..

На самом деле есть реальная функция, зашумлённая на мелком масштабе, а на больших масштабах уже можно увидеть некоторые корреляции. Я блурю этуфункцию, беру производную (числено) и перевожу в бинарный вид: всё что больше 0 = 1, а всё что меньше = 0.
В прикреплённом файле функция слишком сильно разблурена и корреляции проявляются на большом масштабе >> period. Таким образом, последние результаты, приведённые мной не показательны (

Сижу разбираюсь ещё..)  


  


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 19, 2019, 21:35
Нужно будет поиграться с размером запроса.
Увеличил запрос с 10 до 20 значений и сразу 100% точность.
Круто) У меня 95% совпадений максимум получается) Но обучение практически мгновенно)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 19, 2019, 21:37
Круто) У меня 95% совпадений максимум получается) Но обучение практически мгновенно)
А я устал ждать, Кроватный ноутбук не очень быстр. :)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 09:23
У меня 95% совпадений максимум получается)
Сейчас увеличил длину последовательности для обучения до 2000 значений, проверяю на следующих 500 значениях, размер запроса 30 значений.
Количество ошибок 7 из 500 (1.4%)



Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 09:59
Цитировать
Сейчас увеличил длину последовательности для обучения до 2000 значений, проверяю на следующих 500 значениях, размер запроса 30 значений.
Количество ошибок 7 из 500 (1.4%)
А вы не могли бы исходники выложить? Хочу посмотреть сколько по времени она у меня обучаться будет.. :)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 10:03
А вы не могли бы исходники выложить? Хочу посмотреть сколько по времени она у меня обучаться будет.. :)
Код
C++ (Qt)
#include <iostream>
#include <vector>
#include <boost/format.hpp>
#include "tiny_dnn/tiny_dnn.h"
 
using namespace std;
using namespace tiny_dnn;
using boost::format;
 
static constexpr size_t IN_SIZE       = 30;   // число предыдущих шагов для определения вероятности следующего шага
static constexpr size_t OUT_SIZE      = 2;
static constexpr size_t SIZE          = 2500; // Полный размер данных
static constexpr size_t TRAINING_SIZE = 2000; // Часть данных, для обучения сети
static constexpr size_t BATCH_SIZE    = 10;
static constexpr size_t EPOCHS        = 1000;
 
inline float toValue( bool v )
{
 return v? 1. : 0.;
}
 
int main( int /*argc*/, char */*argv*/[] )
{
 network<sequential> net;
 net << fully_connected_layer( IN_SIZE, 30 )
     << tanh_layer()
     << fully_connected_layer( 30, 30 )
     << tanh_layer()
     << fully_connected_layer( 30, OUT_SIZE );
 
 cout << "Generate source..." << endl;
 vector<bool> source( SIZE );
 for( size_t i = 0; i < source.size(); ++i )
   source[ i ] = sin( i ) + cos( 4 * i ) >= 0;
 
 cout << "Prepare datas..." << endl;
 const size_t numData = TRAINING_SIZE - IN_SIZE;
 
 std::vector<vec_t> inData;
 inData.reserve( numData );
 std::vector<vec_t> outData;
 outData.reserve( numData );
 for( size_t i = IN_SIZE; i < TRAINING_SIZE; ++i )
 {
   vec_t vIn( IN_SIZE );
   for( size_t j = 0; j < IN_SIZE; ++j )
     vIn[ j ] = toValue( source[ i - IN_SIZE + j ] );
 
   vec_t vOut( OUT_SIZE );
   vOut[ 0 ] = toValue( !source[ i ] );
   vOut[ 1 ] = toValue( source[ i ] );
 
   inData.push_back( vIn );
   outData.push_back( vOut );
 }
 
 int iEpoch = 0;
 auto on_enumerate_epoch = [&](){
   if( ++iEpoch % 100 )
     return;
 
   const double loss = net.get_loss<mse>( inData, outData );
   cout << format( "epoch = %1%/%2% loss = %3%" ) % iEpoch % EPOCHS % loss << endl;
 };
 
 cout << "Training..." << endl;
 adamax opt;
 net.fit<mse>( opt, inData, outData, BATCH_SIZE, EPOCHS, [](){}, on_enumerate_epoch );
 
 cout << "Checking..." << endl;
 size_t errCnt = 0;
 for( size_t i = TRAINING_SIZE; i < SIZE; ++i )
 {
   vec_t vIn( IN_SIZE );
   for( size_t j = 0; j < IN_SIZE; ++j )
     vIn[ j ] = toValue( source[ i - IN_SIZE + j ] );
 
   const vec_t vOut = net.predict( vIn );
   assert( vOut.size() == 2 );
 
   const bool observed = source[ i ];
   const bool predicted = vOut[ 0 ] < vOut[ 1 ];
   cout << format( "i = %1%\t[%2%]\tobserved = %3%\tpredicted = %4%\t[0] = %5%\t[1] = %6%" )
           % i
           % ((observed != predicted)? '!' : ' ')
           % observed
           % predicted
           % vOut[ 0 ]
           % vOut[ 1 ]
         << std::endl;
 
   if( observed != predicted )
     ++errCnt;
 }
 
 cout << format( "Error = %1%/%2% %3%%%" ) % errCnt % (SIZE - TRAINING_SIZE) % (float( errCnt ) / float( SIZE - TRAINING_SIZE ) * 100.) << std::endl;
 
 return 0;
}
 


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 10:14
Хочу посмотреть сколько по времени она у меня обучаться будет.. :)
Количество эпох можно значительно уменьшить, без потери точности.
Сейчас уменьшил их до 100, точность осталась та же.


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 10:36
Начал играться со структурой сети: сделал 32 входа - первый скрытый слой на 32 нейрона - второй скрытый слой на 16 нейронов - 2 выхода.
Точность:
Error = 3/500 0.6%

Это при 100 эпохах.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 12:38
Хе, хе  :) Если усложнить функцию, добавив ещё одну быструю гармонику:
Код
C++ (Qt)
sin( i ) + cos( 4 * i ) + sin( 8 * i )
 
то обе сети сравниваются, при прочих равных параметрах (IN_SIZE = period = 30)
А вот по времени  :)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 13:12
Вы про время обучения?
Ну для задачи предсказания я бы его не учитывал. :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 13:19
Вы про время обучения?
Ну для задачи предсказания я бы его не учитывал. :)
Ну это да)

Вобщем резюме такое: нейросети рулят :)
Как сказал Педро Домингос:
"Люди беспокоятся, что компьютеры станут слишком умными и захватят мир,
но реальная проблема в том, что они слишком глупы и уже его захватили".  :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 13:43
Мне вот ещё интересно, как прокомментируют результаты этих двух тестов, два наших  Главных уважаемых эксперта?  :)


Название: Re: К проблеме предсказания событий
Отправлено: ViTech от Октябрь 20, 2019, 14:58
Мне вот ещё интересно, как прокомментируют результаты этих двух тестов, два наших  Главных уважаемых эксперта?  :)

А это кто такие и почему их всего два? Остальные, значит, !(главные && уважаемые && эксперты)? Обидно будет :).

Код не смотрел. Нейросеть - это, конечно, хорошо. Но с разбодяженой синусоидой разве анализ Фурье не справится? С нейросетью не получается ли из пушки по воробьям стрелять?

И, главный вопрос: когда ждать обвала фондовых рынков? :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 15:14
Цитировать
А это кто такие и почему их всего два? Остальные, значит, !(главные && уважаемые && эксперты)? Обидно будет  :)
Ну почему же) У нас все участники форума весьма уважаемые и эксперты в своих областях)
Просто есть двое из лорца, которые более главнее) Да, мир не справедлив, примите это как данность)

Цитировать
Код не смотрел. Нейросеть - это, конечно, хорошо. Но с разбодяженой синусоидой разве анализ Фурье не справится? С нейросетью не получается ли из пушки по воробьям стрелять?

Справился бы) А вот с фондовыми рынками едва ли)

Цитировать
И, главный вопрос: когда ждать обвала фондовых рынков?  :)
А чего ждать) Обучаете нейросеть, и рушите биржу за биржей) Профит: Вы на солидной яхте, попивая виски,  похлопываете по попе молоденьких моделей)
Только если что, вы потом про нас с Old'ом не забудьте, ладно  ;) (Я про финансовый вопрос, а не про "по попе"  :))


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 19:22
Цитировать
И, главный вопрос: когда ждать обвала фондовых рынков?  :)
Кстатии, а почему бы и не проверить всё это дело на динамике стоимости акций или аблигаций или ещё чего на фондовом рынке?  :)
Правда, нужен открытый доступ (на большом промежуток времени) к данным по этой самой динамике..  

И потом, там функция не бинарная..( 


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 19:27
Кстатии, а почему бы и не проверить всё это дело на динамике стоимости акций или аблигаций или ещё чего на фондовом рынке?  :)
Правда, нужен открытый доступ (на большом промежуток времени) к данным по этой самой динамике..   
Нейронки там уже давно и успешно используют. Насколько я слышал. :)
У них там есть определенный набор фигур, типа после роста с тремя горбами начинается затяжной спад, и т.д.
Раньше их рассматривали трейдеры на графиках и делали прогнозы, а сейчас нейросетки.


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 19:29
И потом, там функция не бинарная..( 
Ну и что, можно учить сеть на "начнется спад", "будет все ровно" и "бурный рост". :)
Мы ей данные за месяц - она нам прогноз на неделю. :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 19:31
Кстатии, а почему бы и не проверить всё это дело на динамике стоимости акций или аблигаций или ещё чего на фондовом рынке?  :)
Правда, нужен открытый доступ (на большом промежуток времени) к данным по этой самой динамике..  
Нейронки там уже давно и успешно используют. Насколько я слышал. :)
У них там есть определенный набор фигур, типа после роста с тремя горбами начинается затяжной спад, и т.д.
Раньше их рассматривали трейдеры на графиках и делали прогнозы, а сейчас нейросетки.


Ну вот, обрадовали) А у меня уж тут планы.. Кредит на яхту взял  :(


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 19:34
И потом, там функция не бинарная..( 
Ну и что, можно учить сеть на "начнется спад", "будет все ровно" и "бурный рост". :)
Мы ей данные за месяц - она нам прогноз на неделю. :)

А сколько по времени она обучаться будет, если функция непрерывная?  И если динамика быстрая: дни, часы.. Классические нейронки также справляются?


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 19:47
А сколько по времени она обучаться будет, если функция непрерывная?  И если динамика быстрая: дни, часы.. Классические нейронки также справляются?
Ну так сеть можно доучивать по мере поступления данных.
А скорость обучение можно повысить задействовав GPU. У меня это дало ускорение в десятки раз по сравнению с вычислением на i8. А есть специализированные процессоры...

И в биржевых торгах, наверное, сеть натаскивают на определенный набор фигур, им не нужно на непрерывный поток тренировать. Еще раз наверное. :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 20:08
Цитировать
А скорость обучение можно повысить задействовав GPU.
Эта возможность, как я понимаю, уже под капотом конкретной библиотеки? Просто время обучения - это сейчас узкое горло нейросетей, над решением которого очень интенсивно бъются) Кстатии, градиентный спуск.. Наш minsearch не страдает теми детскими болезнями) И устойчив по отношению к сваливанию в локальный минимум) Всё опубликовать его не можем..( У меня голова другим забита, а мой коллега диссер пишет.. ему тоже не до этого(

Цитировать
У меня это дало ускорение в десятки раз по сравнению с вычислением на i8.
А здесь мы видели ускорение порядка 10^4-10^5 на обычном CPU :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 20:19
Цитировать
А здесь мы видели ускорение порядка 10^4-10^5 на обычном CPU  :)
Но согласен, здесь задача очень частная просто..


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 20:26
Эта возможность, как я понимаю, уже под капотом конкретной библиотеки?
Я сильно не упирался пока, но у меня не получилось с наскока запустить ее с OpenCL. А может это у меня на ноуте с двумя видюхами она не запустила CUDA на второй nvidia.
Завтра на работе попробую на рабочем десктопе.
Я до этого игрался с библиотекой skynet. Вот с ней эффект виден невооруженным глазом, но у skynet есть свои косяки, она не может/поломано сохранение модели сети из GPU. Чинить тоже нет ни времени, ни желания. :(

Наш minsearch не страдает теми детскими болезнями)
Здесь больше задача классификации, когда мы показываем сети разные графики, а она говорит что это такое.
Ваш minsearch умеет классифицировать?


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 20:40
Цитировать
Ваш minsearch умеет классифицировать?
Он умеет искать глобальный минимум функции многих переменных, причём, если он его нащупал, то он экспоненциально быстро к нему сходится.. И ещё он может "выкорабкиваться" из локальных минимумов.. И ещё он хорошо параллелится  :)
Другой вопрос, можно ли проблему классификации связать к проблеме минимизации.. Это мне вот так, с наскока, не очевидно..


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 20, 2019, 20:49
Другой вопрос, можно ли проблему классификации связать к проблеме минимизации.. Это мне вот так, с наскока, не очевидно..
Тоже затрудняюсь ответить.
Посмотрел несколько трейдерских фигур, по мне так нейронку можно на них натренировать, а она будет говорить вероятность смены тренда.

https://tradexperts.ru/tehnicheskij-analiz-foreks/figury/figury-razvorota-i-prodolzheniya
Внизу есть перечень основных фигур.


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 20, 2019, 21:55
Цитировать
Посмотрел несколько трейдерских фигур, по мне так нейронку можно на них натренировать, а она будет говорить вероятность смены тренда.
Спасибо за ссылку, почитал. У меня сложилось несколько скептическое, и я бы даже сказал, неоднозначное чувство к корректности их оценки, поэтому от комментариев воздержусь, а выскажу свои соображения.

Я заметил, что есть две, на мой взгляд, наиболее важные закономерности в этой истории, а именно: можно выделить два масштаба корреляций - первый, это мелкомасштабный, сильно зашумлённый, практически не отличимый от белого шума. И амплитуда такого шума мала (по сравнению с общим трендом). Второе - это то, что практически в большинстве случаев, на больших масштабах можно выделить линейный тренд: либо ниспадающий, либо наоборот, ну или, почти, никакой  :) А мы знаем, что производная от линейной функции - это константа. А это означает, что если избавиться от мелких флуктуаций, например, разблурив кривую, и взять от неё производную  :), то график становится более наглядным и удобным для дальнейшего анализа) Т.е. он после этой операции будет колебаться вокруг некоторого среднего (которое соответствует наклону тренда), флуктуируя с амплитудой, порядка среднеквадратичного отклонения (точнее корню от неё). Самое интересное, как распределенны пики (минимумы и максимумы) такой кривой. Сразу скажу, что, на основе опыта прошедших дней, могу сказать, что нейросети легко распознают исходный тренд (т.е. его наклон)). Так вот, гораздо конструктивнее (на мой взгляд) анализировать и натравливать нейросеть на производную сглаженной функции) А саму исходную функцию легко восстановить, простым интегрированием)

Если что, можно замутить совместное исследоание по реальным данным по этому вопросу) Взломаем, так сказать, систему)  Мне это интересно, чисто, с академической точки зрения)


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 21, 2019, 07:48
Спасибо за ссылку, почитал. У меня сложилось несколько скептическое, и я бы даже сказал, неоднозначное чувство к корректности их оценки, поэтому от комментариев воздержусь, а выскажу свои соображения.
По мне, так это вообще все высосано из пальца. :)

Если что, можно замутить совместное исследоание по реальным данным по этому вопросу) Взломаем, так сказать, систему)  Мне это интересно, чисто, с академической точки зрения)
Интересное предложение, но мне эта тема интересна в первую очередь для классификации физических сигналов.
Тут флуктуации появляются из-за среды распространения сигнала, внешних факторов, аппаратуры съёма и т.д.
На тестовых сигналах (с генерированных вручную) я сеть проверил, вроде результаты не плохие, но на реальных данных сеть пока не тестировалась.

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


Название: Re: К проблеме предсказания событий
Отправлено: ViTech от Октябрь 21, 2019, 11:15
Спасибо за ссылку, почитал. У меня сложилось несколько скептическое, и я бы даже сказал, неоднозначное чувство к корректности их оценки, поэтому от комментариев воздержусь, а выскажу свои соображения.
По мне, так это вообще все высосано из пальца. :)

Если бы всё было так просто, как на тех картинках (и не только), все давно бы уже на яхтах плавали :).


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 21, 2019, 11:45
Если бы всё было так просто, как на тех картинках (и не только), все давно бы уже на яхтах плавали :).
Так я про это и говорю. Принимать решение по фигурам на графике это что-то из области магии. :)


Название: Re: К проблеме предсказания событий
Отправлено: ViTech от Октябрь 21, 2019, 11:57
Так я про это и говорю. Принимать решение по фигурам на графике это что-то из области магии. :)

Я ж и поддерживаю :). В тех магических техниках не хватает слова "вероятно". Причём подозреваю, вероятность будет колебаться в районе 0.5, как и в любой другой точке графика :).


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 21, 2019, 12:15
Я ж и поддерживаю :). В тех магических техниках не хватает слова "вероятно". Причём подозреваю, вероятность будет колебаться в районе 0.5, как и в любой другой точке графика :).
Обычная вероятность встретить динозавра - 50%, можно встретить, можно не встретить. :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 22, 2019, 22:44
Спасибо за ссылку, почитал. У меня сложилось несколько скептическое, и я бы даже сказал, неоднозначное чувство к корректности их оценки, поэтому от комментариев воздержусь, а выскажу свои соображения.
По мне, так это вообще все высосано из пальца. :)

Если что, можно замутить совместное исследоание по реальным данным по этому вопросу) Взломаем, так сказать, систему)  Мне это интересно, чисто, с академической точки зрения)
Интересное предложение, но мне эта тема интересна в первую очередь для классификации физических сигналов.
Тут флуктуации появляются из-за среды распространения сигнала, внешних факторов, аппаратуры съёма и т.д.
На тестовых сигналах (с генерированных вручную) я сеть проверил, вроде результаты не плохие, но на реальных данных сеть пока не тестировалась.

Только плотно заняться этой темой у меня получиться не раньше нового года, сейчас загрузка большая на других проектах. :(
А сколько в вашей задаче класифицирующих параметров? Просто есть проблема (не тривиальная), когда один класс может относится к нескольким группамм.. И вот здесь возникает проблема разбития множества на группы с условием, чтоб минимизировать дисперсию наблюдаемой величины.. Т.е. вы подаёте на вход N размерный вектор параметров, а на выходе ожидаете M мерный вектор результатов..  У каждого результата есть своё мат. ожидание и дисперсия. Проблема сводится к тому, чтоб оптимально разделить всё множество на группы, и чтоб суммарная дисперсия была минимальна..  На сколько я знаю, эта задача ещё доконца не решена..

Пример: У вас есть множество еденичных векторов в D-мерном пространстве.. D>>1. Нужно оптимально, по определённому критерию, выделить N групп, включающих в себя все исчерпывающие классы таких векторов.. Сколько таких групп в среднем будет? Можно ли это как то аналитически вывести?

Я не знаю) Но есть идеи, как это можно с помощью computer science реализовать) 


Название: Re: К проблеме предсказания событий
Отправлено: Old от Октябрь 23, 2019, 07:56
А сколько в вашей задаче класифицирующих параметров?
Мне интересно определять форму кривой.
Входные данные это одномерный массив амплитуд во времени.

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

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

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

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

Вот как-то так я обдумываю. :)


Название: Re: К проблеме предсказания событий
Отправлено: m_ax от Октябрь 27, 2019, 16:55
Усовершенствовал алгоритм и перевёл всё на bitset. Всё стало просто летать)
На вход подаётся bitset<IN_SIZE>, на выходе bitset<OUT_SIZE>

Провёл сравнительные тесты на зашумлённых данных:
Код
C++ (Qt)
sin(x+pi*i/4.0)
 
где x - случайная величина на интервале [0, pi/2].

Результаты для tiny_dnn и vanda (на боьшой выборке N = 480 испытаний):
Код
Bash
tiny_dnn:
=================================
Total p = 0.887292 +- 0.104493
Training time = 149152 ms
 
Total p = 0.867292 +- 0.119214
Training time = 148662 ms
 
Total p = 0.878542 +- 0.110621
Training time = 147957 ms
 
Total p = 0.876667 +- 0.112411
Training time = 148513 ms
 
Total p = 0.86875 +- 0.117555
Training time = 148443 ms
 
vanda:
=================================
Total p = 0.875 +- 0.113129
Total groups = 16
Training time = 0 ms
 
Total p = 0.878958 +- 0.110667
Total groups = 20
Training time = 0 ms
 
Total p = 0.861667 +- 0.125094
Total groups = 20
Training time = 0 ms
 
Total p = 0.870417 +- 0.117708
Total groups = 22
Training time = 0 ms
 
Total p = 0.873125 +- 0.114757
Total groups = 8
Training time = 0 ms
 
Примерно 87% правильных ответов. Статистически результаты у обоих вариантов практически не отличимы, а вот время обучения отличается на 6 порядков  :)
Это круто  :)