基于MapReduce和Hadoop的迭代kmeans算法
我写了一个简单的k-means聚类代码,用于Hadoop(分成两个程序 - mapper和reducer)。这个代码在我本地的小数据集上运行得很好,数据是二维点。代码是用Python写的,我打算使用Streaming API。
每次运行mapper和reducer后,都会生成新的中心点。这些中心点会作为下一次迭代的输入。
根据建议,我使用了mrjob和job这个Python库,它适合处理多步骤的任务。
def steps(self):
return [self.mr(mapper=self.anything,
combiner=self.anything,
reducer=self.anything)]
这只是一个迭代过程,请告诉我有什么方法可以在生成新中心后将其反馈给mapper。我想说的是,正如你在最后一步(“reducer”)看到的,新的中心会被生成,现在是时候把它反馈给mapper(第一步),以便用新的中心计算新的距离,依此类推,直到达到满意的收敛状态。
(请不要告诉我关于Mahout、Spark或其他实现的事情,我对此已经了解。)
1 个回答
1
在运行K-Means算法时,为了停止执行,我们通常会设定迭代次数或者一个阈值距离。在这个过程中,我们可能想要写一个链式的映射和归约程序来处理迭代次数。具体来说,就是把每次计算出的聚类中心输出到一个临时文件中,然后把这个文件作为下一个映射程序的输入。这样做的次数要和你设定的阈值相等。