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.
сказав, что мы должны разделить весь алгоритм на три основных этапа:
- уровень задание
- карта уровень
- уменьшить уровень
Уровень Работы
уровень задания довольно прост, это запись ввода (ключ = класс под названием 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. Но для образовательных целей этот алгоритм прекрасен;)
если у вас есть еще вопросы, не стесняйтесь писать мне письмо или комментарий.