Привет всем!
Мне очень нужна ваша помощь в задачи оптимизации ломаной графика. Т.е. построить новую ломаную с меньшим количеством точек до определенного уровня погрешности. Чтобы точки оставались преимущественно в явных вершинах.
Ломаная представляет собой график с большим количеством точек потому выглядит как кривая.
на картинке ниже:
черная линия — график
красная линия — то как необходимо оптимизировать ее
синяя линия — на нее можете не обращать внимания. это построение зигзага по экстремумам. т.е. то как мне не нужно.
Здравствуйте, Airaleais, Вы писали:
A>Привет всем! A>Мне очень нужна ваша помощь в задачи оптимизации ломаной графика. Т.е. построить новую ломаную с меньшим количеством точек до определенного уровня погрешности. Чтобы точки оставались преимущественно в явных вершинах.
Так как есть "определённый уровень погрешности", то можно взять левый край и провести из него отрезок как можно дальше, пока всё укладывается в погрешность. Потом из получившейся точки повторить операцию и т.д. Если реализовать правильно, то алгоритм линеен по количеству точек.
Здравствуйте, RomikT, Вы писали: RT>Так как есть "определённый уровень погрешности", то можно взять левый край и провести из него отрезок как можно дальше, пока всё укладывается в погрешность. Потом из получившейся точки повторить операцию и т.д. Если реализовать правильно, то алгоритм линеен по количеству точек.
"пока всё укладывается в погрешность."
Так вот вопрос как рассчитывать погрешность?
"Потом из получившейся точки повторить операцию"
когда погрешность будет высока это будет не та точка которая от которой следует считать ранее. Эта точка будет уже дальше вершины находится. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением).
Если не отвечать на эти вопросы.. может есть другой алгоритм оптимизации ломаной?
Здравствуйте, Airaleais, Вы писали:
A>интересует алгоритм решения, примерный хотя бы. также приветствуются ссылки на литературу
На первый взгляд подойдёт построение прямой методом наименьших квадратов. Строим, например, по 5-ти первым точкам. Получившаяся погрешность меньше допустимой — добавляем 6-ю точку; опять меньше — 7-ю... При превышении останавливаемся, строим следующий отрезок.
Для ускорения, можно добавлять не по одной точке, а по 2 (3, 4, 5,...), а после превышения уже корректировать.
Здравствуйте, Nuzhny, Вы писали: N>На первый взгляд подойдёт построение прямой методом наименьших квадратов. Строим, например, по 5-ти первым точкам. Получившаяся погрешность меньше допустимой — добавляем 6-ю точку; опять меньше — 7-ю... При превышении останавливаемся, строим следующий отрезок. N>Для ускорения, можно добавлять не по одной точке, а по 2 (3, 4, 5,...), а после превышения уже корректировать.
>"Строим, например, по 5-ти первым точкам."
а почему именно по 5.. эти 5 точек тоже могут быть оптимизированы двумя отрезками а не одним
>"Получившаяся погрешность меньше допустимой"
Так вот вопрос как рассчитывать погрешность?
>"При превышении останавливаемся, строим следующий отрезок."
когда погрешность будет высока это будет не та точка которая от которой следует считать новый отрезок. Эта точка будет уже дальше вершины. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением).
Если не отвечать на эти вопросы.. может есть другой алгоритм оптимизации ломаной?
Здравствуйте, Nuzhny, Вы писали: N>Можешь дать не картинку, а в текстовике набор чисел (x и y)? И максимальную погрешность.
ну.. акей конечно)
[3,5,8,10,11,12,12,12,13,13,14,15,16,17,17,15,7,5,4,6,11,12,14,14,14,14,11,8,2,4,16,15,8,22,24,24,24,20,24,24,20,10,3,1,1,1,1,1,1,1,10,20,20,20,20,20]
вот массив значений Y графика
по X например с 5 с интервалом 1
в графике есть острые и тупые вершины.
N> максимальную погрешность.
ммм.. в чем погрешность? в процентах? ну пусть будет 35%
Здравствуйте, Airaleais, Вы писали:
A>Здравствуйте, RomikT, Вы писали: RT>>Так как есть "определённый уровень погрешности", то можно взять левый край и провести из него отрезок как можно дальше, пока всё укладывается в погрешность. Потом из получившейся точки повторить операцию и т.д. Если реализовать правильно, то алгоритм линеен по количеству точек.
A>"пока всё укладывается в погрешность." A>Так вот вопрос как рассчитывать погрешность?
А как рассчитывать погрешность это уже вы сами должны ответить — вы же сказали "до определенного уровня погрешности"
A>"Потом из получившейся точки повторить операцию" A>когда погрешность будет высока это будет не та точка которая от которой следует считать ранее. Эта точка будет уже дальше вершины находится. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением).
Под "провести отрезок как можно дальше" я подразумевал "соединить начальную точку с как можно более удалённой точкой кривой".
A>Если не отвечать на эти вопросы.. может есть другой алгоритм оптимизации ломаной?
Возможно. Если вы определитесь с тем, что хотите от него получить.
Здравствуйте, RomikT, Вы писали: A>>"пока всё укладывается в погрешность." A>>Так вот вопрос как рассчитывать погрешность? RT>А как рассчитывать погрешность это уже вы сами должны ответить — вы же сказали "до определенного уровня погрешности"
Ну образно я понимаю.. алгоритмически нет. иначе я бы тут сейчас не дискутировал)
A>>"Потом из получившейся точки повторить операцию" A>>когда погрешность будет высока это будет не та точка которая от которой следует считать ранее. Эта точка будет уже дальше вершины находится. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением). RT>Под "провести отрезок как можно дальше" я подразумевал "соединить начальную точку с как можно более удалённой точкой кривой".
Я правильно тебя понял и повторюсь. вторая точка отрезка, когда погрешность уже высока будет находится дальше то до которой стоит рисовать отрезок. т.е. мы проскочим ВЕРШИНУ графика.. вот)
A>>Если не отвечать на эти вопросы.. может есть другой алгоритм оптимизации ломаной? RT>Возможно. Если вы определитесь с тем, что хотите от него получить.
ну по рисунке понятно ведь) уменьшить количество точек ломаной оставив их преимущественно на вершинах его или ОСТРЫХ ПОВОРОТАХ графика.
например:
[1,2,1,2,1,2,6,7,6,7,6,6,1,0,1,1,2,1]
вот график. это значния по Y. по Х значения от 0 с интервалом 1.
вот оптимизированый график[x,y]:
[0,1],[5,1],[6,6],[11,6],[12,1]]
мы тут опредили начало и конец [0,1] .. [12,1]
и углы графика. указали их координаты
Здравствуйте, Airaleais, Вы писали:
A>Здравствуйте, Nuzhny, Вы писали: N>>На первый взгляд подойдёт построение прямой методом наименьших квадратов. Строим, например, по 5-ти первым точкам. Получившаяся погрешность меньше допустимой — добавляем 6-ю точку; опять меньше — 7-ю... При превышении останавливаемся, строим следующий отрезок. N>>Для ускорения, можно добавлять не по одной точке, а по 2 (3, 4, 5,...), а после превышения уже корректировать.
>>"Строим, например, по 5-ти первым точкам." A>а почему именно по 5.. эти 5 точек тоже могут быть оптимизированы двумя отрезками а не одним
Это параметр алгоритма, который стоит подобрать экспериментально, на некотором количестве примеров. В крайнем случае начитать с 3 точек.
>>"Получившаяся погрешность меньше допустимой" A>Так вот вопрос как рассчитывать погрешность?
Если использовать метод наименьших квадратов, то естественно и брать в качестве погрешности сумму квадратов отклонений по всем точкам.
>>"При превышении останавливаемся, строим следующий отрезок." A>когда погрешность будет высока это будет не та точка которая от которой следует считать новый отрезок. Эта точка будет уже дальше вершины. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением).
Можете пояснить это утверждение.
A>Если не отвечать на эти вопросы.. может есть другой алгоритм оптимизации ломаной?
Есть ещё идея. Найти вторую производную, возможно сгладить её (чтоб убрать мелкие локальные экстремумы), и после этого вершинами ломаной считать экстремумы второй производной.
Здравствуйте, KRA, Вы писали: >>>"Строим, например, по 5-ти первым точкам." A>>а почему именно по 5.. эти 5 точек тоже могут быть оптимизированы двумя отрезками а не одним KRA>Это параметр алгоритма, который стоит подобрать экспериментально, на некотором количестве примеров. В крайнем случае начитать с 3 точек.
А если точки такие.. [100,0,100] тут явный угол и он будет описан двумя отрезками обязательно. выходит с двух надо начинать.
KRA>Если использовать метод наименьших квадратов, то естественно и брать в качестве погрешности сумму квадратов отклонений по всем точкам.
прямо сейчас начну гуглить "сумма наименьших квадратов"
>>>"При превышении останавливаемся, строим следующий отрезок." A>>когда погрешность будет высока это будет не та точка которая от которой следует считать новый отрезок. Эта точка будет уже дальше вершины. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением). KRA>Можете пояснить это утверждение.
Наверно нет смысла пояснять. дело в том что это актуально в случае когда мы строим отрезок последовательно проходя по Х по одному и проверяя погрешность получившегося отрезка. у меня сначала был такой алгоритм. ставил первую точку. вторую вычислял как СРЕДНЮЮ ТОЧКУ из всех последующих. в случае когда точки сильно отклоняются от прямой (начало: [X1,Y1], конец: [(X2_1+X2_2+..+X2_n)/n , (Y2_1+Y2_2+..+Y2_n)/n])), то на этом месте или на приблизительно Xn-2 позиции считать концом отрезка и началом первого.
но это схема на рабочая..может рабочая но очень не точно.
A>>Если не отвечать на эти вопросы.. может есть другой алгоритм оптимизации ломаной?
KRA>Есть ещё идея. Найти вторую производную, возможно сгладить её (чтоб убрать мелкие локальные экстремумы), и после этого вершинами ломаной считать экстремумы второй производной.
Здравствуйте, Airaleais, Вы писали:
KRA>>Это параметр алгоритма, который стоит подобрать экспериментально, на некотором количестве примеров. В крайнем случае начитать с 3 точек. A>А если точки такие.. [100,0,100] тут явный угол и он будет описан двумя отрезками обязательно. выходит с двух надо начинать.
Это не факт, зависит от масштаба. Если точки такие [100, 0, 100, 1000000000, 12000000000], то скорее одним отрезком.
Какова природа функции? Т.е. откуда данные берутся? Если извесно что функция непрерывная, то в случае [100, 0, 100, 110, 130] 0 нужно считать ошибкой измерения.
>>>>"При превышении останавливаемся, строим следующий отрезок." A>>>когда погрешность будет высока это будет не та точка которая от которой следует считать новый отрезок. Эта точка будет уже дальше вершины. Надо находить именно точку на вершинах кривой(ломаной с высоким разрешением). KRA>>Можете пояснить это утверждение. A>Наверно нет смысла пояснять. дело в том что это актуально в случае когда мы строим отрезок последовательно проходя по Х по одному и проверяя погрешность получившегося отрезка. у меня сначала был такой алгоритм. ставил первую точку. вторую вычислял как СРЕДНЮЮ ТОЧКУ из всех последующих. в случае когда точки сильно отклоняются от прямой (начало: [X1,Y1], конец: [(X2_1+X2_2+..+X2_n)/n , (Y2_1+Y2_2+..+Y2_n)/n])), то на этом месте или на приблизительно Xn-2 позиции считать концом отрезка и началом первого. A>но это схема на рабочая..может рабочая но очень не точно.
Этот метод (если я его правильно понял) интуитивно не будет давать хороших результатов. Гораздо лучше пробовать в качестве конца отрезка точку кривой и для отрезка считать отклонение. Пока отклонение в пределах заданой погрешности — продолжаем. Вышло за пределы — начинаем новый отрезок.
KRA>>Есть ещё идея. Найти вторую производную, возможно сгладить её (чтоб убрать мелкие локальные экстремумы), и после этого вершинами ломаной считать экстремумы второй производной.
A>что-то непонятно написал.. тоже погуглю спасибо
Глядя на пример на глаз видно, что точки результирующей ломаной находятся в точках в которых третья производная равна нулю, отсюда и идея. Построить для имеющихся примеров третьи производные и посмотреть насколько их нули корелируются с вручную построенными ломаными.
Здравствуйте, Airaleais, Вы писали:
A>Привет всем! A>Мне очень нужна ваша помощь в задачи оптимизации ломаной графика. Т.е. построить новую ломаную с меньшим количеством точек до определенного уровня погрешности. Чтобы точки оставались преимущественно в явных вершинах.
Алгоритм Дугласа-Пекера (Douglas Peucker)
Re[2]: Оптимизация ломаной - КОД (Алгоритм Дугласа-Пекера)