Предсказать следующее событие, основываясь на прошлых событиях - PullRequest
16 голосов
/ 17 апреля 2009

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

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

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

Что я спрашиваю или что мне следует изучать?

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

Ответы [ 8 ]

8 голосов
/ 17 апреля 2009

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

4 голосов
/ 17 апреля 2009

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

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

В псевдопионе приведен примерный набросок марковского цепочки / сценария прогнозирования:

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])
2 голосов
/ 17 апреля 2009

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

2 голосов
/ 17 апреля 2009

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

1 голос
/ 17 апреля 2009

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

0 голосов
/ 08 сентября 2016

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

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

0 голосов
/ 17 апреля 2009

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

0 голосов
/ 17 апреля 2009

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

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

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

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

...