Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Фильтрация массива чисел от шума


Страницы:   1 2

abun ©   (2009-08-10 16:10:00) 

Есть упорядоченный массив чисел типа real. Нужно отфильтровать явно "левые" числа (т.е. видно, что они совсем другой величины). Длина массива не более 1000.
Пример массива:
90,100,2100,2120,2130,2135,2140,2160,2200,2300,2500,3500,4000,100000.
Результатом работы фильтра должно исключение из списка чисел 90, 100 и 100000. "Неправильных" чисел не может быть в массиве много. Точное количество их не указать. Но если очень принципиально, то пусть будет ограничение: не более 4-х.

Казалось бы, задача элементарная. Опробовал: входит ли в интервал
[матожидание*0,8..матожидание*1,2] (0,8 и 1,2 - т.е. -20 и +20% иначе говоря) - не помогает, т.к. матожидание серьезно искажается этими "неправильными" числами и выпадают правильные.
Пробовал и через среднее по разнице между соседними элементами.
Тогда 2 и более соседних "неправильных" чисел прикрывают друг дружку.

Такое ощущение, что задача вообще нерешаема строгим алгоритмом.


abun   (2009-08-10 20:52:00) [21]

Надо было корень здесь:
S - СКО = sqrt(sum(X[i] - Xav)^2/(N-1))


abun   (2009-08-10 20:13:00) [22]

что-то не хочет со стьюдентом совсем фильтровать... :(
может, че не так я понял


KilkennyCat   (2009-08-10 20:00:00) [23]

не выйдет. Пример 98-года, когда курс изменился в разы.


abun   (2009-08-10 19:51:00) [24]

Да тут не сигнал - тут просто список курсов валют. И эти курсы иногда с ошибками - хотелось бы их фильтровать в автоматическом режиме.


Jeer   (2009-08-10 18:13:00) [25]

Многое зависит от распределения чисел с которыми Вы работаете.
Если все это дело укладывается в нормальное распределение, то применимы хорошо себя зарекомендовавшие традиционные методы отбраковки ( Стьюдент и пр ).
Более робастная (устойчивая) оценка аномалий может быть сделана через медианную фильтрацию ( см. [[7] ), но работать надо не с самими числами, а, например, с той же относительной оценкой, что и в [8]

Ну и еще не мешало бы модель сигнала знать :)


abun   (2009-08-10 17:57:00) [26]


> Если совсем просто, тоt1 = abs( X[i] - Xav)/S <= t2X[i]
>  - проверяемый элементXav - среднее значениеS - СКО = sum(X[i]
> - Xav)^2/(N-1)t2 - квантиль распределения статистики t при
> уровне значимости pОбычно используют уровень значимости
> p=0.05 ( 95% доверительная вероятность )При N=25, t2 = 2.
> 72 для p= 0.05Если t1 <= t2, то элемент не отсеивают.После
> каждого отсева перевычисляют Xav и S

:) не поверите, но я уже экспериментальным путем начал выходить на что-то подобное!


Jeer   (2009-08-10 17:38:00) [27]

Если совсем просто, то

t1 = abs( X[i] - Xav)/S <= t2

X[i]  - проверяемый элемент
Xav - среднее значение
S - СКО = sum(X[i] - Xav)^2/(N-1)
t2 - квантиль распределения статистики t при уровне значимости p
Обычно используют уровень значимости p=0.05 ( 95% доверительная вероятность )
При N=25, t2 = 2.72 для p= 0.05
Если t1 <= t2, то элемент не отсеивают.
После каждого отсева перевычисляют Xav и S


Smile   (2009-08-10 17:36:00) [28]

Отранжируй во временную переменную и отруби (по какой-нибудь дельте) "лишние" концы.
Затем "выкарябай" эти концы из своего упорядоченного массива
:)


Jeer   (2009-08-10 17:16:00) [29]

Почитать соответствующие книжки по мат.статистике и обработке данных.

Для отсева грубых погрешностей при указанном числе измерений можно рекомендовать использование критерия Стьюдента.

СКО, сплайны, фильтры - это из другой оперы.


abun   (2009-08-10 17:15:00) [30]


> Среднеквадратичное отклонение попробуйте.

Я ж говорю, пробовал СКО. Ерунда получается - т.к. удаляется только 1 число за проход. Ну разве что попробую зациклить процесс фильтрации до тех пор, пока число удаленных не будет 0.


KilkennyCat   (2009-08-10 17:01:00) [31]


> sniknik © (10.08.09 16:51) [3]

1,2,3,4,5,6,7,8,9,10,11,12...


sniknik   (2009-08-10 16:51:00) [32]

считаешь количество "длинн" чисел, т.е. Length(IntToStr(n[i])) каких больше те потом и оставляешь...
для "совсем другой величины"/т.е. порядка сойдет.


Kolan   (2009-08-10 16:33:00) [33]

Еще есть фильтрация. Есть прямо готовые фильтры, оконные функции и т. п.


Kolan   (2009-08-10 16:32:00) [34]

Среднеквадратичное отклонение попробуйте.

Вообще мат теории на это счет полно, сплайны там всякие и пр.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо