将隐马尔可夫模型应用于多个同时比特序列

时间:2010-10-04 10:37:57

标签: c# machine-learning hidden markov-models

在C#中实现隐马尔可夫模型的excellent article可以很好地根据训练数据对单个比特序列进行分类。

如何修改算法或构建算法(多个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] });

显然,培训数据也将得到扩展。

2 个答案:

答案 0 :(得分:1)

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

示例:对于三位序列,8个符号为:000 001 010 011 100 101 110 111,就好像我们创建了一个 megavariable ,其值是各个观察序列值的所有可能元组({每个位序列的{1}}

答案 1 :(得分:1)

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

但是,如果有许多符号变量,表达式所有可能的变量组合都不实用,那么最好对要素使用连续表示,而使用Multivariate Normal distribution代替。

一个例子是:

// 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);