我正在寻找解决问题的方法: 假设有一个数组按升序排列,有些按降序排列,例如[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]。
现在这不是问题,我可以简单地遍历一个数组并将它们添加到某个数据结构中,当方向改变时 - 我将这个结构存储在somwhere并开始填充下一个。
我觉得棘手的是,如果我想要某种门槛。例如:[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]
这是我想要实现的快速草图: 黑线代表阵列中的初始数据,需要红色细线产生输出
有人能指出正确的方向吗?我该如何处理这种情况?一次比较多个序列慢慢地将序列组合在一起?也许我需要多次完成序列? 我不确定如果我遇到过这样的问题并且不知道工作算法。这是我在试图分析一些数据时面临的一个问题。
答案 0 :(得分:2)
如果我理解正确的话,你会发现你的曲线是一系列交替增加和减少的序列,伴随着一些额外的噪音。
摆脱噪音的常用方法是过滤数据。有数百种方法可以做到这一点,其中大部分都需要进行频率分析,但在你的情况下,你可以用简单的东西获得足够好的结果。
重点是相关变量不是数组中的值,而是它们的变体。
给定N个值,考虑N-1个元素的数组,它们保持两个连续值之间的差异。
[0,50,100,99,98,97,105,160] - > 50100,-1,-1,-1,6,45
现在消除绝对值低于给定阈值的所有值(例如10)
- > 50,100,0,0,0,0,45
然后,您可以通过查看所有正值或空值的条纹来检测上升序列(对于递减序列,同样考虑零值或负值)。
对于所有过滤流程,您必须找到适合您的阈值的最佳位置。太低,它将无法消除无关紧要的变化,太高,它将消除显着的斜率反演。
答案 1 :(得分:0)
我不知道我是否正确理解你的问题,但我之前不得不多次进行这种降维,所以我写了一个小的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();