реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Усреднение двумерных выборок
minibrain
сообщение Nov 19 2015, 15:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-12-14
Из: Санкт-Петербург
Пользователь №: 84 344



Здравствуйте. Прошу помощи в решении такой задачи.
Имеется массив плоских координат [x, y]. Большинство значений колеблются вокруг одной точки, но часть значений находятся очень далеко. Как можно реализовать фильтрацию?
В данный момент находится среднее арифметическое по обеим координатам, но выбросы порождают большое смещение от точки, на которую указывает большинство измерений.
Хотелось бы как-то автоматически определять центр скопления точек (район максимальной плотности). Прошу подсказать подходящий алгоритм.
На прикрепленном рисунке зеленым цветом помечены выборки. Розовым - действительное значение (из модели), черным - среднее арифметическое.

Спасибо за внимание.


Сообщение отредактировал minibrain - Nov 19 2015, 15:09
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
ШСА
сообщение Nov 19 2015, 15:18
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Цитата(minibrain @ Nov 19 2015, 18:08) *
Имеется массив плоских координат [x, y]. Большинство значений колеблются вокруг одной точки, но часть значений находятся очень далеко. Как можно реализовать фильтрацию?

Маленькое уточнение: координаты должны обрабатываться по мере поступления (в реальном времени) или обрабатывается сразу готовый массив?
Go to the top of the page
 
+Quote Post
thermit
сообщение Nov 19 2015, 15:18
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Построить гистограмму. Выбрать x и y соответствующие максимуму гистограммы.
Go to the top of the page
 
+Quote Post
Grizzzly
сообщение Nov 19 2015, 15:18
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748



Цитата(minibrain @ Nov 19 2015, 19:08) *
Здравствуйте. Прошу помощи в решении такой задачи.
Имеется массив плоских координат [x, y]. Большинство значений колеблются вокруг одной точки, но часть значений находятся очень далеко. Как можно реализовать фильтрацию?

Решение "в лоб" - построить двумерную гистограмму, т.е. разбить плоскость сеткой, размеры которой определяются необходимой точностью определения координат.
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 19 2015, 15:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



для начала добавить в вычисление среднего вес, исходя из плотности точек на единицу площади, а найдя более менее нормальный максимум, посчитать среднеквадратитчное отклонение и выкинуть точки что за тремя сигмами оказались, и пересчитать еще раз среднее уже без весов.
Go to the top of the page
 
+Quote Post
minibrain
сообщение Nov 19 2015, 15:21
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-12-14
Из: Санкт-Петербург
Пользователь №: 84 344



Цитата(ШСА @ Nov 19 2015, 16:18) *
Маленькое уточнение: координаты должны обрабатываться по мере поступления (в реальном времени) или обрабатывается сразу готовый массив?

Готовый массив.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Nov 19 2015, 16:25
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Цитата(minibrain @ Nov 19 2015, 18:21) *
Готовый массив.

Что-то не дождусь реакции гуру.
Есть дедовский итерационный алгоритм последовательного отсечения недостоверных отсчётов.
1. Вычисляем среднюю точку O1 усреднением всех точек;
2. Вычисляем радиус от O1 до каждой имеющейся точки и выявляем максимальный радиус отклонения Rmax;
3. Задаём радиус отсечения R0, меньший Rmax. Например R0 = Rmax/2;
4. Просматриваем все точки и подсчитываем число точек, для которых радиус отклонения от O1 превышает R0;
5. Если число таких точек превышает 10%, увеличиваем R0 на половину разницы между Rmax и R0. Переход к п.4.;
Если число таких точек равно нулю, уменьшаем R0, например, на 10%. Переход к п.4.;
6. Вычисляем среднюю точку O2 усреднением тех точек, для которых радиус отклонения от O1 не превышает R0;
7. Если расстояние между O1 и O2 превышает заданную точность, присваиваем O1 = O2; Переход к п.2;
Иначе Выход.
Go to the top of the page
 
+Quote Post
minibrain
сообщение Nov 19 2015, 16:30
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-12-14
Из: Санкт-Петербург
Пользователь №: 84 344



Спасибо всем, кто ответил. Попробовал построить hist3 в матлабе. Очень хорошо, на первый взгляд.
Может, есть какая-то хорошая, проверенная библиотека на С/С++, которая решала бы эту задачу?

С тремя сигмами пробовал, но выдающихся результатов почему-то не получил.
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 19 2015, 16:38
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(minibrain @ Nov 19 2015, 23:30) *
С тремя сигмами пробовал, но выдающихся результатов почему-то не получил.

Давайте данные.
Go to the top of the page
 
+Quote Post
minibrain
сообщение Nov 19 2015, 16:52
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-12-14
Из: Санкт-Петербург
Пользователь №: 84 344



_pv, реальных данных не сохранилось. Проверю тогда снова на сигмах моделированные данные, если результата не будет - выложу, чтобы ваше время зря сейчас не тратить.
Go to the top of the page
 
+Quote Post
Grizzzly
сообщение Nov 19 2015, 16:53
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748



Цитата(minibrain @ Nov 19 2015, 19:30) *
Может, есть какая-то хорошая, проверенная библиотека на С/С++, которая решала бы эту задачу?

В GSL есть функции гистограмм.
Go to the top of the page
 
+Quote Post
minibrain
сообщение Nov 19 2015, 17:33
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-12-14
Из: Санкт-Петербург
Пользователь №: 84 344



_pv, Вы не могли бы дать ссылку на примерное описание (формулы, или программу в матлабе) того, что вы имели в виду? может, я что-то не верно делал просто.
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 19 2015, 17:56
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(minibrain @ Nov 19 2015, 23:52) *
_pv, реальных данных не сохранилось. Проверю тогда снова на сигмах моделированные данные, если результата не будет - выложу, чтобы ваше время зря сейчас не тратить.

я про исходные данные по которым картинка в первом посте нарисована.

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

а вообще, если вычислительной мощности не жалко, считайте двумерную корреляцию с гауссом,
или же вообще наименьшими квадратами его же на данные натягивайте, там отдельные удалённые точки на положение максимума особо влиять не будут.
либо вообще построить двумерную гистограмму, и по полученной пикселизированной картинке, что-то вроде преобразования Хафа с тем же Гауссом (сложить картинку саму с самой собой со смещениями и с весом по тому же Гауссу), оно всякие левые скопления точек не похожие по форме на Гаусса с заданной шириной хорошо отфильтрует, и потом уже искать среднее.
Go to the top of the page
 
+Quote Post
minibrain
сообщение Nov 19 2015, 18:23
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 29-12-14
Из: Санкт-Петербург
Пользователь №: 84 344



Я делал так:
1) сортировал массив по координате х.
2) брал из него медианное значение.
3) для каждого элемента в массиве вычислял значение delta = abs(X - Xmedian); delta2 = delta ^2;
4) Вычислял среднее значение delta2. Назовем его delta2Average.
5) Вычислял deviation = sqrt(delta2Average / size). size - количество усредняемых точек. В моем понимании это сигма.
6) Выкидывал все выборки, для которых delta > (deviation * 3).
7) Пункты 1-6 для координаты у.
8) Брал среднее арифметическое по х и у.

Расписал подробно потому что математик из меня тот еще. Мог грубо ошибиться.
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 19 2015, 18:42
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(minibrain @ Nov 20 2015, 00:23) *
Я делал так:
1) сортировал массив по координате х.
2) брал из него медианное значение.
3) для каждого элемента в массиве вычислял значение delta = abs(X - Xmedian); delta2 = delta ^2;
4) Вычислял среднее значение delta2. Назовем его delta2Average.
5) Вычислял deviation = sqrt(delta2Average / size). size - количество усредняемых точек. В моем понимании это сигма.
6) Выкидывал все выборки, для которых delta > (deviation * 3).
7) Пункты 1-6 для координаты у.
8) Брал среднее арифметическое по х и у.

Расписал подробно потому что математик из меня тот еще. Мог грубо ошибиться.


скорее всего с первоначальной оценкой начальной точки по медиане не очень хорошая идея, соответственно отбрасываются не те точки, что надо.
если дадите исходные данные с первой картинки, будет гораздо понятнее.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 05:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016