Алгоритм прореживания графика

Tanya63

Постановка задачи такова:
Имеется график процесса: изменение показателя во времени.
Показатель принимает значения от 0 до 100.
Показатель этот обычно близок к 100, но иногда на 5 минут случаются его провалы (резкое уменьшение).
Всего в графике 10000 точек.
График строится неэффективной программой Oracle BI, которая очень медленно прорисовывает 10000 точек фо флэшку.
Поэтому надо обработать данные для графика - оставить только 1000 точек, оставив внешний вид графика примерно таким же.
Т.е. там, где 10 точек подряд идут вблизи показателя, равного 100, соединить прямой две крайние точки.
А там, где был провал, не потерять данные.

blackout

Можно посчитать разности между соседними точками, из получившихся 9999 чисел выбрать 50 самых больших и потом оставить только точки, входящие в 50 соответствующих пар. Итого получится 51-100 точек.
Это первое, что в голову приходит.
Не подойдет, если больше 50 особенностей.

Tanya63

Наверно надо выбирать не 50 наибольших разниц, а те, где разница больше, чем, например 5.
Есть что-нибудь более научное?

blackout

а те, где разница больше, чем, например 5.
Ну тогда у тебя в и тоге может остаться заметно больше или заметно меньше, чем 100 точек. Оба варианта плохи.

Tanya63

Критичней потерять точность, чтом скорость построения графика. Если было много провалов, то уж ладно, пусть мучается и строит 10000 точек.

Maria-mirabella

а если подумать в таком направлении:
0. в качестве текущего вектора направления берем вектор от нулевой точки к первой точке. если они по оси абсцисс равномерно распределены, то смотрим только вертикальную проекцию этого вектора. в качестве текущей высоты берем высоту нулевой точки.
1. бежим по точкам, каждый раз смотря на вектор от i-ой точки к (i+1)-ой.
2. если это новое значение вектора сильно отличается от предыдущего (формальное определение, видимо, зависит от практической задачи то добавляем i-ую точку и считаем ее высоту новой текущей высотой. обновляем значение текущего вектора направления, записывая туда вектор от i к i+1.
в любом случае переходим к следующей точке.
3. если на предыдущем шаге пункт 2 не отработал, то смотрим текущую высоту. если разница превышает некоторое критическое значение (которое мы сами выбираем из каких-то соображений то добавляем эту точку, запоминаем ее высоту в качестве текущей, а вектор от предыдущей точки к этой запоминаем в качестве текущего вектора направления.

blackout

Критичней потерять точность,
Ну тогда можно сделать так, как ты предложил. Оставить пары точек, в которых разность больше некоторой величины. Потом если останется несколько пар, состоящих из подряд идущих точек, причем на этих точка график монотонен, можно будет все эти точки кроме крайних двух выкинуть.
Понятно, что этот алгоритм 1) сохраняет колебания, большие выбранного числа 2) не содержит лишних точек.

blackout

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

svetik5623190

Запустить поиск минимума, и оставить только +- 20 точек от точки, в которой принимается минимум. Ну и ещё оставить первую и последнюю точку, конечно.
Сработает, если минимум один и резкий, как у тебя на графике.

ETrohkina

Построй частотной распределение приращений и обрежь хвостики (наименее редко встречающиеся)
Оставить комментарий
Имя или ник:
Комментарий: