Какой лучший способ проверить, имеет ли последовательность чисел тенденцию к увеличению или уменьшению?
Я знаю, что могу выбрать первое и последнее значение последовательности и проверить их разницу, но я бы хотел более надежную проверку. Это означает, что я хочу иметь возможность мириться с меньшим количеством возрастающих значений в большей части убывающей последовательности и наоборот.
В частности, номера хранятся как
vector<int> mySequence;
Еще несколько подробностей о числовых последовательностях, с которыми я имею дело:
Я бы накапливал количество увеличений против количества уменьшений, что должно дать вам представление о том, существует ли общая тенденция к увеличению или уменьшению.
Вы, вероятно, могли бы посмотреть в оценка тренда и какой-то тип регрессии, как линейная регрессия.
Конечно, это зависит от вашего конкретного применения, но в целом это звучит как подходящая проблема.
Я думаю, что вы можете просто вычислить медиану вашей последовательности и проверить, больше ли она, чем первое значение.
Это ОДИН путь, а не путь.
Другим способом, всегда учитывающим среднюю среду, можно проверить количество восходящих и нисходящих значений в последовательности.
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;
}
Одной из возможностей будет подсчет количества восходящих и нисходящих значений в последовательности:
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
Скорее всего, я бы попытался разбить последовательность на несколько сегментов, как вы сказали, значения не сильно отличаются — смотрите кусочная регрессия
и интерпретировать сегменты как твой бизнес нуждается.
Вам понадобится вектор для хранения сегментов, каждый сегмент имеет индекс начала / конца, какое-то среднее значение и т. Д. — см. Также где разделить кусочную регрессию
Я предлагаю использовать методы математического анализа (например, интегральное и дифференциальное исчисление), применяемые к дискретным целочисленным последовательностям.
Тогда можно вычислить скользящие средние и посмотреть, увеличиваются или уменьшаются эти средние. Естественно и просто;)