2012-05-16 6 views
0

У меня есть набор данных, организованный в структуру. У меня есть большое количество датчиков, и каждый из них имеет четыре показания a через d, поэтому структура D содержит D.sensorID, D.a, D.b, D.c и D.d. Я ищу выбросы в распределении показаний. Я нанесены данные и выбраны лимиты и написал сценарий, который идентифицирует SensorId с показаниями вне этих пределов и сохраняет их в массив:Идентификация данных

aMax = 5; 
    aHighIndices = find(D.a>aMax); 
    aMin = 0; 
    aLowIndices = find(D.a<aMin); 
    aHighLength = size(aHighIndices); 
    for i = 1:aHighLength 
    A_hi(i) = D.sensorID(aHighIndices(i)); 
    end 

Это повторяется: a_Hi, a_Low, b_Hi, и т.д .. ., а затем я залатать результаты вместе:

outliers = [A_hi; A_low; B_low; B_hi; C_low; C_hi; D_low; D_hi];

есть более краткий способ сделать это?

+0

Ваша методология выглядит отлично. Если вы ищете другие способы найти выбросы, то вот еще один способ: подумайте о 2D гауссово, сосредоточенном на средних показаниях для каждого датчика. Когда конкретное считывание датчика проходит два стандартных отклонения, возможно, вы можете считать это как выброс. Теперь вместо того, чтобы устанавливать низкий/низкий порог вокруг каждого датчика, вам просто нужно приспосабливать нормали к каждому датчику и определять один порог, то есть, сколько стандартных отклонений от средней точки должно быть до того, как оно будет рассмотрено вылет. – kitchenette

ответ

3

1. Вы итерация каждого массива (т.е. вектора) отсчеты два раза с find: один раз для нахождения высоких выбросов и один раза для нахождения низких выбросов. Вы можете сделать это в одной итерации просто:

a_outlier_indices = find(D.a < aMin | D.a > aMax); 

2. Другое дело: вообще говоря for в MATLAB довольно дорого, попробуйте использовать встроенные возможности синтаксиса MATLAB для получения тех же результатов , Более конкретно, MATLAB позволяет извлекать суб-вектор из другого вектора, используя вектор индексов:

a_outliers = D.sensorID(a_outlier_indices); 

Просто кормление D.a с вектором индексов дает искомый вектор недопустимым.

3. Также, совет для хорошей практики: рекомендуется хранить массивы a через d в массиве ячеек векторов вместо отдельных массивов, что-то вроде: D.readings = {a, b, c, d} и определения массива ячеек соответствующих порогов (thr в моем примере), так что вы можете сохранить код с помощью цикла:

thr = {[aMin, aMax]; [bMin, bMax]; [cMin, cMax]; [dMin, dMax]} 
outliers = cell(4, 1); 
for i = 1:4 
    outlier_indices = find(D.readings{i} < thr{i}(1) | D.readings{i} > thr{i}(2)); 
    outliers{i} = D.sensorID(outlier_indices); 
end 

Теперь вы будете иметь все, что в массиве ячеек outliers. Чтобы получить доступ к а выпадающим использовать outliers{1}, чтобы получить доступ к б выпадающим использовать outliers{2}, и так далее ...

Вы можете, конечно, патч все вместе (как в вопросе) в один вектор простой конкатенации внутри for петля:

outliers = [outliers, D.sensorID(outlier_indices)];

вместо outliers{i} = ... заявления.

P.S

Я предполагаю, что использование мин/макс пороговых значений, что вы хотите использовать при поиске выбросов. Существуют и другие методы поиска выбросов, но это даст разные результаты.

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