模式识别 - “这是一种模式吗?”

时间:2013-11-04 23:31:24

标签: c vector

我有一个很大的数字矢量,比如500个数字。我希望有一个程序根据以下规则检测这种向量中的模式(在这种情况下重现):

在以下情况下,数字序列是一种模式:

  • 序列的大小在3到20个数字之间。

  • 依次重复数字的相对位置 至少还有一次在向量中。所以,如果我有一个序列,那就说吧 (1,4,3)然后(3,6,5)在向量中的其他地方然后(1,4,3)是 一种模式。 (以及(2,5,4),(3,6,5)等。)

  • 序列不能相交。因此,矢量(1,2,3,4,5)不会 包含模式(1,2,3)和(3,4,5)(我们不能使用相同的数字 两个序列)。但是,(1,2,3,3,4,5)确实包含一种模式 (1,2,3)(或(3,4,5))

  • 模式B的子集A仅在A出现在某处时才是模式 在B之外的其他地方。因此,矢量(1,2,3,4,7,8,9,2,3,4,5)将包含 模式(1,2,3,4)和(1,2,3),因为(1,2,3,4)重复(在一个 重复(2,3,4,5))和(1,2,3)的形式(以(7,8,9)的形式)。 但是,如果向量是(1,2,3,4,2,3,4,5),那么唯一的模式就是 是(1,2,3,4),因为(1,2,3)仅出现在(1,2,3,4)的上下文中。

我想知道几件事:

首先,我希望这些规则不会互相攻击。我是自己做的,所以可能会发生一些我没注意到的冲突,如果你注意到它,请告诉我。

其次,如何以最有效的方式实施此类系统?也许有人可以指出一些关于这个主题的特定文献?我可以逐个数字开始搜索序列重复的所有子集3,然后4,5和20。但这似乎不是很有效.. 我对在C中实现这样的系统感兴趣,但是非常欢迎任何一般指导。

提前谢谢!

1 个答案:

答案 0 :(得分:2)

只有几点意见:

如果您对相对值感兴趣,那么您的第一步应该是计算向量的相邻元素之间的差异,例如:

Original numbers:
1   4   3   2   5   1   1   3   6   5   6   2   5   4   4   4   1   4   3   2
*********                   *********       *********           *********
Difference values:
  3   -1  -1  3   -4  0   2   3   -1  1   4   3   -1  -3  0   -3  3   -1  -1
  ******                      ******          ******              ******

完成后,您可以使用autocorrelation方法查找数据中的重复模式。这可以在 O n log n )时间内计算,如果您只关注完全匹配,可能会更快。