3

这篇关于在 C# 中实现隐马尔可夫模型的优秀文章在根据训练数据对单个位序列进行分类方面做得很好。

如何修改算法或构建它(多个 HMM?)以支持多个同时位序列的分类?

例子

而不是只分类一个流:

double t1 = hmm.Evaluate(new int[] { 0,1 });      // 0.49999423004045024  
double t2 = hmm.Evaluate(new int[] { 0,1,1,1 });  // 0.11458685045803882

而是对双比特流进行分类:

double t1 = hmm.Evaluate(new int[] { [0, 0], [0, 1] });
double t2 = hmm.Evaluate(new int[] { [0, 0], [1, 1], [0, 1], [1, 1] });

或者更好的是,三个流:

double t1 = hmm.Evaluate(new int[] { [0, 0, 1], [0, 0, 1] });
double t2 = hmm.Evaluate(new int[] { [0, 0, 1], [1, 1, 0], [0, 1, 1], [1, 1, 1] });

显然训练数据也会被扩展。

4

2 回答 2

1

诀窍是将观察集建模为每个序列的所有可能值的 n 元笛卡尔积,在您的情况下,HMM 将具有2^n输出符号,其中n是位序列的数量。

示例:对于三个位序列,8 个符号是000 001 010 011 100 101 110 1110/1

于 2010-10-04T11:03:01.190 回答
1

提到的文章涉及Accord.NET Framework中的隐藏马尔可夫模型实现。当使用框架的完整版本,而不仅仅是该文章中可用的子项目时,可以使用通用HiddenMarkovModel模型并使用任何合适的发射符号分布。如果用户想表达两个或三个离散变量之间的联合概率,则值得使用JointDistribution类。

但是,如果有许多符号变量,这样表达所有可能的变量组合不实用,最好对特征使用连续表示并使用多元正态分布代替。

一个例子是:

// Specify a initial normal distribution for the samples.
var initialDensity = MultivariateNormalDistribution(3); // 3 dimensions

// Create a continuous hidden Markov Model with two states organized in a forward
//  topology and an underlying multivariate Normal distribution as probability density.
var model = new HiddenMarkovModel<MultivariateNormalDistribution>(new Ergodic(2), density);

// Configure the learning algorithms to train the sequence classifier until the
// difference in the average log-likelihood changes only by as little as 0.0001
var teacher = new BaumWelchLearning<MultivariateNormalDistribution>(model)
{
    Tolerance = 0.0001,
    Iterations = 0,
};

// Fit the model
double likelihood = teacher.Run(sequences);
于 2012-07-15T06:46:39.343 回答