如何根据以前的事件预测下一个事件发生的时间?

时间:2011-09-30 19:42:52

标签: statistics prediction

基本上,我有一个相当大的列表(一年的数据),单个离散事件发生的次数(对于我当前的项目,有人打印某些东西的列表)。根据这个列表,我想构建一个统计模型,它可以预测下一个事件(下一个打印作业)的最可能时间,给出所有之前的事件时间。

我已经阅读了this,但是对于我的项目,回复并没有完全帮助我。我做了一些额外的研究,发现Hidden Markov Model可能允许我准确地这样做,但我找不到如何仅使用一个列表生成隐马尔可夫模型的链接。我还发现在列表中使用Kalman filter可能很有用,但基本上,我想从实际使用它们的人那里获得更多关于它的信息,并且在尝试某些事情并希望它之前知道它们的局限性和要求。的工作原理。

非常感谢!

编辑:所以,根据Amit在评论中的建议,我也将其发布到了Statistics StackExchange, CrossValidated。如果你确实知道我应该做什么,请在这里或那里张贴

6 个答案:

答案 0 :(得分:7)

我承认,我不是一个统计类型的人。但我以前遇到过这类问题。我们在这里真正谈到的是你有一些观察到的,离散的事件,你想知道可能你是怎么看到它们在任何给定的时间点发生的。您遇到的问题是您希望获取离散数据并从中获取连续数据。

我想到的一词是density estimation。具体来说是kernel density estimation。您可以通过简单的分级来获得内核密度估计的一些影响(例如,计算时间间隔中的数字事件,例如每四分之一小时或小时。)核密度估计比简单分级具有更好的统计特性。 (生成的数据通常更平滑。)

但这只会解决你的一个问题。下一个问题仍然是更有趣的问题 - 如何获取数据的时间线(在这种情况下,只有打印机数据)并从中产生预测?第一件事 - 你设置问题的方式可能不是你想要的。虽然拥有有限的数据源并预测该源的下一步的奇迹想法听起来很有吸引力,但集成更多数据源以创建实际预测更为实际。 (例如,在那些电话活动很多之后,打印机可能会受到严重影响 - 这在某些公司很难预测)Netflix Challenge是这方面的一个相当有力的例子。

当然,更多数据源的问题在于,设置收集数据的系统需要额外的工作量。

老实说,我认为这是一个特定于域的问题,并采取两种方法:找到与时间无关的模式,并找到与时间相关的模式。

一个时间依赖的示例模式是每周4:30的时候Suzy打印出她当天的结束报告。这发生在一周中每天的特定时间。这种东西很容易以固定的间隔检测到。 (每天,每周,每个周末,每个星期二,每个月的第1个等等。)这是非常简单的以预定的间隔检测 - 只需创建一个估计的概率密度函数曲线&#39 ; s一周长并回到过去并平均曲线(可能通过窗口函数加权平均值以获得更好的预测)。

如果您想要更复杂,请找到一种自动检测此类间隔的方法。 (可能数据不会如此强大,以至于你可以蛮力这个。)

一个与时间无关的示例模式是,每次会计中的迈克打印出发票清单时,他都会转到Johnathan,后者在几小时后打印出一大批完整的发票报表。这种事情很难被发现,因为它是更自由的形式。我建议查看不同的时间间隔(例如30秒,40秒,50秒,1分钟,1.2分钟,1.5分钟,1.7分钟,2分钟,3分钟,...... 1小时,2小时,3小时, ....)并以一种很好的方式(例如Lanczos resampling)对它们进行二次采样以创建一个向量。然后使用vector-quantization样式算法对"有趣的"进行分类。图案。但是,您需要仔细考虑如何处理类别的确定性 - 如果您生成的类别中的数据非常少,那么它可能并不可靠。 (有些矢量量化算法比其他算法更好。)

然后,要创建关于将来打印某些内容的可能性的预测,请通过矢量量化查找最近的活动间隔(30秒,40秒,50秒,1分钟和所有其他间隔)根据确定性对结果进行加权,以创建预测的加权平均值。

您希望找到一种很好的方法来衡量与时间相关且与时间无关的输出的确定性,以创建最终估算值。

这种情况是典型的预测数据压缩方案。我建议你看一下PAQ,因为它有很多我在这里过去的概念,可以提供一些非常有趣的见解。源代码甚至可以提供有关所用算法的优秀文档。

您可能希望采用完全不同的矢量量化方法,并将数据离散化,并使用更像PPM方案的方法。它可以非常简单地实施并且仍然有效。

我不知道这个项目的时间范围或范围是什么,但是这种事情总是可以达到N度。如果它有一个截止日期,我想强调你担心先让一些工作,然后让它运作良好。不理想的东西总比没有好。

这类项目。如果你把它包起来,这种项目可以帮你找到一份工作。我建议您花点时间,做正确的事,并将其作为功能,开源,有用的软件发布。我强烈推荐开源,因为您希望建立一个社区,可以在您可以访问,支持或支持的更多环境中贡献数据源提供者。

祝你好运!

答案 1 :(得分:1)

我真的不知道马尔可夫模型在这里有用。当您预测的事件取决于先前的事件时,通常会使用马尔可夫模型。当然,规范的例子是文本,其中一个好的马尔可夫模型可以很好地猜测下一个字符或单词将会是什么。

但是,当用户打印下一件事情时,是否存在一种模式?也就是说,你看到工作之间有规律的时间模式吗?如果是这样,那么马尔可夫模型将起作用。如果没有,则马尔可夫模型将是随机猜测。

在如何建模中,将作业之间的不同时间段视为字母表中的字母。实际上,您可以为每个时间段分配一个字母,例如:

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

然后,浏览数据并为打印作业之间的每个时间段分配一个字母。完成后,您将获得数据的文本表示,并且可以运行任何执行文本预测的Markov示例。

答案 2 :(得分:1)

如果您认为某个实际模型可能与问题域相关,则应该应用它。例如,可能存在与星期几,时间和可能日期相关的模式(假设可能会显示较低的使用率)。

大多数基于检查(比方说)相邻事件之间的时间的原始统计建模技术难以捕捉这些潜在的影响。

我会为每个已知事件(星期几等)构建统计模型,并使用它来预测未来事件。

答案 3 :(得分:1)

我认为预测神经网络对于这项任务来说是一个很好的方法。 http://en.wikipedia.org/wiki/Predictive_analytics#Neural_networks

此方法也用于预测f.x.天气预报,库存标记,太阳黑子。 如果你想了解它的工作原理,可以在这里找到一个教程。 http://www.obitko.com/tutorials/neural-network-prediction/

答案 4 :(得分:0)

想象一个马尔可夫链,就像一个顶点以重量或距离相互连接的图形。移动此图表会消耗您旅行的重量或距离的总和。以下是文本生成示例:http://phpir.com/text-generation

答案 5 :(得分:0)

卡尔曼滤波器用于跟踪状态向量,通常具有连续(或至少离散的连续)动态。这与偶发的离散事件的极性相反,所以除非你有一个包含这种状态向量的基础模型(并且是线性的或几乎是线性的),否则你可能不需要卡尔曼滤波器。

听起来你没有潜在的模型,而且正在寻找一个:你有一个钉子,正在通过工具箱试用文件,螺丝刀和卷尺8 ^)

我最好的建议:首先,使用您对问题的了解来构建模型;然后根据模型弄清楚如何解决问题。