我正在尝试提高OPTICS聚类算法的性能。我在开源中找到的实现为每个示例使用for循环,并且可以运行数小时…
我相信当系统有足够的RAM时,使用一些repmat()函数可能有助于提高其性能。我们非常欢迎你提出其他改进执行的方法。
代码如下:
x为数据:一个[mxn]数组,其中m为样本量,n为特征维数,大多数情况下显著大于1。
[m,n] = size(x);
for i = 1:m
D(i,:) = sum(((repmat(x(i,:),m,1)-x).^2),2).';
end
许多谢谢。如果有足够的内存,您可以在这里使用几种方法。
方法#1: With bsxfun
&permute
——
D = squeeze(sum(bsxfun(@minus,permute(x,[3 2 1]),x).^2,2))
方法#2: With pdist
&squareform
——
D = squareform(pdist(x).^2)
方法#3与matrix-multiplication based euclidean distance calculations
-
xt = x.'; %//'
[m,n] = size(x);
D = [x.^2 ones(size(x)) -2*x ]*[ones(size(xt)) ; xt.^2 ; xt];
D(1:m+1:end) = 0;
对于性能,我打赌是方法#3!