Нахождение разумного (бесшумного) максимального элемента в векторе - PullRequest
1 голос
/ 22 июля 2009

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

Например,

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

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

РЕДАКТИРОВАТЬ: Извините за задержку.

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

sorted

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

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

diff vs x

Надеюсь, теперь стало понятнее.

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

Ответы [ 5 ]

4 голосов
/ 22 июля 2009

НОВЫЙ ОТВЕТ:

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

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

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

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);

СТАРЫЙ ОТВЕТ (для потомков):

Нахождение «разумного максимального элемента» полностью зависит от вашего определения разумного . Существует множество способов определить точку как выброс , например, просто выбрать набор порогов и игнорировать все, что находится за пределами того, что вы определяете как «разумный». Предполагая, что ваши данные имеют нормальное распределение, вы можете использовать простой подход, основанный на данных, для удаления выбросов из вектора 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
3 голосов
/ 22 июля 2009

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

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

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

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

3 голосов
/ 22 июля 2009

Сначала выберите ваш любимый метод определения выбросов ...

2 голосов
/ 22 июля 2009

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

1 голос
/ 22 июля 2009

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

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

max( v( find(v<=10 & v>=-10) ) )
...