Mapper и редуктор для алгоритма k means в Hadoop в Java

Я пытаюсь реализовать K means на hadoop-1.0.1 на java язык. Теперь я расстроен. Хотя я получил github ссылка на полную реализацию k means но как новичок в Hadoop, Я хочу изучить его без копирования кода другого. У меня есть базовые знания map и reduce функции, доступные в в Hadoop. Может кто-нибудь дать мне идею реализовать k means mapper и reducer класса. Требуется ли итерация?

1 ответов


хорошо, я попробую рассказать вам, что я думал при реализации k-means в MapReduce. Эта реализация отличается от реализации Mahout, главным образом потому, что она должна показать, как алгоритм мог бы работа в распределенной настройке (а не для реального использования в производстве). Также я предполагаю, что вы действительно знаете, как работает k-means.

сказав, что мы должны разделить весь алгоритм на три основных этапа:

  1. уровень задание
  2. карта уровень
  3. уменьшить уровень

Уровень Работы

уровень задания довольно прост, это запись ввода (ключ = класс под названием ClusterCenter и Value = класс под названием VectorWritable), обработка итерации с помощью задания Hadoop и чтение вывода всего задания.

VectorWritable является сериализуемой реализацией вектора, в этом случае из моей собственной математической библиотеки, но на самом деле не что иное, как простой двойной матрица.

на ClusterCenter в основном VectorWritable, но с удобными функциями, которые обычно нужны центру (например, усреднение).

в K-означает, у вас есть некоторые seedset из K-векторов, которые являются начальной центрах и некоторых входных векторов, что вы хотите кластера. Это точно то же самое в MapReduce, но я пишу их в два разных файла. Первый файл содержит только векторы и некоторый фиктивный ключевой центр, а другой файл содержит реальные начальные центры (а именно:cen.seq).

после всего, что пишется на диск, вы можете начать свою первую работу. Это, конечно, первый запуск Mapper это следующая тема.

Уровень Карты

в MapReduce всегда умно знать, что входит и что выходит (с точки зрения объектов). Поэтому с уровня работы мы знаем, что у нас есть ClusterCenter и VectorWritable как вход, тогда как ClusterCenter в настоящее время просто манекен. Конечно, мы хотим иметь то же самое, что и вывод, потому что этап карты-это известный шаг назначения от обычных k-средних.

Вы читаете файл реальных центров, созданный на уровне задания, в память для сравнения входных векторов и центров. Поэтому у вас есть эта метрика расстояния, определенная, в картографе она жестко закодирована в ManhattanDistance. Чтобы быть немного более конкретным, вы получаете часть своего ввода на этапе карты, а затем вы получаете итерацию по каждой входной "паре значений ключа" (это пара или кортеж состоящий из ключа и значения) по сравнению с каждым из центров. Здесь вы отслеживаете, какой центр является ближайшим, а затем назначаете его центру, написав ближайший ClusterCenter объект вместе с самим вектором ввода на диск.

ваш вывод: n-векторы вместе с их назначенным центром (в качестве ключа). Hadoop теперь сортирует и группирует по вашему ключу, поэтому вы получаете каждый назначенный вектор для одного центра в задаче сокращения.

Снижение Уровень

как сказано выше, у вас будет ClusterCenter и назначен VectorWritableв стадии уменьшения. Это обычный шаг обновления в обычном k-средних. Таким образом, вы просто повторяете все векторы, суммируя их и усредняя их.

теперь у вас есть новое "среднее", которое вы можете сравнить со средним, которое было назначено раньше. Здесь вы можете измерить разницу между двумя центрами, которая говорит нам о том, сколько центр переехал. В идеале - нет. переехал и converged.

счетчик в Hadoop используется для отслеживания этой конвергенции, имя немного вводит в заблуждение, потому что на самом деле отслеживает, сколько центров имеют не сошлись к последней точке, но я надеюсь, что вы сможете жить с этим.

в основном вы пишете теперь новый центр и все векторы на диск снова для следующей итерации. Кроме того, на шаге очистки вы записываете все новые собранные центры в путь, используемый на шаге карты, поэтому новая итерация имеет новые векторы.


теперь вернемся к этапу работы, работа MapReduce должна быть выполнена сейчас. Теперь мы проверяем счетчик этой работы, чтобы узнать, сколько центров еще не сошлись. Этот счетчик используется в цикле while, чтобы определить, может ли весь алгоритм завершиться или нет. Если нет, вернитесь в Карта Уровня абзац снова, но используйте выход из предыдущего задания в качестве входных данных.

на самом деле это было все Вуду.

по понятным причинам это не должно использоваться в производстве, потому что ее исполнение ужасно. Лучше использовать более настроенную версию Mahout. Но для образовательных целей этот алгоритм прекрасен;)

если у вас есть еще вопросы, не стесняйтесь писать мне письмо или комментарий.