4

检查数字序列是否具有增加或减少趋势的最佳方法是什么?

我知道我可以选择序列的第一个和最后一个值,并检查它们的差异,但我想要一个更强大的检查。这意味着我希望能够在大部分递减的序列中容忍少数递增的值,反之亦然。

更具体地说,数字存储为

vector<int> mySequence;

关于我正在处理的数字序列的更多细节:

  • 序列中的所有数字具有相同的数量级。这意味着不会出现如下序列:[45 38 320 22 12 6]。
  • 下降趋势是指序列中的大多数或所有数字都小于前一个。(相反的适用于上升趋势)。因此,以下序列将被视为降序: [ 45 42 38 32 28 34 26 20 12 8 48]
4

6 回答 6

9

我会累积增加的数量与减少的数量,这应该让您了解总体趋势是增加还是减少。

于 2013-12-02T13:41:04.680 回答
3

您可能可以研究趋势估计和某种类型的回归,如线性回归

这当然取决于您的具体应用,但总的来说,这听起来像是一个合适的问题。

于 2013-12-02T13:47:19.153 回答
1

我认为您可以简单地计算序列的中位数并检查它是否大于第一个值。
这是一种方式,而不是方式。

另一种方式,始终考虑平均介质,您可以检查序列中升序和降序值的数量。

int trend = 0;
int avg = mySequence[0]; 
int size = mySequence.size();
for (int i=0; i < size - 1; ++i) {
  if(i > 0) { 
   avg = (avg + mySequence[i]) / 2; 
  }
  (mySequence[i+1] - avg) > 0 ? ++trend; --trend;    
}
于 2013-12-02T13:41:13.637 回答
0

正如您所说,我很可能会尝试将序列拆分为多个段,因为这些值没有显着差异 - 请参阅分段回归 并将这些段解释为您的业务需求

您将需要一个向量来存储段,每个段都有开始/结束索引、某种中值等 - 另请参阅分割分段回归的位置

于 2013-12-02T15:52:30.120 回答
0

一种可能性是计算序列中升序和降序值的数量:

int trend = 0;
for (int i=0;i<mySequence.size()-1;++i)
{
    diff = mySequence[i+1] - mySequence[i];
    if (diff > 0)
    {
       trend++;
    }
    else if (diff < 0)
    {
       trend--;
    }
}

您在示例中给出的序列将以trend等于 -6结尾

于 2013-12-02T13:46:42.663 回答
0

我建议使用应用于离散整数序列的数学分析方法(例如积分和微积分)。

一种方法是计算滚动平均值并查看这些平均值是增加还是减少。自然而简单;)

于 2015-11-21T09:19:33.543 回答