用于顺序数据的马尔可夫链

数据挖掘 Python 马尔科夫过程 马尔可夫隐藏模型
2021-09-23 10:14:04

我是马尔可夫链和 HMM 的新手,我正在寻求帮助来开发一个程序(在 python 中),该程序根据之前的 20 个状态(比如说过去 20 个月的 20 个状态)预测下一个状态。我有一个包含 50 个客户的顺序数据集,即行包含 50 个客户中每个客户的 20 个状态的序列(数据集有 50 行和 20 列,不包括标题)。我正在尝试使用马尔可夫链确定下一个状态,并且网络上的所有文献都集中在文本字符串的示例上。我正在寻找特定于我所拥有的示例的东西。有人可以帮我想出初始概率矩阵,然后考虑 20 个状态来预测下一个状态吗?

3个回答

如果您知道状态历史是什么,则不需要“隐藏”马尔可夫模型,只需要马尔可夫模型(或其他一些机制)。“隐藏”部分意味着一些不可观察状态序列和一些与之相关的观察结果之间的区别。在您的情况下,您说您已经观察了每个客户的过去状态,因此您不一定需要推断任何“隐藏”的东西。

在您的情况下进行的最简单方法是计算转换矩阵,即给定先前状态的状态概率。这是一个非常简单的模型,但它可能会做你想做的事。为此,只需查看所有状态对,并计算得到 p(s2 | s1) = p(s1 & s2)/p(s1)。这相当于您可能已经阅读过的 1-gram 模型。每个状态都类似于一个词。

您还可以制作更复杂的模型,例如 2-gram 模型甚至 RNN。老实说,由于您有固定数量的历史,您可以将数据放入 scikit-learn 模型或 xgboost 或其他东西中,其中每个客户的历史是预测变量的向量,下一个状态是结果。它不知道顺序依赖关系,但您实际上是按时间索引过去的状态,因此它可能工作得很好。

如果您需要对此部分进行更多说明,请询问。

因为很少有数据 HMM 可能会过拟合(取决于状态和字母的数量)。我会选择一个简单的马尔可夫链,因为它的参数更少,而且你不需要调整隐藏状态之类的东西。如果您要使用 HMM,我会推荐一个名为 Pomegranate 的包。

我还建议尝试使用多项模型,可以将其视为 0 内存马尔可夫模型,也许您的数据没有过去的依赖关系。

1) 如果您假设转换是从某个隐藏状态发生的,您可以使用 HMM、SSM 或 UCM。考虑到 20 个数据点,我想知道模型拟合将如何发生。

2)马尔可夫链不会遵循隐藏状态的假设。但这将为您提供基于贝叶斯的稳健概率模型来预测未来状态。

3)这篇文章可能会有所帮助- https://www.datacamp.com/community/tutorials/markov-chains-python-tutorial

了解 HMM 和隐藏状态的基础知识。-

https://machinelearningstories.blogspot.com/2017/02/hidden-markov-model-session-1.html