问题标签 [hidden-markov-models]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hidden-markov-models - 马尔可夫链和隐马尔可夫模型有什么区别?
马尔可夫链模型和隐马尔可夫模型有什么区别?我在维基百科中阅读过,但无法理解其中的差异。
java - 用于训练 HMM 的 MFCC 数据格式
我正在尝试使用 mfcc 功能和隐藏的马尔可夫模型在 java 中开发一个音频分类系统。我正在关注这篇研究论文:http ://acccn.net/cr569/Rstuff/keys/bathSoundMonitoring.pdf 。
算法描述如下:
每个声音文件,对应于声音事件的样本,在帧中进行处理,这些帧由汉明窗(25 毫秒)预先强调和加窗,重叠率为 50%。由 13 阶 MFCC 组成的特征向量表征每一帧。我们使用从左到右的六态连续密度 HMM 对每个声音进行建模,而不会跳过状态。每个 HMM 状态由两个高斯混合分量组成。在模型初始化阶段完成后,所有 HMM 模型都在三个迭代周期中进行训练。
我已经完成了第一部分工作,即从样本声音中提取特征。结果,我得到了一个二维数组,每行由 13 列组成(每行代表一个声音帧)。现在我的问题是如何使用这些数据训练 hmm。
我正在使用 jahmm 库。到目前为止,我已经开发了一些示例代码来大致了解该库的工作原理。
我的问题是:
Q1:mfcc 数据应该以什么格式传递来训练 hmm?(参见 realSeuqences 行的评论)
Q2:在语音识别中,有时我们需要通过重复同一个词让我们说 10 次来训练系统。这是否意味着它用这 10 个样本训练了一个 hmm?如果是,那么如何用相同声音的不同样本训练一个 hmm。或者是 10 个单独训练的 hmm 但标有那个词?
Q3:如何在声音识别方面比较两个hmm模型。使用 viterbi 或 Kullback Leibler 距离会更好吗?
matlab - keving murphy 的 hmm matlab 工具箱断言错误
我正在做一个需要使用隐藏马尔可夫模型的项目。我下载了 Kevin Murphy 的工具箱。我有一些关于使用的问题。在工具箱网页中,他说 dhmm_em 和 dhmm_logprob 的第一个输入是符号序列数据。在他们的示例中,他们将行向量作为数据。因此,当我将符号序列作为行向量给出时,我得到了错误;
但是,在给出此错误之前,代码适用于某些符号向量。当我将数据作为列向量提供时,函数工作正常,没有错误。那么我到底为什么会收到这个错误呢?
你可能会说我不应该给出单个向量,而是向量集,我还尝试将我的特征向量收集在一个结构中并给出行向量,但是没有任何改变,我仍然得到断言错误。
顺便说一句,我的符号序列没有任何零,我所做的一切几乎与他们在示例中显示的一样,所以如果有人能帮助我,我将不胜感激。
matlab - MATLAB中的隐马尔可夫模型
我有 11 个状态和一个转移概率矩阵,但我没有排放,因为我的模型没有隐藏。它仅包含状态 (1,2,3, ..., 11)
我想根据我的转移概率矩阵生成随机状态,但 HMM 工具箱需要一个发射概率矩阵。我应该怎么办?
java - 隐马尔可夫模型阈值
我开发了一个使用 mfcc 和隐藏马尔可夫模型进行声音识别的概念验证系统。当我在已知声音上测试系统时,它给出了有希望的结果。尽管系统在输入未知声音时返回最接近匹配的结果,并且得分不是那么明显,但它是未知声音,例如:
我已经训练了 3 个隐藏马尔可夫模型,一个用于语音,一个用于从水龙头流出的水,一个用于敲桌子。然后我在看不见的数据上测试它们并得到以下结果:
这里的输入是一个未知的声音,但它仍然返回最接近的匹配,因为没有用于阈值/垃圾过滤的系统。
我知道在关键字发现中,可以使用垃圾或填充模型过滤掉 OOV(词汇外)声音,但它说它是使用一组有限的未知单词进行训练的,而这不能像我一样应用于我的系统不知道系统可能记录的所有声音。
语音识别系统中的类似问题如何解决?以及如何解决我的问题以避免误报?
classification - 如何同时为多个数据流提供隐马尔可夫模型(HMM)?
我已经建立了一个由 8 个加速度计组成的身体传感器网络。在每个样本(大约 30 Hz)处,每个加速度计都会给我一个 XY 和 Z 值。
我使用了 jahmm java 库对由一个加速度计组成的数据流进行分类。这工作正常。但现在我很困惑如何扩展我的代码,以便可以使用多个加速度计。
单个数据流如下所示:
该库允许定义特征向量的维度。在上面的流中,维度是 3。我想将维度提高到 3 x 8 = 24,然后简单地将所有加速度计连接成一个 24D 特征向量。
这是要走的路还是会恶化我的结果?
编辑:
我现在已经收集了我的数据,它看起来像这样(对于一位参与者):
{... ... ...} 之间的值代表一个加速度计。每个样本(在 30hz 左右)我有 8 个加速度计。一个样本在 [...] 内。每个手势示例我有大约 40 个 [...]
您是否建议我采用第一个传感器([] 的每个块的第一个 {})并使用结果序列创建一个模型,并且第二个直到第八个都相同?
这将为每个手势提供 8 个模型。比一个测试序列产生 8 个概率。所以我需要某种复数投票来获得覆盖类。这是你的意思吗?
谢谢
classification - WEKA 工具包中隐马尔可夫模型的等价物是什么?
我需要对来自由 8 个加速度计组成的传感器网络的数据流进行分类。每个加速度计都给我一个 XY 和 Z 值。因此,在每个样本中,我有 8 x 3 = 24 个加速度值。我以大约 30 赫兹的频率进行采样,执行时间约为 0.5 秒。
起初我想为此使用隐马尔可夫模型,但似乎 WEKA 工具包没有提供这样的东西。WEKA 相当于什么?
谢谢你。
编辑:如何格式化数据?
我已经收集了数据,现在我想使用 HMMWeka 进行分类。在网站上它指出
数据实例必须有一个单一的、名义的、类属性和一个单一的、关系的、序列属性。这种关系属性中的实例可以由单个名义数据实例(在离散 HMM 的情况下)或多变量的数字属性(在高斯 HMM 的情况下)组成。
但我很困惑我需要如何呈现我的数据才能满足这一要求。
我的数据如下所示:
所以对于每一个手势,我都有几个例子。{} 之间的数据代表一个加速度计的 XYZ 值。最上面的 [ ... ] 代表一个包含 8 个加速度计的样本。
我不明白如何从中创建 ARFF 文件?
谢谢
algorithm - 用于检测未知周期(时间序列)中的位置的算法
假设您想预测下一次船将访问的概率。您开始在船周期中的任意位置进行观察。当您进行观察时,您只能记录船是否可见(假设它是循环中的正确点,船总是可见)。在这个世界上,船的周期长度也是未知的,但具有周期性,而船的访问时间是未知的,但总是小于周期长度。还假设周期是一种固定的自然现象,可能不会改变。
案例 1. 观察的第一个小时你没有看到船。因此,预测下一小时内有船的概率将是任意的。我们观察到一艘船的第二个小时,我们预测第 3 个小时的概率很高。在第 4 个小时我们没有观察到船,我们现在可以确定这艘船通常可以观察 2 个小时(第 2 和第 3 个小时)。我们继续观察,在第 7 个小时,船再次可见。只有在这一点上,我们才知道循环长度(5 小时)和可观察船的持续时间(2 小时)。
案例 2. 第一个小时观察你看到一艘船。下一小时的预测概率很高。在第 4 小时,您没有观察到任何船只。此时船能见度至少为3小时。我们在 5、6、7、8 小时再次观察船,在 9 小时没有船。只有在 9 小时之后,我们才能有把握地说周期是 5 小时,能见度是 4 小时。
案例 3. 看到船的第一个小时。你去睡3个小时。在第 5 小时,您看不到船。你去睡3个小时。在第 9 点,您会看到一艘船。在 10、11、12 小时看到船的概率是多少?
我可以使用什么算法来解决这个问题?我认为隐藏马尔可夫模型可能会起作用,因为存在潜在的现象,但它不是直接可观察的。但在这种情况下,这种现象并不完全清楚。在我的特殊情况下,我可以用平均循环长度初始化算法。创建此算法的真正动机是观察结果在两者之间非常少。这个程序在训练阶段最有价值,因为如果知道循环长度和我们在循环中的位置,事情就会变得微不足道。
以下是使用8小时的平均历史周期长度和2小时的船持续时间给定 0、1、2 和 3次连续观察(X 表示看到船的观察,O 表示没有船的观察)大致可以输出的内容。仔细查看图表,您会注意到船可能返回的位置周围的概率有所增加。
classification - Jahmm lib:如何解释 ForwardBackwardScaledCalculator.lnProbability() 的负值?
我使用 Jahmm 库对加速度计序列进行分类。
我已经创建了模型,但是当我尝试通过以下方式计算模型上测试序列的概率时:
我得到负值,例如-1278.0926336276573。
库代码中的注释指出 lnProbability 方法:
返回生成此对象的序列概率的纳皮尔对数。
返回:感兴趣的序列的napierian对数的概率
但是如何比较两个这样的对数呢?我用两个测试序列在两个不同的模型上调用该方法,所以我得到 4 个概率:
但是在这种情况下,这是否意味着我们越接近零,测试序列与模型越相似(所以在这个例子中分类准确率 = 100%?)
谢谢