Как предсказать, когда произойдет следующее событие на основе предыдущих событий?

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

Я уже читал этот, но ответы не совсем помогают мне, что я имею в виду для моего проекта. Я сделал несколько дополнительных исследований и обнаружил, что "Скрытая марковская модель", вероятно, позволит мне сделать это точно, но я не могу найти ссылку на как создать скрытую марковскую модель, используя только список раз. Я также обнаружил, что использование Статистическом стеке, CrossValidated. Если вы знаете, что я должен делать, отправьте либо здесь, либо там.

Ответ 1

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

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

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

Конечно, проблема с большим количеством источников данных заключается в том, что есть дополнительные возможности для создания систем, которые собирают данные.

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

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

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

Пример независимой от времени шаблона заключается в том, что каждый раз, когда Майк в бухгалтерском учете распечатывает лист списков счетов, он переходит к Джонатану, который через несколько часов печатает довольно большую партию полных счетов-фактур. Такие вещи сложнее обнаружить, потому что это более бесплатная форма. Я рекомендую смотреть различные промежутки времени (например, 30 секунд, 40 секунд, 50 секунд, 1 минута, 1,2 минуты, 1,5 минуты, 1,7 минуты, 2 минуты, 3 минуты,... 1 час, 2 часа, 3 часа,....) и подвыразить их с помощью красивого способа (например, повторная выборка Lanczos) для создания вектора. Затем используйте алгоритм стиля vector-quantization, чтобы классифицировать "интересные" шаблоны. Вам нужно будет тщательно подумать о том, как вы будете иметь дело с определенностью категорий, хотя, если ваша результирующая категория имеет очень мало данных в ней, она, вероятно, не является надежной. (Некоторые алгоритмы векторного квантования лучше, чем другие.)

Затем, чтобы создать прогноз относительно вероятности печати чего-либо в будущем, найдите самые последние интервалы активности (30 секунд, 40 секунд, 50 секунд, 1 минута и все остальные интервалы) с помощью векторного квантования и взвешивают результаты на основе их уверенности в создании средневзвешенного прогноза.

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

Подобная ситуация типична для схем интеллектуального сжатия данных. Я рекомендую вам взглянуть на PAQ, так как у него появилось много концепций, которые я здесь рассмотрел, и могу предоставить очень интересную информацию, Исходный код даже доступен вместе с отличной документацией по используемым алгоритмам.

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

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

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

Удачи!

Ответ 2

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

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

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

A - 1 to 2 minutes
B - 2 to 5 minutes
C - 5 to 10 minutes
etc.

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

Ответ 3

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

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

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

Ответ 4

Подумайте о цепочке марков, как граф с вершиной, соединяющей друг с другом с весом или расстоянием. Движение вокруг этого графика будет поглощать сумму весов или расстояние, которое вы путешествуете. Ниже приведен пример генерации текста: http://phpir.com/text-generation.

Ответ 5

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

Похоже, что у вас нет базовой модели, и вы ловите рыбу вокруг: у вас есть гвоздь, и вы проходите через инструментарий, проверяя файлы, шуруповерты и ленточные измерения 8 ^)

Мой лучший совет: во-первых, используйте то, что вы знаете о проблеме, чтобы построить модель; затем выясните, как решить проблему, основанную на модели.

Ответ 6

Я думаю, что прогностическая нейронная сеть будет хорошим подходом для этой задачи. http://en.wikipedia.org/wiki/Predictive_analytics#Neural_networks

Этот метод также используется для прогнозирования f.x. прогнозирование погоды, отмеченные запасы, солнечные пятна. Там есть учебник, если вы хотите узнать больше о том, как это работает. http://www.obitko.com/tutorials/neural-network-prediction/