节省空间的集群


9

我见过的大多数聚类算法都始于在所有点之间创建每个到每个的距离,这在更大的数据集上变得很成问题。有没有这样做的人吗?还是采用某种部分/近似/交错方式?

哪种聚类算法/实现占用的空间少于O(n ^ 2)?

是否在某处列出了算法及其对时间和空间的要求?


2
移动窗口类型集群(例如SaTScan,satscan.org)可能会满足您的要求。该特定程序用于空间/时间数据,因此并不是真正针对更高的维度,但是也许会为您提供一些思路或起点。
Andy W

Answers:


5

K-Means和Mean-Shift使用原始样本描述符(无需预先计算亲和力矩阵)。

否则,对于频谱聚类或功率迭代聚类,您可以使用k最近邻居亲和力矩阵的稀疏矩阵表示(例如,压缩稀疏行)(对于某些距离或亲和力度量)。如果k小(假设5或10)。您将获得非常节省空间的表示形式(2 * n_samples * k * 8个字节,用于双精度浮点值)。


2

一些聚类算法可以使用空间索引结构。例如,这允许DBSCAN和OPTICS在时间内运行(只要索引允许查询)。O(nlogn)O(logn)

显然,以这种复杂性运行的算法不会建立距离矩阵。O(n2)

对于某些算法,例如具有单链接和完全链接的分层聚类,有可用的优化算法(SLINK,CLINK)。只是大多数人会使用他们能得到的任何东西以及易于实现的东西。而且,通过在距离矩阵上进行次迭代(导致算法...),可以容易地天真地实现分层聚类。ññ2Øñ3

我不知道比较聚类算法的完整列表。毕竟,可能有100多种聚类算法。例如,至少有十二种k均值变体。此外,还存在运行时复杂性和内存复杂性。有平均情况和最坏情况。存在巨大的实现差异(例如,上面提到的单个链接;以及不使用索引的DBSCAN实现,因此位于,尽管它们不需要存储完整的距离矩阵,那么他们仍然需要计算所有成对的距离)。另外还有大量的参数。对于k均值,Øñ2ñ×ñķ至关重要。对于几乎所有算法,距离函数都有很大的不同(许多实现只允许欧几里德距离...)。一旦获得了昂贵的距离函数(除了像欧几里得这样的琐碎的东西之外),距离计算的数量可能很快就会成为主要部分。因此,您需要区分操作总数和所需距离计算的数目。因此,当距离函数确实很昂贵(例如,距离时,采用运算但只有距离计算的算法可能会轻易胜过两者均为的算法函数本身是)。Øñ2ØñØñ日志ñØñ


很好的答案。
MonsterMMORPG '16

1

好问题。一个稻草人方法,例如说3个最近的邻居是对每个数据点的Nsample个邻居进行采样,保持最近的3个。虽然琐碎,将其运行几个Nsample值将使您对信号/噪声比,近/背景噪声有所了解,轻松为您的数据作图。然后,另一个技巧是检查邻居的邻居,以查看是否有任何邻居比直接邻居更近。同样,如果输入数据已经很好地混洗,请按块进行采样,否则缓存将崩溃。

(添加):请参见 R中的fastcluster,我相信SciPy v0.11。
有关文本,请参见 google-all-pairs-similarity-search

重复一遍,“选择合适的差异度量比使用聚类算法对成功获得聚类而言更为重要” — 选择-聚类方法

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.