Answers:
一些聚类算法可以使用空间索引结构。例如,这允许DBSCAN和OPTICS在时间内运行(只要索引允许查询)。
显然,以这种复杂性运行的算法不会建立距离矩阵。
对于某些算法,例如具有单链接和完全链接的分层聚类,有可用的优化算法(SLINK,CLINK)。只是大多数人会使用他们能得到的任何东西以及易于实现的东西。而且,通过在距离矩阵上进行次迭代(导致算法...),可以容易地天真地实现分层聚类。
我不知道比较聚类算法的完整列表。毕竟,可能有100多种聚类算法。例如,至少有十二种k均值变体。此外,还存在运行时复杂性和内存复杂性。有平均情况和最坏情况。存在巨大的实现差异(例如,上面提到的单个链接;以及不使用索引的DBSCAN实现,因此位于,尽管它们不需要存储完整的距离矩阵,那么他们仍然需要计算所有成对的距离)。另外还有大量的参数。对于k均值,至关重要。对于几乎所有算法,距离函数都有很大的不同(许多实现只允许欧几里德距离...)。一旦获得了昂贵的距离函数(除了像欧几里得这样的琐碎的东西之外),距离计算的数量可能很快就会成为主要部分。因此,您需要区分操作总数和所需距离计算的数目。因此,当距离函数确实很昂贵(例如,距离时,采用运算但只有距离计算的算法可能会轻易胜过两者均为的算法函数本身是)。
好问题。一个稻草人方法,例如说3个最近的邻居是对每个数据点的Nsample个邻居进行采样,保持最近的3个。虽然琐碎,将其运行几个Nsample值将使您对信号/噪声比,近/背景噪声有所了解,轻松为您的数据作图。然后,另一个技巧是检查邻居的邻居,以查看是否有任何邻居比直接邻居更近。同样,如果输入数据已经很好地混洗,请按块进行采样,否则缓存将崩溃。
(添加):请参见
R中的fastcluster,我相信SciPy v0.11。
有关文本,请参见
google-all-pairs-similarity-search。
重复一遍,“选择合适的差异度量比使用聚类算法对成功获得聚类而言更为重要” — 选择-聚类方法。