Я пообещал себе, что буду вести блог о своем путешествии с машинным обучением. Машинное обучение (отсюда и квадрат). Год спустя я пишу это предложение. Так что без лишних слов приступим!

Главной целью является реализация алгоритма, который работает как можно быстрее, используя все ресурсы, доступные в современном компьютере. После того, как мы реализовали алгоритм, мы визуализируем результаты в браузере. Я выбираю браузер за его привычность и повсеместность. Однако я также считаю, что простое представление данных в браузере прекрасно. Если вы можете сделать игру в браузере, вы можете отображать некоторые данные.

Платформа

Будем строить на языке Scala. Если вы не знакомы со Scala, я дам вам небольшое введение. Scala на языке, созданном Мартином Орденски, немецким профессором компьютерных наук (среди прочего) в Федеральной политехнической школе Лозанны в Германии (я не могу тоже скажи). Он позволяет создавать программы как в объектно-ориентированном стиле, так и в стиле функционального программирования (рекурсивные методы или функции). На уроке я буду строить это в стиле функционального программирования. Состояние — враг в программировании, и среди многих причин было бы интересно использовать функциональный стиль программирования. Давайте посмотрим, нравится ли вам это!

Давайте начнем…

Ах да, чуть не забыл! Что такое иерархический алгоритм кластеризации? Итак, представьте, что у вас есть 5 разных предметов в пространстве, и вы хотите определить, насколько они близки друг к другу по одному.

Если вы начнете с этих объектов в другом положении,

мы просто ищем те, которые находятся ближе всего друг к другу изначально, относительно остальной части объекта.

Затем мы рассматриваем объект как один кластер и ищем объект, близкий к этому новому кластеру. Объединенный кластер обведен серым и объединяется в кластер, обведенный красным.

Мы повторяем процесс снова и снова, пока не получим один кластер.

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

Давайте уже начнем!!

Хорошо хорошо! Итак, давайте подумаем, что нам нужно, чтобы сделать все это возможным на высоком уровне абстракции. Нам надо

  1. Получение данных из файла (конечная точка сервера тоже подойдет, но в этом примере лучше всего подходит файл).
  2. Структурируйте его так, чтобы он мог осмысленно читаться алгоритмами.
  3. Создайте алгоритм с учетом параллелизма.

Для приема данных создадим простой класс под названием DataImporter.scala. Когда мы импортируем данные, мы сохраняем результат в объекте, который действует как таблица в памяти для наших данных.

Именно в этом «контейнере» мы храним то, что импортируем из нашей таблицы.

importFile — это функция, которая импортирует нужный нам файл и проверяет его существование.

В строке :9: мы получаем все строки файла данных и проверяем, что длина каждой строки равна длине заголовка, чтобы убедиться, что данные отсутствуют. Затем мы проверяем каждую ячейку в строке:с 14 по 20:возвращая Option[Double] в случае обнаружения недопустимой ячейки. Теперь все, что нам нужно сделать, это проверить, что наш Vector[Option[Double]]всегда что-то содержит.

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

Затем мы делаем что-то немного сумасшедшее. Мы хотим сохранить наши результаты, которые были как успешными, так и неудачными. Мы можем использовать такого рода информацию для аналитики и тому подобного. foldLeft создает 2-кортеж из Vector[Vector[Option[Double]]. Эти вектора векторов в кортеже хранят множество успехов и множество неудач. В этом случае мы используем эту информацию, чтобы установить определенный процент чистых данных, равный 10 % по умолчанию. Когда мы вычисляем, :25 to 28:обновляет ошибки, а :17 to 20: обновляет успех. Мы используем значения для проверки частоты отказов в диапазоне от :40 до 45: и проходим проверку на основе меньшего процента.

Есть ли у вас намерение добраться до алгоритма…

Да, дождитесь следующей части под названием Машинное обучение²: иерархическая кластеризация, часть 2. :-D Это будет все о мельчайших деталях алгоритмов кластеризации. Поверьте мне, вам нужно было немного вступления. Ты оценишь это, когда станешь старше.

Эта серия будет состоять из5частей.

Дата последнего редактирования: 20 января 2017 года.