我正在尝试用hmmlearn学习一个模型,以便对我的数据集进行分类。 数据集具有具有不同长度的序列列表。每个序列由事件发射组成。例如:
ID1: ['1', '10', '8', '15']
ID2: ['1', '10', '8', '15', '156', '459', '256']
这是我正在使用的代码。我在这里找到了一个类似的例子。
sequence_map = __load_df(file)
x = []
lengths = []
for values in sequence_map.values():
x.append(values)
lengths.append(len(values))
x = np.concatenate(x)
model = hmm.GaussianHMM(n_components=2, algorithm='map', n_iter=1000, covariance_type="full").fit(x, lengths=lengths)
predictions = model.predict(x, lengths)
我有兴趣将事件分为两类,所以我选择n_components=2
.
我现在如何检索数据集中每个序列的类?
函数predict
预测给定输入的最可能的状态序列。对于您在两个类之间进行分类的问题,这不是您想要的。
您需要的可能是方法predict_proba
(请参阅此处的文档(,它将按状态为您提供概率。
但是,请记住,您无法确定HMM如何学会区分这两个类。这意味着,除非您在某种程度上估计/初始化了属于类 1 的训练样本中的第一个高斯参数和属于类 2 的样本中的另一个高斯参数,否则您无法知道 HMM 是否将其每个状态关联到一个类。这两个类也可以以使它们不同的状态之间使用的顺序的方式来学习。例如,类 1 给出了 S1-S2-S1-S2-S1-S1-S2 的状态模式......类 2 给出了 S1-S1-S2-S2-S1-S1-S1 的模式-...让我们记住,HMM 适用于时间序列。问问自己:如果单个高斯分布可以完全表示一个类,那么为什么要使用隐马尔可夫模型呢?
对于(二进制(分类,更可靠的方法是训练两个HMM,一个来自第一类的样本,另一个来自第二类的样本。训练后,使用方法score
对两个模型的每个测试序列进行评分(请参阅此处的文档(。这将返回您作为输入传递的序列相对于您调用它的模型的对数似然。然后将检验样本分类到返回最高似然结果的模型类别中。
这种方法的有趣之处在于,在两个模型都给出低似然结果的情况下,您还可以将测试序列标记为不属于两个感兴趣的类别中的任何一个。这也概括了几十个类。