hidden-markov-models - 如何为在线手写识别的HMM模型创建参数?
问题描述
我对隐马尔可夫模型有点缺乏经验。如果我想制作一个用于在线手写识别的 HMM 模型(这意味着用户在设备上实时绘制的字母的手写识别,而不是识别字母的图像),参数模型如何?比如有哪些:
- 隐藏状态,
- 观察,
- 初始状态概率,
- 状态转移概率,
- 排放概率?
我现在所拥有的可能是观察结果,即 { x, y, timestamp } 的数组,这是我从用户在平板电脑上的手指移动记录的每个点。
系统一次只能记录/训练/识别一个号码。这意味着我有 10 个(0 到 9)个州????还是10个分类结果??从这样的各种网站,我发现隐藏状态通常以“序列”的形式出现,而不是像这样的单一状态。那么在这种情况下,状态是什么?
解决方案
HMM 可以很好地处理时间数据,但它可能不是最适合这个问题的。
正如您所确定的,观察{x, y, timestamp} 本质上是时间性的。因此,最好将其转换为 HMM 的发射,同时保留数字作为 HMM 的状态。
- 明确地说,如果数字(0 到 9)被编码为隐藏状态,那么对于 100 x 100 的“图像”,发射可以是 10000 个可能的像素坐标之一。
- 该模型预测每个时间戳(在线)的数字状态。输出是一个非唯一的像素位置。这很麻烦,但并非不可能编码(你只会有一个巨大的发射矩阵)。
- 从哪个数字开始的初始状态概率可以是均匀分布(1/10)。更巧妙的是,您可以调用本福德定律来估算文本中出现数字的频率,并相应地分配您的起始概率。
- 状态转换和排放概率是棘手的。一种策略是使用Baum-Welch(期望最大化的一种变体)算法训练您的 HMM,以迭代和不可知地估计您的过渡和排放矩阵的参数。训练数据将是具有随时间注册的像素位置的已知数字。
由于缺乏时间拟合,以另一种方式解决问题不太自然,但并非不可能。
- 您还可以使 10000 个可能的状态与像素对齐,同时具有 10 个发射 (0-9)。
- 然而,最常用的 HMM 算法的运行时间与状态数成二次相关(即,最可能有效隐藏状态的 Viterbi 算法运行O(n_emissions * n_states^2))。您被激励将隐藏状态的数量保持在较低水平。
不请自来的建议
也许您正在寻找的是卡尔曼滤波器,这可能是使用这种时间序列格式开发这种在线数字识别(在 CNN 之外似乎最有效)的一种更优雅的方式。
如果您的发射是多变量(即 x、y)且独立的,您可能还想查看结构化感知器。在这里,我相信 x、y 坐标应该是相关的,并且应该被尊重。
推荐阅读
- python - 表单不会验证,说所有字段都是空的 Django
- python - Python OpenCV - 图像四肢计算
- python - python中指数投资组合的跨度
- python - 有什么方法可以在 Python tkinter gui 中按比例放大点(x,y)?
- c# - C# 求函数的逆
- rescript - 使用 CLI 编译 Rescript -- 没有 bsconfig.json
- awk - Replace each nth occurrence of 'foo' and 'bar' by numerically respective nth line of a supplied file once time
- vba - VBA宏控制Word中的光标
- java - 当提交的表单具有属性 enctype="multipart/form-data" 时,如何在控制器中获取表单数据?
- java - 有人可以帮助我如何使另一个框架中的按钮工作吗?