【发布时间】:2015-09-25 15:30:39
【问题描述】:
我正在尝试提高 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
非常感谢。
【问题讨论】:
-
for 循环可能不是问题所在。您是否尝试过探查器来查看瓶颈在哪里?我建议使用小版本的 x 并将行中的每个函数分开。然后分析器会告诉你哪个部分花费的时间最多。
-
另外,您正在创建一行全零,然后自平方,然后求和。使用 2 个循环并避免 repmat 有利于对非零行进行操作可能会更快。你也预分配 D 数组吗?
-
为了获得性能,你真的很想使用索引。尝试 ELKI 版本,启用 k-d-tree 或类似索引,然后使用足够大的 epsilon 运行 OPTICS。您会对性能差异感到惊讶!我只有 Octave 而不是 Matlab,但 ELKI 的速度要快 100 倍到 1000 倍。
-
this posted solution是否有助于减少运行时间? -
请看下面我的回复
标签: algorithm performance matlab cluster-analysis vectorization