从MATLAB中的聚类算法中删除for循环
问题内容:
我正在尝试提高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来使用,您可以在此处使用几种方法。
D = squeeze(sum(bsxfun(@minus,permute(x,[3 2 1]),x).^2,2))
方法2:
用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;
为了性能,我敢打赌方法三!