2016-08-20 3 views
1

Я не уверен, что это правильный термин, но я думаю, что хочу, чтобы s̶m̶o̶o̶t̶h̶ ̶a̶n̶d̶/̶o̶r̶ приблизился к набору данных. У меня есть 30 точек данных, как показано в таблице ниже (красная линия с точками) Я хочу приблизить набор данных, чтобы его можно было описать с меньшим количеством точек данных. Черная линия представляет собой то, что я хочу достичь. chart1Как приблизиться к данным временных рядов

Я хочу, чтобы определить уровень аппроксимации, который будет определять, насколько набор данных результата будет отличаться от исходного. Примерный набор данных должен содержать набор точек данных, с которыми я могу соединиться, используя прямые линии.

Каков правильный алгоритм или математическая функция для решения этой проблемы? Я не ожидаю реализации здесь, а некоторые предложения, с чего начать.

Я написал свою реализацию алгоритма аппроксимации. Он работает в большинстве случаев, но есть определенные ситуации, в которых он возвращает неоптимальные данные. В приведенном ниже примере показаны три пунктирные линии. Тонкая красная линия - это исходный набор данных, из-за моего алгоритма генерируется густая красно-черная пунктирная линия, а зеленая линия - это то, что я хотел бы достичь.

my implementation

 var previousValue; 
     return array.map(function (dataPoint, index, fullArray) { 
      var approximation = dataPoint; 

      if (index > 0) { 
       if (Math.abs(previousValue - value) < tolerance) { 
        approximation = previousValue; 
       } else { 
        previousValue = dataPoint; 
       } 

      } else { 
       previousValue = dataPoint; 
      } 

      return approximation; 
     }); 
+0

Вы пробовали что-нибудь? Я сомневаюсь, что существует стандартный алгоритм, который соответствует вашей черной линии, так как точки оси x не равномерно распределены. Подумайте об использовании «скользящей средней», чтобы сгладить данные, а затем выберите все n точек, чтобы уменьшить количество точек. – bhspencer

+0

для упрощения, предположим, что точки на оси х выровнены по красным точкам, но их меньше. Я написал свой собственный алгоритм, чтобы выполнить приближение, которое в основном идет слева направо и игнорирует все точки, находящиеся в пределах определенного уровня допуска. Если какое-либо значение превышает уровень допуска, создается новая точка данных и устанавливается как новая база сравнения. Алго работает нормально, но есть случаи, когда это не идеально. Вот почему я спрашиваю, есть ли какое-то общее решение, поэтому мне не нужно изобретать колесо. Я добавил примеры вывода моего эго выше. – maestr0

ответ

1

Есть два варианта здесь:

  1. если показано «глюк» в данных имеет большое значение, а это означает, что вы не можете сгладить ее.
  2. если все приведенные данные могут быть аппроксимированы и «глюк» незначителен

В (1) случае, вы можете рассмотреть приблизительные шаблоны (например, вейвлет) или использовать основной дифференциальный анализ, чтобы обнаружить и сохранить " сбой "(например, сетки). В корпусе (2) вы можете использовать MA, ARIMA для установки, где «глюк» можно проанализировать далее через корни

1

Хорошо, уточните, желаете ли вы сгладить данные или приблизиться к ним? Если вы собираетесь сгладить данные, по определению они избавятся от небольших ударов и провалов в серии данных. С другой стороны, если целью является точное отображение всех этих провалов и ударов, то вы НЕ хотите сглаживания. Я собираюсь поговорить о сглаживании, скажите мне, хотите ли вы другого.

Хорошо, лучший способ, которым я знаю, чтобы сгладить данные, - использовать значение альфа. Уравнение T n + 1 = (1- α) T n + α Данные n + 1. Это означает, что вы устанавливаете часть следующей точки функции, на которую влияет история серий и часть, на которую влияет текущая точка данных.

Example graph with alpha = .5 Взгляните на эти данные. Здесь α = .5. Таким образом, функция соответствует данным, но не много. Тот, который ниже, тот же, но альфа - .25. Таким образом, данные соблюдаются еще меньше, но функция намного более плавная. Существует также третий вариант, когда α со временем уменьшается. Первоначально он может быть очень высоким, поэтому вы быстро следуете данным, но затем, когда α со временем уменьшается, тренд становится более плавным и остается плавным с течением времени. Наконец, вы можете установить жесткий предел на минимум α. Это гарантирует, что вы всегда будете иметь минимальную отзывчивость к данным.

Example graph with alpha = .25

+0

ОК, спасибо за ваше объяснение. Это помогло мне понять, что мне действительно нужно приближение. По сути, я хочу уменьшить количество точек данных и оставаться как можно ближе к исходной форме графика. Моя первая диаграмма показывает приближение красного набора данных как черную линию. Мне нужно всего 5 баллов, чтобы описать эту строку (включая начальную и конечную точки) – maestr0

Смежные вопросы