字符序列预测?

8

我刚开始学习机器学习,所以希望您能对这个问题宽容一点。

我有一串观测到的字符序列,例如ABABBABBB......(n个字符)。我的目标是通过某种“学习”机制来预测下一个字符。但限制是:训练数据即观测到的字符数量不多。换言之,我只有一段长度为6000的序列,用于学习其中的潜在规律。

我对解决这个问题的策略感到相当困惑,我的初步想法是: 1)使用N元模型? 2)神经网络(如LSTM等)? 3)隐马尔科夫模型(HMMs)?

请问您可以指导正确的解决方案吗?


该序列的基本模式是否恒定不变?(还是每个序列/输入的模式都会改变) - Thomas Wagenaar
我不知道这个模式,但我想学习它。 - suzee
1
你的字母表里有多少个字符?只有“A”和“B”吗?你能上传你的数据吗? - Hossein
请提供更多内容。 - suzee
3个回答

3
如果你处理的是一个相当琐碎的模式,其中字母仅基于前一个字母,则隐藏马尔可夫模型(HMM)可以解决它 - 实际上,像马尔可夫链这样简单的东西也可以工作。
如果你想玩得开心一点,那么这里有一个基于HMM的自定义解决方案,你可以随意调整。
浏览示例数据,并按插入顺序创建每个元素的链表。现在为每个不同的字符创建另一个列表,并将其放置在属于它的每个列表元素的索引中。这是链表的(非常糟糕的)可视化表示,以及下面的桶:

Linked list above arrays

现在当您被呈现一个序列并被要求预测下一个字符时,您只需要查看最近的X个字符,并查看与它类似的子序列的作用方式。
使用我上面的例子,然后查看最近(最后)3个字符以获取BAC。您想看看序列BAC是否以前曾发生过,以及它发生时之后发生了什么。如果您检查BAC的第一个字母的桶(即B),则可以看到字母B以前出现过一次。幸运的是,它遵循该序列-接着出现了A,因此这将是预测结果。

你可能不仅想要检查过去 X 个序列,还想检查小于 X 的每个数字,如果序列匹配,则给每个数字赋予较小的权重,以创建更好的启发式。

困难的部分是决定往前看多远-如果看得太远,会花费太长时间,你可能无法获得任何匹配。 如果看得太短,则可能会错过一些模式,不得不猜测。

祝你好运-希望这很容易实现,并且对你有效。


3
你的问题似乎是时间序列分析。为此,除了机器学习算法外,你还应考虑使用统计和探索性数据分析(EDA)。
  1. 我会从为字符分配数字开始(A-> 1,B-> 2等)。通常不建议将名义变量(没有顺序的值)转换为有序变量(2比1大,但“C”是否比“A”或“红色”比“绿色”更大?!),但在这种情况下,这将把您的问题转化为绝对时间序列分析。

  2. 然后,我会利用一些常规的EDA方法,例如4-plotautocorrelation分析。这将告诉您许多关于数据的统计行为,例如“数据的平均值是否在变化?”或“数据集可能有多少随机性?”之后,您可能会更好地决定使用哪种机器学习算法

  3. 根据您在EDA分析中发现的内容,您可以继续实施ML算法。如果您具有高度相关的数据(从自相关图中看出),那么您可能会选择滑动窗口方法进行特征选择,即假设每个值都取决于前k个值(x_k = f(x_(k-1),x_(k-2),...,x_(k-m)))。通过分析自相关图,可以选择“m”的值。如果您具有移动平均值,则最好先学习平均曲线,然后再学习每个实例与其平均值的偏移量。如果您在平均曲线或实例偏移量中感觉到某种程度的随机性,则可能希望通过预测问题选择随机方法。

通常,EDA的理念是“在模型选择之前应进行分析”,我认为这是正确的。如果您更了解正在处理的内容,则肯定会更好地进行模型选择。


0

遗传算法可能是一个解决方案。 它通过通配符替换字母来创建分类器。 由于分类器应该具有给定的长度,因此您选择最后N个字符。 例如(N-= 4):ABBACDC ->“ACDC”,一个分类器示例可以是“A ** C”。 为了测试它,对于一个好的程序员来说,速度可能相当快,结果可能令人惊讶。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接