Итеративные kmeans на основе mapreduce и hadoop

Я написал простой код кластеризации k-средних для Hadoop (две отдельные программы — картограф и редьюсер). Код работает с небольшим набором данных из 2d точек в моем локальном ящике. Он написан на Python, и я планирую использовать Streaming API.

После каждого запуска картографа и редуктора генерируются новые центры. Эти центры являются входными данными для следующей итерации.

Основываясь на предложениях, я использовал mrjob, job python, который подходит для нескольких шагов,

def steps(self):    
 return [self.mr(mapper=self.anything,

                            combiner=self.anything,
                            reducer=self.anything)]

Это всего лишь одна итерация, и, пожалуйста, скажите мне, как можно отправить сообщение в картограф после создания новых центров. я имел в виду, что, как вы видите, на последнем шаге («редуктор») будут сгенерированы новые центры, и теперь пришло время снова передать их обратно в картограф (первый шаг), чтобы рассчитать новые расстояния с новыми центрами и так далее, пока довольные сходятся.

(пожалуйста, не говорите мне о Mahout, spark или любой другой реализации, я знаю о них.)


person Amin Mohebi    schedule 14.06.2014    source источник
comment
Существует отличное пошаговое руководство (с кодом) для того, чтобы сделать именно это, которое я видел на прошлой неделе: classes.cs.uchicago.edu/archive/2013/spring/12300-1/labs/lab3   -  person David Manheim    schedule 25.06.2014


Ответы (1)


При запуске K-Means для остановки выполнения мы обычно определяем количество итераций или пороговое расстояние. В этом случае мы можем захотеть написать уменьшение карты цепочки для количества итераций. Запишите вывод центроидов кластера во временный файл и передайте его следующему преобразователю. Сделайте это раз, равный вашим порогам.

person Tanveer    schedule 16.06.2014