如何删除异常值?

时间:2013-12-01 15:45:17

标签: matlab matrix distance outliers

我有一个矩阵,其第一列是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 个答案:

答案 0 :(得分:1)

您的代码可以提高效率。首先,请注意您的x只是selected'。其次, all 您的代码可以替换为:

distanceMatrix = squareform(pdist(selected));

(请参阅pdistsquareform的文档)。除了使代码更简单之外,这可能有助于减少内存使用。

如果内存仍然存在问题,您可能需要处理数据块,计算从当前块中的点到所有点的距离。您可以使用pdist2pdist的通用版本,它允许两个不同的输入,不需要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