这excellent article在 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] });
显然训练数据也会扩展。
最佳答案
诀窍是将观察集建模为每个序列所有可能值的 n 元笛卡尔积,在您的情况下,HMM 将具有 2^n
输出符号,其中 n
是比特序列的个数。
示例:对于三位序列,8 个符号是:000 001 010 011 100 101 110 111
,就好像我们创建了一个巨型变量,其值是所有可能的各个观察序列的值元组(每个位序列的0/1
)
关于c# - 将隐马尔可夫模型应用于多个同时位序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3854404/