我需要一些有关如何改进聚类算法的指导。答案可能是微不足道的,或者是不可能的。我在Google上搜索了很多,但是我要么不理解我的问题和已知的聚类算法之间的类比,要么就不存在这种矛盾。我不是计算机科学家,而且我可能也会误解很多行话。
问题
为我提供了一组N
元素,我需要将这些元素分为K
组,其中K
未知。分组基于对函数measure(group)
的调用,该函数返回度量组中元素有多紧密的度量。 group
代表至少两个元素的集合。更为复杂的因素是,measure
仅包含两个元素时,group
的结果非常不确定,并且对该函数的调用非常昂贵。
我的解决方案
获取已分配元素A
的空列表。
由于measure
的结果对于两个元素而言都不精确,因此要开始“播种”组,我将第一个元素x0
附加到A
上,然后进行迭代所有其他元素,xi
。我用两点measure
的组合来称呼(x0, xi)
,直到得到measure
很小的东西,我对此充满信心。如果这永远不会发生,x0
是一个单元素组,我继续。如果我能采取适当的措施,则会将xi
添加到组和已分配元素A
的列表中。找到该种子后,我将重新遍历所有元素,不包括A
中已有的元素(我可能错过了组中的某些元素,因为measure
对于两个元素不确定)。对于每个新的候选元素x
,我调用measure
并收集到目前为止的group
,并附加x
。如果x
并没有“大量”增加measure
中的group
,则会将其添加到group
和A
中。我有一种方法可以精确地定义“很多”,但这是我所遇到的特定问题的详细信息。
当我完成对所有元素的迭代时,我从A
中尚未存在的第一个元素开始重新开始新的组操作,总是跳过A
中的元素,直到将所有元素分组为止。
这是怎么了?
对于我正在处理的特定问题,该解决方案非常强大。但是,在最坏的情况下(在2组的元素的所有组合中迭代),它是n^2
。在实践中,这从来没有发生过,我的n
很少超过几百,但是在某些病理情况下,情况更糟了。由于对measure
的调用是如此昂贵,因此以较少的迭代来解决问题将是非常有益的。而且,我猜想,n^2
解决方案从来都不是理想的……