Я пытаюсь удалить выбросы из серии тиковых данных, следуя Brownlees & Gallo 2006 (если вам это интересно).
Код работает нормально, но, учитывая, что я работаю с очень длинными векторами (самый большой из них имеет 20 м наблюдений, и после 20 часов он не был завершен), мне было интересно, как его ускорить.
Что я сделал до сих пор:
я изменил формат времени и даты на числовой двойной, и я увидел, что это экономит довольно много времени при обработке и МНОГО ПАМЯТИ.
Я выделил память для векторов:
[n] = size(price);
x = price;
score = nan(n,'double'); %using tic and toc I saw that nan requires less time than zeros
trimmed_mean = nan(n,'double');
sd = nan(n,'double');
out_mat = nan(n,'double');
Вот петля, которую я хотел бы удалить. Я читал, что векторизация значительно ускорит работу, особенно при использовании длинных векторов.
for i = k+1:n
trimmed_mean(i) = trimmean(x(i-k:i-1 & i+1:i+k),10,'round'); %trimmed mean computed on the 'k' closest observations to 'i' (i is excluded)
score(i) = x(i) - trimmed_mean(i);
sd(i) = std(x(i-k:i-1 & i+1:i+k)); %same as the mean
tmp = abs(score(i)) > (alpha .* sd(i) + gamma);
out_mat(i) = tmp*1;
end
Вот что я пытался сделать
trimmed_mean=trimmean(regroup_matrix,10,'round',2);
score=bsxfun(@minus,x,trimmed_mean);
sd=std(regroup_matrix,2);
temp = abs(score) > (alpha .* sd + gamma);
out_mat = temp*1;
Но учитывая, что я совершенно новичок в Matlab, я не знаю, как правильно построить матрицу соседних наблюдений. Я просто думаю, что это должно быть в форме: regroup_matrix= nan (n,2*k)
.
РЕДАКТИРОВАТЬ: Чтобы быть конкретным, то, что я пытаюсь сделать (и я не могу):
Учитывая вектор-столбец "x" (n, 1) для каждого наблюдения "i" в "x", я хочу возьмите "k" соседние наблюдения с "i" (от ik до i-1 и от i+1 до i+k) и поместите эти наблюдения в строки матрицы (n, 2*k).
РЕДАКТИРОВАТЬ 2: я внес несколько изменений в код и думаю, что приближаюсь к решению. Я разместил еще один вопрос, касающийся того, что, по моему мнению, сейчас является проблемой:
Matlab: заполнение строк матрицы с использованием скользящих интервалов из вектора-столбца без цикла for
То, что я пытаюсь сделать сейчас, это:
[n] = size(price,1);
x = price;
[j1]=find(x);
matrix_left=zeros(n, k,'double');
matrix_right=zeros(n, k,'double');
toc
matrix_left(j1(k+1:end),:)=x(j1-k:j1-1);
matrix_right(j1(1:end-k),:)=x(j1+1:j1+k);
matrix_group=[matrix_left matrix_right];
trimmed_mean=trimmean(matrix_group,10,'round',2);
score=bsxfun(@minus,x,trimmed_mean);
sd=std(matrix_group,2);
temp = abs(score) > (alpha .* sd + gamma);
outmat = temp*1;
У меня проблемы с созданием matrix_left и matrix_right. j1, который я использую для индексации, представляет собой вектор-столбец с индексами ценовых наблюдений. Выход просто
j1=[1:1:n]
цена представляет собой вектор-столбец двойного размера с размером (n, 1)
x
выглядит как вектор, ноx(i,tmp) = price(i-1,tmp)
может расширить его до двумерной матрицы. Это намеренно? - person aschepler   schedule 07.02.2014k
не инициализирован. - person Daniel   schedule 07.02.2014i-k:i-1 & i+1:i+k
будет возвращать двоичный вектор с истинами всякий раз, когда ниi-k:i-1
, ниi-k:i-1 & i+1:i+k
не равны нулю? этот синтаксис кажется немного странным. Вернемся к вашему вопросу: попробуйте создать вектор-строку из значенийx
, а затем создать матрицу сreshape(x,M,N)
. - person McMa   schedule 10.02.2014