Hmmlearn分类用法
Hmmlearn classification usage
我正在尝试使用 hmmlearn 学习模型,以便对我的数据集进行 class 化。
数据集有一个长度不同的序列列表。每个序列都包含事件发射。例如:
ID1: ['1', '10', '8', '15']
ID2: ['1', '10', '8', '15', '156', '459', '256']
这是我正在使用的代码。我找到了一个类似的例子 here.
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)
我对 class 将事件分为两个类别感兴趣,因此我选择 n_components=2
。
我现在如何检索数据集中每个序列的 class?
函数 predict
预测给定输入的最可能的状态序列。关于 class 在两个 class 之间进行验证的问题,这不是您想要的。
您可能需要的方法 predict_proba
(请参阅文档 here)可以为您提供各州的概率。
但是,请记住,您无法确定 HMM 是如何学会区分这两个 classes 的。这意味着,除非你有点 estimated/initialized 来自属于 class 1 的训练样本的第一个高斯参数和来自属于 class 2 的样本的另一个高斯参数,你无法知道是否HMM 已将其每个状态关联到 class。这两个 classes 也可以通过在状态之间使用的序列使它们不同的方式来学习。比如,class 1 给出了 S1-S2-S1-S2-S1-S2... 的状态模式,class 2 给出了 S1-S1-S2-S2-S1-S1- 的模式...让我们记住,HMM 对时间序列很有用。问问自己:如果单个高斯分布可以完全代表一个 class,那么为什么要使用隐马尔可夫模型?
对于(二进制)class化,更可靠的方法是训练两个 HMM,一个来自第一个 class 的样本,另一个来自第二个 [=26] 的样本=].训练完成后,每个测试序列都会使用 score
方法针对两个模型进行评分(请参阅文档 here)。这将 return 您作为输入传递的序列相对于您调用它的模型的对数似然。然后测试样本在模型的 class 中被 class 化 return 最高似然结果。
这种方法的有趣之处在于,在两种模型都给出低可能性结果的情况下,您还可以将测试序列标记为既不属于感兴趣的两个 class 的一部分。这也可以推广到几十个 classes.
我正在尝试使用 hmmlearn 学习模型,以便对我的数据集进行 class 化。 数据集有一个长度不同的序列列表。每个序列都包含事件发射。例如:
ID1: ['1', '10', '8', '15']
ID2: ['1', '10', '8', '15', '156', '459', '256']
这是我正在使用的代码。我找到了一个类似的例子 here.
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)
我对 class 将事件分为两个类别感兴趣,因此我选择 n_components=2
。
我现在如何检索数据集中每个序列的 class?
函数 predict
预测给定输入的最可能的状态序列。关于 class 在两个 class 之间进行验证的问题,这不是您想要的。
您可能需要的方法 predict_proba
(请参阅文档 here)可以为您提供各州的概率。
但是,请记住,您无法确定 HMM 是如何学会区分这两个 classes 的。这意味着,除非你有点 estimated/initialized 来自属于 class 1 的训练样本的第一个高斯参数和来自属于 class 2 的样本的另一个高斯参数,你无法知道是否HMM 已将其每个状态关联到 class。这两个 classes 也可以通过在状态之间使用的序列使它们不同的方式来学习。比如,class 1 给出了 S1-S2-S1-S2-S1-S2... 的状态模式,class 2 给出了 S1-S1-S2-S2-S1-S1- 的模式...让我们记住,HMM 对时间序列很有用。问问自己:如果单个高斯分布可以完全代表一个 class,那么为什么要使用隐马尔可夫模型?
对于(二进制)class化,更可靠的方法是训练两个 HMM,一个来自第一个 class 的样本,另一个来自第二个 [=26] 的样本=].训练完成后,每个测试序列都会使用 score
方法针对两个模型进行评分(请参阅文档 here)。这将 return 您作为输入传递的序列相对于您调用它的模型的对数似然。然后测试样本在模型的 class 中被 class 化 return 最高似然结果。
这种方法的有趣之处在于,在两种模型都给出低可能性结果的情况下,您还可以将测试序列标记为既不属于感兴趣的两个 class 的一部分。这也可以推广到几十个 classes.