Как убрать выбросы?
У меня есть матрица, первый столбец которой X, второй Y и третий Z (облако точек с Земли). Между ними находятся выбросы, то есть точки, которые находятся очень вниз или очень снаружи (из-за систематических ошибок). Я создаю матрицу расстояний и вычисляю расстояние каждой точки до всех остальных точек, используя следующий код:
xl = selected(:,1);
yl = selected(:,2);
zl = selected(:,3);
distanceMatrix = zeros(size(selected,1));
x = [xl(:)'; yl(:)'; zl(:)'];
IP = x' * x;
distanceMatrix = sqrt(bsxfun(@plus, diag(IP), diag(IP)') - 2 * IP);
selectedl
моя матрица И вычислите соседей каждой точки и скажите: точки, у которых есть только 1 или 2 соседа, являются выбросами. Но: из-за того, что моя матрица слишком большая (учитывая размер матрицы), мой ноутбук не может обрабатывать (недостаточно памяти: 4G!)
Есть ли метод, функция или код, которые автоматически вычисляют выбросы без матрицы вычисления расстояния?
1 ответ
Ваш код может быть сделан более эффективным. Во-первых, обратите внимание, что ваш x
это просто selected'
, Во-вторых, весь ваш код может быть заменен следующим:
distanceMatrix = squareform(pdist(selected));
(см. документацию pdist
а также squareform
). Помимо упрощения кода, это может помочь уменьшить использование памяти.
Если память все еще остается проблемой, вам, возможно, придется работать порциями, вычисляя расстояние от точек текущего фрагмента до всех точек. Ты можешь использовать pdist2
(обобщенная версия pdist
что позволяет два разных входа и не требует squareform
):
chunkSize = 100; %// use largest value your memory permits; here it is
%// assumed to divide size(selected,1)
for ii = chunkSize:chunkSize:size(selected,1)
ind = ii + (-chunkSize+1:0); %// indices of points in current chunk
distanceMatrix = pdist2(selected,selected(ind,:)); %// distance from points
%// in current chunk to all points
%// Decide which points of the current chunk are outliers, based on
%// computed distanceMatrix
end