2009-07-21 1 views
1

Рассмотрите вектор V пронизан шумными элементами. Какой бы самый быстрый (или любой) способ найти разумный максимальный элемент?Поиск разумного (бесшумного) элемента максимума в векторе

Для получения, например,

V = [1 2 3 4 100 1000] 
rmax = 4; 

Я имел в виду сортировки элементов и нахождение второго дифференциала {т.е. дифференциал (дифференциал (уникальный (V)))}.

EDIT: Извините за задержку.

Я не могу размещать никакие репрезентативные данные, так как содержит элементы 6.15e5. Но вот сюжет отсортированных элементов.

sorted http://i26.tinypic.com/10ykztv.jpg

Просто глядя на сюжет, кусочно-линейная функция может работать.

В любом случае, относительно моей предыдущей гипотезы об использовании дифференциалов, вот график diff (sort (V));

diff vs x http://i31.tinypic.com/wmflfb.jpg

Я надеюсь, что это яснее.

РЕДАКТИРОВАТЬ: Для того чтобы быть ясным, желаемым значением «максимум» было бы значение прямо перед шагом на графике отсортированных элементов.

+3

Может ли вы уточнить, что вы подразумеваете под разумным? Максимальный элемент для меня, кажется, 1000. Что с этим связано? Может быть, я просто не знаю, что вы пытаетесь сделать ... – bayer

+2

Вам определенно нужно определить, что вы имеете в виду, и какова ожидаемая структура шума. Кажется, что 100 и 1000 элементов в этом векторе предназначены для игнорирования, как кажущиеся выбросы. – 2009-07-21 23:21:02

+1

Есть ли шаблон для соответствующих данных? Например, сигнал может иметь синусоидальную волну, и на нем может быть +/- 10 отсчетов шума ... – Gabe

ответ

4

НОВЫЙ ОТВЕТ:

Основываясь на вашем участке отсортированных амплитуд, ваш diff(sort(V)) алгоритм, вероятно, хорошо работать. Вам просто нужно выбрать порог для того, что составляет «слишком большую» разницу между отсортированными значениями. Первая точка вашего вектора diff(sort(V)), превышающая этот порог, затем используется для получения порогового значения для V. Например:

diffThreshold = 2e5; 
sortedVector = sort(V); 
index = find(diff(sortedVector) > diffThreshold,1,'first'); 
signalThreshold = sortedVector(index); 

Другой вариант, если вы заинтересованы в поигрывая с ним, чтобы бина ваши данные с помощью HISTC. В итоге вы столкнетесь с группами сильно заполненных бункеров как на низких, так и на высоких амплитудах, с небольшими заселенными бункерами между ними. Тогда будет решаться вопрос о том, какие бункеры вы считаете частью группы с низкой амплитудой (например, первая группа бункеров, которые содержат по меньшей мере количество Х). Например:

binEdges = min(V):1e7:max(V); % Create vector of bin edges 
n = histc(V,binEdges);   % Bin amplitude data 
binThreshold = 100;   % Pick threshold for number of elements in bin 
index = find(n < binThreshold,1,'first'); % Find first bin whose count is low 
signalThreshold = binEdges(index); 

OLD ОТВЕТА (для потомков):

Нахождение "разумный максимальный элемент" полностью зависит от вашего определения разумного. Есть много способов определить точку как outlier, например, просто выбрать набор пороговых значений и игнорировать все, что вы определяете как «разумные». Предполагая, что ваши данные нормально-иш распределения, вы могли бы использовать простой пороговые данные подхода для удаления выбросов из вектора V с использованием функции MEAN и STD:

nDevs = 2; % The number of standard deviations to use as a threshold 
index = abs(V-mean(V)) <= nDevs*std(V); % Index of "reasonable" values 
maxValue = max(V(index));    % Maximum of "reasonable" values 
+0

Это верно, если у вас слишком много поврежденных элементов. В противном случае ваше среднее значение будет искажено, и даже безшумные элементы выйдут из строя 'nDevs * std (V)' – ThibThib

+0

@ThibThib: вы правы. Я просто привел пример для работы с данными, имеющими почти нормальное распределение. Трудно дать ничего, кроме общих примеров, поскольку автор не дает подробных сведений о типах сигналов, с которыми он работает. – gnovice

+2

Приношу извинения за неопределенный ОП. Я надеюсь, что обновленная версия более информативна. – Jacob

1

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

В этом случае, вы можете удалить шум, а затем найти Макса

max(v(find(v<=10 & v>=-10))) 
+0

На самом деле вам даже не нужен вызов FIND ... вы можете индексировать 'v' с помощью логического вектора:' max (v (abs (v) <= 10)) ' – gnovice

+0

Нет, я не знаю, где бесшумные элементы. – Jacob

3

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

Вам необходимо описать формально ожидаемую информацию в векторе и тип шума.

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

Чтобы упростить: не делайте никаких предположений о том, какие данные вызывают ошибку (в худшем случае: вы не можете исключить какие-либо из точек данных ошибок как смешные, но все они находятся на уровне или выше максимум среди измерений без ошибок). Тогда, если вероятность ошибки равна p, а ваш вектор имеет n элементов, то вероятность того, что k-й высший элемент в векторе меньше или равна истинному максимуму, определяется кумулятивным биномиальным распределением - http://en.wikipedia.org/wiki/Binomial_distribution

+0

Я не собирался сортировать разницу: я предложил найти разницу отсортированных значений, чтобы найти всплески. – Jacob

+0

Я сказал вид * THEN * разница, а не сортировка * THE * разница :) Мои причины против этого, что еще стоят. Смещение смежных различий между вещами, которые не были изначально смежными, вызывает сомнения. –

+1

Ваш примерный график очень четко показывает, что вы можете просто использовать статистику рангов (которые требуют сортировки или бинирования). Поскольку ваши плохие значения происходят гораздо меньше, чем в половине случаев, вы должны выбросить все, что выходит за рамки определенного отличия от медианы, то есть отбросить i, для которого abs (v [i] -v_median)> t. –

2

Если вы ожидаете, что числа поступают из нормального распределения, вы можете использовать значение 2xsd (стандартное отклонение) над средним значением, чтобы определить свой максимум.

+0

Это интересно, но все же не совсем правильно.Некоторая линейная комбинация средних и sd работает, но как это определить? – Jacob

Смежные вопросы