1

我正在尝试使用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.
我现在如何检索数据集中每个序列的类?

4

1 回答 1

1

该函数predict在给定输入的情况下预测最可能的状态序列。对于关于在两个类之间进行分类的问题,这不是您想要的。

您需要的可能是方法(请参阅此处predict_proba的文档),它将按状态为您提供概率。

但是,请记住,您无法确定 HMM 是如何学会区分这两个类别的。这意味着,除非您对属于第 1 类的训练样本中的第一个高斯参数和属于第 2 类的样本中的另一个高斯参数进行了某种程度的估计/初始化,否则您无法知道 HMM 是否已将其每个状态与班级。这两个类也可以通过在使它们不同的状态之间使用的序列的方式来学习。就像,第 1 类给出 S1-S2-S1-S2-S1-S2... 的状态模式,第 2 类给出 S1-S1-S2-S2-S1-S1-... 的模式让我们记住 HMM 是适合时间序列。问问自己:如果单个高斯分布可以完全代表一个类,那么为什么要使用隐马尔可夫模型?

对于(二元)分类,更可靠的方法是训练两个 HMM,一个来自第一类的样本,另一个来自第二类的样本。训练完成后,每个测试序列都会使用该方法针对两个模型进行评分(请参阅此处score的文档)。这将返回您作为输入传递的序列相对于您调用它的模型的对数似然。然后将测试样本分类到返回最高似然结果的模型类别中。

这种方法的有趣之处在于,在两个模型都给出低可能性结果的情况下,您还可以将测试序列标记为不属于两个感兴趣的类别。这也很好地概括了几十个类。

于 2018-12-28T22:44:27.863 回答