我被教授HMM并且给了这个家庭作业问题.我理解了它的一部分,但我不确定它是否正确.问题是:
考虑一个不同的游戏,经销商不会翻转硬币,而是使用标签1,2和3滚动三面模具.(尽量不要考虑三面模具的外观.)经销商已经两个装载的骰子D1和D2.对于每个骰子Di,滚动数字i的概率是1/2,并且其他两个结果中的每一个的概率是1/4.在每个回合,经销商必须决定是(1)保持相同的骰子,(2)切换到另一个骰子,或(3)结束游戏.他选择(1)概率为1/2,其他每个概率为1/4.开始时,经销商以相同的概率选择两个骰子中的一个.
为这种情况提供HMM.指定字母表,状态,转换概率和发射概率.包括开始状态开始,并假设HMM以状态开始以概率1开始.还包括结束状态结束.
假设您观察到以下的模具辊序列:1 1 2 1 2 2.找到最能说明辊子顺序的状态序列.这个序列的概率是多少?通过完成Viterbi表找到答案.在单元格中包含回溯箭头,以便您可以追溯状态序列.以下某些事实可能有用:
log2(0)=-∞log2
(1/4)= -2
log2(1/2)= -1
log2(1)= 0- 对于这种模具辊序列,实际上存在两种最佳状态序列.另一个国家的序列是什么?
如果我对第一部分没有错,我必须做类似这里的事情http://en.wikipedia.org/wiki/Hidden_Markov_model#A_concrete_example但是我没有得到假设以概率1开始的东西.
另外,我不知道在问题的第二部分我要为维特比表做些什么.如果任何身体可以给我一些提示或线索,那将是伟大的.
我想开发一个使用Kinect和手势识别的应用程序hidden Markov models.我在这里看了一个教程:HMM讲座
但我不知道如何开始.什么是状态集以及如何规范化数据以实现HMM学习?我知道(或多或少)应该如何处理信号和简单的"从左到右"的情况,但3D空间让我有点困惑.谁能形容它应该如何开始?
谁能形容这些步骤,怎么做?特别是我需要知道如何做模型以及HMM算法的步骤应该是什么.
algorithm gesture-recognition gestures hidden-markov-models kinect
我已提取的特征从分离的字符(如梯度许多图像,相邻像素的重量和几何性质.如何使用的HMM作为训练该数据分类?所有文献我读到HMM是指状态和状态转换但是我"t将其连接到的功能和一流的标签.这个例子上JAHMM的主页没有涉及到我的问题.我需要使用HMM不是因为它会比其他方法对这个问题好,但因为项目课题的约束.
这个问题有一个在线识别的答案,但我想要离线和更详细的相同
编辑:我将每个字符分区为具有固定数量的正方形的网格.现在我计划在每个网格块上执行特征提取,从而通过从左到右和从上到下移动来获得每个样本的一系列特征.
这是否代表HMM的足够"序列",即HMM是否能够猜测数据的时间变化,即使角色不是从左到右,从上到下绘制的?如果不建议替代方式.
我应该提供很多功能还是从一些功能开始?我怎么知道HMM是否表现不佳或者功能是否不好?我正在使用JAHMM.
提取笔划特征很困难,并且逻辑上不能与网格特征相结合?(因为HMM需要一些随机过程生成的序列)
使用此代码:
X = numpy.array(range(0,5))
model = GaussianHMM(n_components=3,covariance_type='full', n_iter=1000)
model.fit([X])
Run Code Online (Sandbox Code Playgroud)
我明白了
tuple index out of range
self.n_features = obs[0].shape[1]
Run Code Online (Sandbox Code Playgroud)
那么你应该准确传递.fit()的是什么?元组中隐藏的状态和排放?如果是这样的话?文档不太有用.
我注意到它喜欢传递元组,因为这不会给出错误:
X = numpy.column_stack([range(0,5),range(0,5)])
model = GaussianHMM(n_components=3,covariance_type='full', n_iter=1000)
model.fit([X])
Run Code Online (Sandbox Code Playgroud)
编辑:
让我澄清一下,文档表明数组的正常性必须是:
类似阵列的观察序列列表(形状(n_i,n_features)).
这几乎表明您为每个样本传递一个元组,以二进制方式指示哪些观察结果存在.然而他们的例子表明不是:
# pack diff and volume for training
X = np.column_stack([diff, volume])
Run Code Online (Sandbox Code Playgroud)
因此混乱
目前,我正在为 Mallet 关于 HMM 的糟糕得可笑的文档而苦苦挣扎。我已经设法将数据导入到实例中(改编自 ImportExample.java 片段),我只是想知道如何使用它们来训练 HMM 模型。我首先创建了一个 HMM 实例,但我不确定是否去:
Run Code Online (Sandbox Code Playgroud)HMM hmm = new HMM(instances.getDataAlphabet(), instances.getTargetAlphabet());
或者像这样使用相同的数据字母两次:
Run Code Online (Sandbox Code Playgroud)HMM hmm = new HMM(instances.getDataAlphabet(), instances.getDataAlphabet());
无论哪种方式,当我到达
Run Code Online (Sandbox Code Playgroud)hmm.train(instances);
我收到以下错误:
cc.mallet.types.FeatureVector 不能转换为 cc.mallet.types.FeatureVectorSequence
如果您能提供任何帮助,我将不胜感激。
干杯
我正在学习 coursera NLP 课程,第一个编程任务是构建 Viterbi 解码器。我想我真的快要完成它了,但是有一些我似乎无法追踪的难以捉摸的错误。这是我的代码:
http://pastie.org/private/ksmbns3gjctedu1zxrehw
http://pastie.org/private/ssv6tc8dwnamn2qegdvww
到目前为止,我已经调试了与“教学”相关的函数,所以我可以说算法的参数正在被正确估计。特别感兴趣的是 viterbi() 和 findW() 方法。我正在使用的算法的定义可以在这里找到:http : //www.cs.columbia.edu/~mcollins/hmms-spring2013.pdf第 18 页。
我很难理解的一件事是,当 K = {1, 2} 时,我应该如何更新特殊情况的反向指针(在我的情况下,这是 0 和 1,因为我是零-索引我的数组)分别在这些情况下我使用的参数是 q({TAGSET} | *, *) 和 q ({TAGSET} | *, {TAGSET})。
提示而不是勺子喂的答案也将受到高度赞赏!
我目前正在开发一个手语识别应用程序,我想使用隐马尔可夫模型作为分类阶段,这意味着我将对手势/姿势进行分类以获得相关的字母或单词。
我目前已经完成了检测手部的第一阶段。目前,我可以获得许多可用于机器学习阶段的参数(特征),例如:
这些都可以通过 openCv 来完成。
我的问题:一旦我拥有所有这些功能,我该如何执行“特征提取”阶段?即如果机器学习算法,在这种情况下 HMM 需要一组概率,我如何使用上述信息?
我的一个想法是创建一个特殊的数据结构,其中包含唯一标识每个手势的信息,但我如何将其提供给机器学习技术?(在本例中为隐马尔可夫模型)
任何人都可以指导我在这个特定阶段至少应该搜索什么,或者指导我展示我真正遇到的困难是什么?
opencv machine-learning gesture-recognition feature-extraction hidden-markov-models
我目前正在使用 Scikit Learn,并且在尝试训练高斯 HMM 时遇到了以下问题:
文件“/Library/Python/2.7/site-packages/sklearn/hmm.py”,第443行,合适
Run Code Online (Sandbox Code Playgroud)self._do_mstep(stats, self.params)文件“/Library/Python/2.7/site-packages/sklearn/hmm.py”,第 798 行,在 _do_mstep 中
Run Code Online (Sandbox Code Playgroud)super(GaussianHMM, self)._do_mstep(stats, params)文件“/Library/Python/2.7/site-packages/sklearn/hmm.py”,第 580 行,在 _do_mstep 中
Run Code Online (Sandbox Code Playgroud)np.maximum(self.startprob_prior - 1.0 + stats['start'], 1e-20))文件“/Library/Python/2.7/site-packages/sklearn/hmm.py”,第 476 行,在 _set_startprob
Run Code Online (Sandbox Code Playgroud)raise ValueError('startprob must sum to 1.0')ValueError:startprob 的总和必须为 1.0
如果我消除了一些特征(每次观察少于 13 个特征),它仍然有效。我已经检查过所有输入都是有效的,并且每个训练示例只包含 numpy.float64s 的二维数组。关于出了什么问题的任何想法?谢谢!
我目前正在为我的大学做一个项目。任务是编写语音识别系统,该系统将在后台运行在手机上,等待一些命令(例如 call 0 123 ...)。
这是 2 个月的项目,所以它不必非常准确。可接受的噪音量可能很小,并且单词将被片刻的沉默隔开。
我目前正在加载以 RAW 16 位 PCM 格式编码的示例字。将其拆分为块(每秒约 50 个)并在每个块上运行 FFT 以获得频谱。
需要解决的问题是:1)通过较长的录音并将其拆分为单词。2)找到最匹配的词
1)我正在考虑只检查一个接一个的块,如果我遇到几个具有更高人类语音频率的块,则认为该词已经开始。无论如何,我正在寻找可能对此有所帮助的资源。
2)这个接缝有点硬。是否有必要将 HMM 用于这样的系统,或者假设词汇量如此之小(20 个单词),是否有更简单的方法?
编辑:该项目的重点是我自己编写系统,所以我不能使用像 Sphinx 或 HTK 这样的现成库。
问候, 卡罗尔
c++ speech-recognition fft speech-to-text hidden-markov-models
我尝试使用来自 GitHub 的 hmmlearn来运行二进制隐藏马尔可夫模型。这不起作用:
import hmmlearn.hmm as hmm
transmat = np.array([[0.7, 0.3],
[0.3, 0.7]])
emitmat = np.array([[0.9, 0.1],
[0.2, 0.8]])
obs = np.array([0, 0, 1, 0, 0])
startprob = np.array([0.5, 0.5])
h = hmm.MultinomialHMM(n_components=2, startprob=startprob,
transmat=transmat)
h.emissionprob_ = emitmat
# fails
h.fit([0, 0, 1, 0, 0])
# fails
h.decode([0, 0, 1, 0, 0])
print h
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError:无法连接零维数组
使用此模块的正确方法是什么?注意我使用的是与 sklearn 分离的 hmmlearn 版本,因为显然 sklearn 不再维护 hmmlearn。
python machine-learning time-series hidden-markov-models hmmlearn
python ×3
algorithm ×2
java ×2
scikit-learn ×2
c++ ×1
fft ×1
gestures ×1
hmmlearn ×1
kinect ×1
mallet ×1
nlp ×1
numpy ×1
ocr ×1
opencv ×1
probability ×1
python-2.7 ×1
time-series ×1
viterbi ×1