【问题标题】:sequences with the same order in an array - Identify sequences数组中具有相同顺序的序列 - 识别序列
【发布时间】:2015-02-22 14:50:18
【问题描述】:

我正在寻找解决问题的提示: 假设有一个数组,其中一些数字按升序排列,一些数字按降序排列,例如 [1,2,5,9,6,3,2,4,7,8] 有序列 asc [1,2,5,9] , desc [(9),6,3,2], asc [(2),4,7,8]。

现在这不是问题,我可以简单地遍历一个数组并将它们添加到某个数据结构中,当方向改变时 - 我将这个结构存储在某个地方并开始填充下一个。

我发现棘手的是,如果我想设置某种阈值。例如:[0,50,100,99,98,97,105,160] 因此,降序排列的序列 [(100), 99, 98, 97] 可以忽略,因为整体变化是 -3,而序列增加的幅度更大(+100),因此算法只识别出一个按升序排列。

我已经尝试过与上面相同的方法,只是将数据结构中的所有序列相加,然后比较两个后续项的值变化:(100 vs -3 表示 -3 可以忽略)。但是问题是如果我说这种情况:

(仅在序列开始到结束时改变值的示例)

[+100, -3, +1, -50] 在这种情况下,我不能忽视下降运动,因为数字开始下降,然后略微上升,然后又显着下降。

而且它会被这样的东西弄糊涂: [+100, -3, +3, -3, +3, -50]

这是我想要实现的目标的快速草图: 黑线表示数组中的初始数据,红色细线是所需的结果输出

有人能指出我正确的方向吗?我将如何处理这种情况?一次比较多个序列,慢慢将序列组合在一起?也许我需要多次浏览序列? 我不确定我是否遇到过这样的问题并且不知道工作算法。这是我在尝试分析一些数据时遇到的问题。

【问题讨论】:

  • 背景是什么?这些数字代表什么?听起来像一个 NuMa 问题。您似乎正在寻找一种平滑算法:terpconnect.umd.edu/~toh/spectrum/Smoothing.html
  • 这听起来有点像用分段线性函数来逼近数据,可能还有额外的限制,即“件”的数量应该受到限制。另外,对上一条评论+1。一些背景知识可能会有所帮助。

标签: c arrays algorithm sequence


【解决方案1】:

如果我理解正确,您希望您的曲线是一连串交替递增和递减的序列,并带有一些额外的噪音。

消除噪音的常用方法是过滤数据。有数百万种方法可以做到这一点,其中大多数需要频率分析,但在您的情况下,您可能会通过简单的方法获得足够好的结果。

重点是相关变量不是数组中的值,而是它们的变化。

给定 N 个值,考虑包含两个连续值之间差异的 N-1 个元素的数组。

[0,50,100,99,98,97,105,160] -> 50,100,-1,-1,-1,6,45

现在消除绝对值低于给定阈值的所有值(例如 10)

-> 50,100,0,0,0,0,45

然后,您可以通过查看所有正值或空值的条纹来检测上升序列(对于下降序列也是如此,考虑到零值或负值)。

对于所有过滤过程,您必须为您的阈值找到一个最佳位置。太低将无法消除不显着的变化,太高将消除显着的斜率反转。

【讨论】:

  • 这个问题似乎与总变异有关;所以一小部分的小变化可以被认为是噪音,但是一长串的小变化可以积累成一个大的变化
【解决方案2】:

我不知道我是否正确理解了你的问题,但是我之前必须多次进行这种降维,所以我编写了一个小型 javascript 库来这样做。它使用Perceptually Important Points algorithm

在算法中,您可以定义三个连续点之间距离的自定义度量(以衡量单个点增加了多少熵)。

Here is a demonstration (in JS)。它的工作方式有点像堆,您可以在其中删除对整体熵贡献不大的点:

for(var i=0; i<data.length; i++)
    heap.add(data[i]); 
    while(heap.minValue() < threshold)
        heap.removeMin();

And here is the library.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2014-02-21
    • 2020-04-21
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多