首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hmmlearn分类用法

Hmmlearn分类用法
EN

Stack Overflow用户
提问于 2018-09-26 10:04:53
回答 1查看 1.9K关注 0票数 1

我正在尝试使用赫美学学习一个模型,以便在我的数据集上进行分类。数据集有一个具有不同长度的序列列表。每个序列由事件发射组成。例如:

代码语言:javascript
复制
ID1: ['1', '10', '8', '15']
ID2: ['1', '10', '8', '15', '156', '459', '256']

这是我正在使用的代码。我发现了一个类似的例子这里

代码语言:javascript
复制
    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

现在如何检索数据集中每个序列的类?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-28 22:44:27

函数predict预测给定输入的最可能的状态序列。这不是你想要的问题,你的问题是关于分类的两个类别。

您需要的可能是predict_proba方法(请参阅文档这里),它将按状态给出概率。

但是,请记住,您不能确切地知道HMM如何学会区分这两个类。这意味着,除非你从属于1类的训练样本中估计/初始化了第一高斯参数,另一种高斯参数是从属于2类的样本中估计/初始化的,否则你无法知道HMM是否将它的每一种状态关联到了一个类。这两个类也可以学习的方式,是使用的顺序之间的状态,使他们不同。例如,1类给出了一种S1-S2-S1-S2-S1-S2的状态模式.第2类给出了S1-S1-S2-S2-S1-S1-.让我们记住,HMMs对时间序列是好的。扪心自问:如果一个高斯分布可以完全代表一个类,那么为什么要使用隐马尔可夫模型呢?

对于(二进制)分类,一个更可靠的方法是训练两个HMMs,一个来自第一类样本,另一个来自第二类样本。一旦经过训练,每个测试序列都会使用score方法对两个模型进行评分(参见文档这里)。这将返回您所传递的序列的日志可能性,作为您调用它的模型的输入。然后将测试样本分类到返回最大似然结果的模型的类中。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52515134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档