2009-11-13 7 views
4

У меня есть файл m.txt данных, который выглядит примерно так (с намного большим количеством очков):Как эффективно найти точки корреляции и сброса вне диапазона 3-сигма в MATLAB?

286.842995 
3.444398 
3.707202 
338.227797 
3.597597 
283.740414 
3.514729 
3.512116 
3.744235 
3.365461 
3.384880 

Некоторые из значений (например, 338.227797) являются очень разные из значений я вообще ожидать (меньшие числа).

  • Итак, я имею в виду, что удалю все точки, которые лежат за пределами 3-sigma range. Как я могу это сделать в MATLAB?

  • Кроме того, большая проблема заключается в том, что этот файл имеет связанный с ним отдельный файл t.txt, который хранит соответствующие значения времени для этих чисел. Таким образом, мне придется удалить соответствующие значения времени из файла t.txt.

Я все еще учусь MATLAB, и я знаю, что будет какая-то хороший способ сделать это (лучше, чем хранить индексы элементов, которые были удалены из m.txt и последующего удаления этих элементов из файла t.txt)

+0

Извинения выглядят так, как будто они могут быть отформатированы с десятичной точкой в ​​неправильном месте. Если это так, вы можете принять решения ниже и заменить шаг «стереть» на «m (idx) = m (idx)/100;' – mtrw

+0

», это действительно замечательное наблюдение! Обычно очистка данных является одним из наиболее важных и трудных шагов в области интеллектуального анализа данных. – Amro

+0

@mtrw Нет, они не являются десятичными запятыми. это похоже на то, хотя! – Lazer

ответ

7

@Amro близок, но FIND не нужен (найдите логический подтип), и вам нужно включить среднее значение для истинного диапазона +/- 3 сигма. Я бы поехала со следующим:

%# load files 
m = load('m.txt'); 
t = load('t.txt'); 

%# find values within range 
z = 3; 
meanM = mean(m); 
sigmaM = std(m); 
I = abs(m - meanM) <= z * sigmaM; 

%# keep values within range 
m = m(I); 
t = t(I); 
+3

Возможно, более естественно обратить вспять неравенство в I и сохранить нужные значения, т. е. I = abs (m - meanM)

+0

@Nzbuu: конечно, спасибо, что поймали его! – Amro

+0

@Richie. Правда. Я изменю его. – Nzbuu

4
%# load files 
m = load('m.txt'); 
t = load('t.txt'); 

%# find outliers indices 
z = 3; 
idx = find(abs(m-mean(m)) > z*std(m)); 

%# remove them from both data and time values 
m(idx) = []; 
t(idx) = []; 
+0

нет необходимости в сложных методах, иногда простые решения являются лучшими! – Amro

+0

Кроме того, вы можете найти ответ на аналогичный вопрос полезным: http://stackoverflow.com/questions/1636683/find-only-relevant-points-in-matlab/1640298#1640298 – Amro