Программно проанализировать линейный график - PullRequest
1 голос
/ 05 ноября 2011

Я получил линейный график с осью Y, имеющей значение, и осью X, имеющей время.Ось X имеет разрешение 5 минут.Я ищу какой-то алгоритм, который поможет мне научить iPhone понимать, куда идет линия .Я никогда не брал класс алгоритмов, поэтому любая помощь будет оценена.Что мне нужно знать, так это то, что линия непрерывно поднималась на определенное количество сегментов непрерывно.

Сейчас я реализую следующее: Если текущая точка данных имеет значение Y больше, чем предыдущее, приращениесчетчик наклона по одному.Если он равен, увеличьте счетчик наклона на 0. Если значение меньше, уменьшите счетчик наклона.

if(current>previous)
{
  counter++;
}
else if(current<previous)
{
  counter--;
}

Это создает пилообразные графики, которые легче анализировать.Однако из-за проблем с размером окна график может «отскочить».Вот где я ожидаю, что у моей логики будут проблемы.

Я надеюсь, что есть какой-то алгоритм CS, который поможет мне с этой задачей, так как я даже не знаю, какие ключевые слова ввести в Google для этой проблемы.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

Если все, что вам нужно знать, это если линия непрерывно растет для определенного количества сегментов, почему бы просто не иметь счетчик, который увеличивается до тех пор, пока не достигнет определенного количества сегментов, или не сбросится, если линия идет вниз, как:

int counter = 0;
for (int i = 1; i < datasize; i++) {
  if (data[i] > data[i - 1]) {
    ++counter;
    if (counter == THRESHOLD) {
      println("trending up at %d.", i);
    }
  } else if (data[i] < data[i - 1]) {
    counter = 0;
  }
}

Если вы просто хотите увидеть, в целом ли линия идет вверх или вниз, вы могли бы просто сделать это:

if (data[datasize - 1] > data[0]) {
  println("Overall trend is up.");
} else if (data[datasize - 1] < data[0]) {
  println("Overall trend is down.");
} else {
  print("Overall trend is flat.");
}

Если вы хотите улучшить прогноз -как, вот линия до этого момента, вот предположение, на что это будет похоже в будущем, есть два пути, чтобы исследовать.Первый - это «регрессионный анализ» или «линии регрессии».Это будет работать лучше всего для данных, которые обычно увеличиваются или уменьшаются с течением времени, и даст вам скорость этих увеличений или уменьшений (средний наклон линии).

Второй - «Быстрое преобразование Фурье».«- это полезно для линий, которые похожи на волны, в том смысле, что они остаются между минимальной и максимальной границами и имеют некоторый регулярный цикл (или число регулярных циклов, что и будет уравновешивать уравнение).

Повеселись.Это приятная проблема для решения.

1 голос
/ 06 ноября 2011

То, что вы можете искать, это Линейная регрессия , которая оценивает хорошее соответствие прямой линии вашим данным (в смысле наименьших квадратов).Наклон этой линии может помочь вам определить, куда она движется, в зависимости от поведения базовой модели.

...