我正在尝试提高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
非常感谢。
有了足够的RAM来使用,您可以在此处使用几种方法。
方法一: 用bsxfun&permute-
bsxfun
permute
D = squeeze(sum(bsxfun(@minus,permute(x,[3 2 1]),x).^2,2))
方法2: 用pdist&squareform-
pdist
squareform
D = squareform(pdist(x).^2)
方法3 带matrix-multiplication based euclidean distance calculations-
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;
为了性能,我敢打赌方法三!