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

#python #hadoop #mrjob

#python #hadoop #mrjob

Вопрос:

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

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

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

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

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

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

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

Комментарии:

1. Существует отличный пошаговый (с кодом) для выполнения именно этого, который я видел на прошлой неделе: classes.cs.uchicago.edu/archive/2013/spring/12300-1/labs/lab3

Ответ №1:

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