理解Viterbi算法
Understanding Viterbi Algorithm
我想从这里实现一些代码
我已经用我的系数训练了HMM,但不理解Viterbi Decoder算法是如何工作的,例如:
viterbi_decode(MFCC, M, model, q);
where MFCC = coefficents
M = size of MFCC
model = Model of HMM training using the MFCC coefficients
q = unknown (believed to be the outputted path).
但这是我不明白的:我试图比较两个语音信号(训练,样本),以找出最接近的可能匹配。例如,使用DTW算法,返回单个整数,然后我可以找到最接近的整数,但是,使用此算法,它返回int* array
,因此很难求导。
下面是当前程序的工作方式:
vector<DIMENSIONS_2> MFCC = mfcc.transform(rawData, sample_rate);
int N = MFCC.size();
int M = 13;
double** mfcc_setup = setupHMM(MFCC, N, M);
model_t* model = hmm_init(mfcc_setup, N, M, 10);
hmm_train(mfcc_setup, N, model);
int* q = new int[N];
viterbi_decode(mfcc_setup, M, model, q);
谁能告诉我维特比解码器是如何解决从训练到输入的最佳路径问题的?我在解码路径(q)
上尝试了欧几里得距离和汉明距离,但没有这样的运气。
如有任何帮助,不胜感激
在这个例子中,我认为(q)是隐藏状态序列,所以是从0到>9的数字列表。如果你有两个音频样本,比如测试和训练,你生成两个序列q_test和q_train,那么考虑|q_test - q_train|,其中范数是组件距离,是没有用的,因为它没有正确地表示距离的概念,因为HMM中的隐藏状态标签可能是任意的。
考虑距离的一种更自然的方法可能如下,给定q_train,您对测试样本采取相同路径的概率感兴趣,一旦您有转移矩阵和发射概率,您就可以计算出该概率。
如果我误解了你的问题,请告诉我。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 理解Viterbi算法