我正在开展K-medoids algorithm实施工作。它是一种聚类算法,其中一个步骤包括在群集中找到最具代表性的点。
所以,这就是事情
有两种方法,一种是计算距离矩阵,它将在数据集中的所有点之间保存值,另一种是计算聚类期间的距离,这样可以重复计算某些点之间的距离。
一方面,要构建距离矩阵,您必须计算整个数据集中所有点之间的距离,并且永远不会使用某些计算值。
另一方面,如果你没有建立距离矩阵,你将在一定数量的迭代中重复一些计算。
哪种方法更好?
我也正在考虑MapReduce的实现,所以也欢迎这个角度的意见。
由于
答案 0 :(得分:3)
第三种方法可以是两者的组合,并且懒惰地评估距离矩阵。使用默认值(不切实际的值,如负值)初始化矩阵,当需要计算两点之间的距离时,如果值已存在于矩阵中 - 只需从中取出即可。 否则,计算它并将其存储在矩阵中。
这种方法交换计算(并且在进行最低数量的可能对计算时是最佳的),代码中的更多分支以及更多指令。但是,由于分支预测器,我认为这种开销不会那么显着。 我预测,当计算相对广泛时,它会有更好的表现。
它的另一个优化可能是当已经计算的数量超过某个阈值时动态切换普通矩阵实现(并计算矩阵的剩余部分)。通过在满足特定阈值时切换接口的实现,可以在OOP语言中很好地实现这一点。
实际上更好的实现将在很大程度上依赖于距离函数的成本以及您正在聚类的数据,因为有些人需要比其他数据集更频繁地计算相同的点。
我建议做一个基准测试,并使用statistical tools来评估哪种方法实际上更好。