从 MATLAB 中的聚类算法中删除 for 循环
Remove for loop from clustering algorithm in MATLAB
我正在尝试提高 OPTICS 聚类算法的性能。我在开源中找到的实现对每个示例使用了一个 for 循环,并且可以 运行 数小时...
我相信当系统有足够的 RAM 时,使用 repmat() 函数可能有助于提高其性能。
非常欢迎您提出其他改进实施的方法。
代码如下:
x 是数据:[mxn] 数组,其中 m 是样本大小,n 是特征维数,大部分时间显着大于一。
[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;
对于性能,我的赌注是方法 #3!
我正在尝试提高 OPTICS 聚类算法的性能。我在开源中找到的实现对每个示例使用了一个 for 循环,并且可以 运行 数小时...
我相信当系统有足够的 RAM 时,使用 repmat() 函数可能有助于提高其性能。 非常欢迎您提出其他改进实施的方法。
代码如下:
x 是数据:[mxn] 数组,其中 m 是样本大小,n 是特征维数,大部分时间显着大于一。
[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;
对于性能,我的赌注是方法 #3!