如何检查一系列数字在C ++中是否有增加/减少的趋势

时间:2013-12-02 13:30:53

标签: c++ vector int trend

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

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

更具体地说,这些数字存储为

vector<int> mySequence;

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

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

6 个答案:

答案 0 :(得分:8)

我会累计增加的数量与减少的数量,这可以让你知道是否存在增加或减少的整体趋势。

答案 1 :(得分:3)

您可能会查看trend estimation和某些类型的回归,例如linear regression

当然这取决于你的具体应用,但总的来说这听起来很合适。

答案 2 :(得分: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;    
}

答案 3 :(得分: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

结束

答案 4 :(得分:0)

我很可能会尝试将序列拆分成多个段,正如您所说的值没有显着差异 - 请参阅piecewise regression  并将细分为业务需求

您需要一个用于存储细分的向量,每个细分具有开始/结束索引,某种中值等等 - 另请参阅where to split a piecewise regression

答案 5 :(得分:0)

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

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