Перейти к содержанию
    

Фильтрация точечного графика

Добрый день!

Имеется набор данных (одномерный массив).

Если построить график этого массива по точкам, то получится приложенная картинка.

781164003_.thumb.PNG.c4f7102abc8e3ec4b68ee92658a2c312.PNG

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2022 at 9:03 AM, Dootch said:

но она не очень эффективна если сначала идет линия, потом прерывается, а потом начинается снова.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 18.07.2022 в 09:03, Dootch сказал:

Никак не могу придумать алгоритм выделения (фильтрации) этих полос на фоне остальных точек.

Вы так и не сказали - что нужно на выходе? Что такое "выделение"?

Нужно построить список уровней, отсортированный по количеству попадающих в них точек (попадающих с некоторой точностью/дискретностью)?

Или есть набор дискретных уровней, и нужно посчитать сколько было попаданий в каждый уровень и отсортировать по количеству?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 18.07.2022 в 09:03, Dootch сказал:

Добрый день!

Имеется набор данных (одномерный массив).

Если построить график этого массива по точкам, то получится приложенная картинка.

781164003_.thumb.PNG.c4f7102abc8e3ec4b68ee92658a2c312.PNG

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

 

Это задача кластеризации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2022 at 6:25 PM, seniorandre said:

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

Число отсчетов примерно такое как на графике (около 13к). Анализ не нужно делать в реальном времени, есть блок данных у него нужно выявить значения этих фиксированных уровней плюс оценить их дисперсию и пометить те точки, которые лежат на этих уровнях.

On 7/18/2022 at 6:44 PM, jcxz said:

Вы так и не сказали - что нужно на выходе? Что такое "выделение"?

Нужно построить список уровней, отсортированный по количеству попадающих в них точек (попадающих с некоторой точностью/дискретностью)?

Или есть набор дискретных уровней, и нужно посчитать сколько было попаданий в каждый уровень и отсортировать по количеству?

Собственно, точки которые лежат на этих уровнях мне нужно отбросить, это я имел ввиду под словом выделить. В результате нужно что-то вроде того как на картинке.

 

Снимок2.png

On 7/18/2022 at 7:06 PM, thermit said:

Это задача кластеризации.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2022 at 12:09 PM, Dootch said:

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

Разбить данные на несколько вертикальных полос. В каждой полосе строить гистограмму по значениям вертикальной координаты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 18.07.2022 в 12:09, Dootch сказал:

Собственно, точки которые лежат на этих уровнях мне нужно отбросить, это я имел ввиду под словом выделить. В результате нужно что-то вроде того как на картинке.

Пришло в голову такое: строить гистограмму, выделять один (глобальный) максимум (т.е. некий диапазон значений на вертикальной оси, в который попадает больше всего точек ), удалять точки, соответствующие этому максимуму, и далее возвращаться к следующей итерации. Повторять это можно до тех пор, пока гистограмма не станет достаточно "равномерной", т.е. ее определяемый максимум не будет отличаться от среднего значения более, чем на, например, 20%. (или другой порог, который придется подбирать экспериментально).

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

В результате должна будет получиться картинка без "кучкующихся" точек.

Изменено пользователем mars_208

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 18.07.2022 в 12:09, Dootch сказал:

Число отсчетов примерно такое как на графике (около 13к). Анализ не нужно делать в реальном времени, есть блок данных у него нужно выявить значения этих фиксированных уровней плюс оценить их дисперсию и пометить те точки, которые лежат на этих уровнях.

Собственно, точки которые лежат на этих уровнях мне нужно отбросить, это я имел ввиду под словом выделить. В результате нужно что-то вроде того как на картинке.

 

Снимок2.png

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

Не надо ничего изобретать. Надо решать задачу стандартными методами. К-средних, например.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/19/2022 at 2:16 AM, thermit said:

Не надо ничего изобретать. Надо решать задачу стандартными методами. К-средних, например.

Просмотрел алгоритм К-средних и даже попробовал его применить с использованием библиотеки alglib. Мне кажется в данной задаче подобный алгоритм кластеризации без глубокой модификации плохо применим. Во-первых, нам неизвестно количество центров. Во-вторых кластеризация хорошо работает с реально локализованными группами, а тут помимо явно видных кластеров, есть еще множество разбросанных по полю точек, которое в один кластер объединено не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 19.07.2022 в 08:30, Dootch сказал:

Просмотрел алгоритм К-средних и даже попробовал его применить с использованием библиотеки alglib. Мне кажется в данной задаче подобный алгоритм кластеризации без глубокой модификации плохо применим. Во-первых, нам неизвестно количество центров. Во-вторых кластеризация хорошо работает с реально локализованными группами, а тут помимо явно видных кластеров, есть еще множество разбросанных по полю точек, которое в один кластер объединено не будет.

Да. модифицировать придется. Легкой жизни никто не обещал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/19/2022 at 9:08 PM, thermit said:

Да. модифицировать придется. Легкой жизни никто не обещал.

К чему тогда фраза "Не надо ничего изобретать. Надо решать задачу стандартными методами."? Если модификация того же K-mean потребует больше времени и сил чем другие методы, то я лучше поизобретаю. Или попробую предложенные тут подходы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 19.07.2022 в 15:20, Dootch сказал:

К чему тогда фраза "Не надо ничего изобретать. Надо решать задачу стандартными методами."? Если модификация того же K-mean потребует больше времени и сил чем другие методы, то я лучше поизобретаю. Или попробую предложенные тут подходы.

Как угодно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...