我有一个矩阵,其第一列是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!)
是否存在自动计算离群值而无需计算距离矩阵的方法,函数或代码?
答案 0 :(得分:1)
您的代码可以提高效率。首先,请注意您的x
只是selected'
。其次, all 您的代码可以替换为:
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