Предсказать следующее событие, основанное на прошлых событиях

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

Например, я понимаю, что это будет примерно так:

Статическое событие происходит 1 января, 1 февраля, 3 марта, 4 апреля. Простым решением было бы усреднить дни/часы/минуты/что-то между каждым вхождением, добавить это число к последнему известному вхождению и предсказать.

Что я прошу, или что я должен изучать?

Нет конкретной цели или каких-либо конкретных переменных для учета. Это просто личное мышление и возможность для меня узнать что-то новое.

Ответ 2

Это может быть излишним, но Цепочки Markov могут привести к некоторому довольно крутому шаблону. Это лучше подходит для цепей событий: идея основана на последних N шагах в цепочке событий, что будет дальше?

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

В псевдо-питоне, здесь грубый эскиз марковского цепного строителя/предсказания script:

n = how_big_a_chain_you_want
def build_map(eventChain):
    map = defaultdict(list)
    for events in get_all_n_plus_1_item_slices_of(eventChain):
        slice = events[:n]
        last = events[-1]
        map[slice].append(last)

def predict_next_event(whatsHappenedSoFar, map):
    slice = whatsHappenedSoFar[-n:]
    return random_choice(map[slice])

Ответ 3

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

Ответ 4

Если у вас есть модель (например, события происходят регулярно), то применение фильтра Калмана к параметрам этой модели является распространенным методом.

Ответ 5

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

Ответ 6

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

Ответ 7

Задача очень похожа на задачу моделирования языка, где задана последовательность слов истории, которую модель пытается предсказать распределение вероятности по лексике для следующего слова.

Существуют программные средства с открытым исходным кодом, такие как SRILM и NLTK, которые могут просто получить ваши последовательности в качестве входных предложений (каждый event_id - это слово) и выполнить задание.

Ответ 8

Вам следует google Алгоритмы генетического программирования

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

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

Хотя это чертовски много работы, чтобы заставить их работать в первую очередь!