Начало работы с кластеризацией k-средних в Python |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-05-11 12:24 Представьте, что вы опытный маркетолог, организующий новую кампанию для продукта и хотите найти подходящие сегменты для таргетинга, или вы юрист, заинтересованный в группировке различных документов в зависимости от их содержания, или вы анализируете транзакции по кредитным картам, чтобы выявить схожие закономерности. Во всех этих и многих других случаях наука о данных может использоваться для кластеризации ваших данных. Кластерный анализ — важная область обучения без учителя, которая помогает нам группировать данные. В прошлом мы обсуждали в этом блоге разницу между обучением с учителем и без учителя. Напоминаем, что мы используем обучение без учителя, когда помеченные данные недоступны для наших целей, но мы хотим изучить общие особенности данных. В приведенных выше примерах мы, как маркетологи, можем обнаружить общие демографические характеристики нашей целевой аудитории, или как юрист, мы устанавливаем различные общие темы в рассматриваемых документах, или, как аналитик по мошенничеству, мы устанавливаем общие транзакции, которые могут выделить отклонения в чьем-то аккаунте. . Во всех этих случаях кластеризация помогает найти эти общие следы, и существует множество алгоритмов кластеризации. В предыдущем посте мы говорили о кластеризации на основе плотности и обсуждали ее использование для обнаружения аномалий, аналогично примеру использования транзакций по кредитным картам, описанному выше. В этом посте мы утверждали, что другие алгоритмы могут быть легче понять и реализовать, например, k-средние, и цель этого поста — сделать именно это. Сначала мы установим понятие кластера и определим важную часть в реализации k-средних: центроиды. Мы увидим, как k-means подходит к проблеме сходства и как группы обновляются на каждой итерации, пока не будет выполнено условие остановки. Мы проиллюстрируем это реализацией Python и закончим рассмотрением того, как использовать этот алгоритм через библиотеку Scikit-learn . Вы можете использовать код из этого поста на своем компьютере, если у вас установлен Python 3.x. Альтернативно вы можете просто подписаться на бесплатный пробный доступ к платформе Domino MLOps и напрямую получить доступ к коду, используемому в этой статье (используйте кнопку «Доступ к проекту» в конце статьи). Давайте начнем. К-средство – что это значит? Мы упомянули, что заинтересованы в обнаружении общих черт между нашими наблюдениями за данными. Один из способов определить эту общность или сходство — измерить расстояние между точками данных. Чем короче расстояние, тем более схожи наблюдения. Существуют разные способы измерения этого расстояния, и один из них, который очень знаком многим людям, — это евклидово расстояние. Это верно! Тому же, чему нас учат, изучая теорему Пифагора. Давайте посмотрим и рассмотрим два наблюдения над двумя атрибутами (a) и (b). Точка (p_1) имеет координаты ((a_1,b_1 )) и точка (p_2=(a_2,b_2 )). Расстояние (overline{p_1 p_2 }) определяется по формуле: $$overline{p_1 p_2 }=sqrt{(a_2-a_1 )^2+(b_2-b_1 )^2 }$$ Выражение выше можно расширить до более чем двух атрибутов, и расстояние можно измерить между любыми двумя точками. Для набора данных с наблюдениями (n) мы предполагаем, что существуют группы или кластеры (k), и наша цель — определить, какое наблюдение соответствует любой из этих групп (k). Это важный момент, на который следует обратить внимание: алгоритм не даст нам количество кластеров, вместо этого нам нужно заранее определить число(k). Возможно, нам удастся запустить алгоритм с разными значениями (k) и определить наилучшее возможное решение. Короче говоря, кластеризация (k)-средних пытается минимизировать расстояния между наблюдениями, принадлежащими кластеру, и максимизировать расстояние между различными кластерами. Таким образом, мы имеем связь между наблюдениями, принадлежащими одной группе, в то время как наблюдения, принадлежащие другой группе, остаются дальше друг от друга. Обратите внимание, что, как мы объяснили в этом посте , (k)-средние являются исчерпывающими в том смысле, что каждое отдельное наблюдение в наборе данных будет вынуждено быть частью одного из предполагаемых (k) кластеров. Теперь должно быть ясно, откуда берется (k) в (k)-means, но как насчет части «средства»? Что ж, оказывается, что в рамках алгоритма мы также хотим определить центр каждого кластера. Мы называем это центроидом , и по мере того, как мы присваиваем наблюдения тому или иному кластеру, мы обновляем положение центроида кластера . Это делается путем взятия среднего значения (если хотите, среднего) всех точек данных, включенных в этот кластер. Легкий! Рецепт k-средств Рецепт (k)-средних довольно прост.
И вуаля! Взгляните на изображение ниже, где шаги схематически изображены для двумерного пространства. Те же шаги можно применить к большему количеству измерений (т. е. к большему количеству функций или атрибутов). Для простоты на схеме мы показываем только расстояние, измеренное до ближайшего центроида, но на практике необходимо учитывать все расстояния. Начиная Для целей нашей реализации мы для простоты рассмотрим некоторые данные с двумя атрибутами. Затем мы рассмотрим пример с большей размерностью. Для начала мы будем использовать подготовленный нами набор данных, который доступен здесь под именем kmeans_blobs.csv. Набор данных содержит 4 столбца со следующей информацией:
Мы отбросим столбец 4 для нашего анализа, но он может быть полезен для проверки результатов применения (k)-средних. Позже мы сделаем это во втором примере. Начнем с чтения набора данных:
Давайте посмотрим на наблюдения в наборе данных. Мы будем использовать столбец «Кластер», чтобы показать различные группы, присутствующие в наборе данных. Наша цель — увидеть, точно ли применение алгоритма воспроизводит группировки.
Давайте теперь посмотрим на наш рецепт. Шаги 1 и 2. Определите (k) и инициируйте центроиды. Сначала нам нужно 1) решить, сколько у нас групп, и 2) случайным образом назначить начальные центроиды. В этом случае давайте рассмотрим (k=3), а что касается центроидов, то они должны находиться в том же диапазоне, что и сам набор данных. Таким образом, один из вариантов — случайным образом выбрать наблюдения (k) и использовать их координаты для инициализации центроидов:
Шаг 3 – Рассчитайте расстояние Теперь нам нужно вычислить расстояние между каждым из центроидов и точками данных. Мы назначим точку данных центроиду, который даст нам минимальную ошибку. Создадим функцию для вычисления корня квадратной ошибки:
Давайте выберем точку данных и вычислим ошибку, чтобы увидеть, как это работает на практике. Мы будем использовать точку, которая на самом деле является одним из центроидов, которые мы выбрали выше. Таким образом, мы ожидаем, что ошибка для этой точки и третьего центроида равна нулю. Поэтому мы бы присвоили эту точку данных второму центроиду. Давайте взглянем:
Шаг 4. Назначьте центроиды Мы можем использовать идею шага 3 для создания функции, которая поможет нам назначить точки данных соответствующим центроидам. Мы вычислим все ошибки, связанные с каждым центроидом, а затем выберем для присвоения тот, у которого наименьшее значение:
Давайте добавим к нашим данным несколько столбцов, содержащих назначения центроидов и возникшую ошибку. Кроме того, мы можем использовать это для обновления нашей диаграммы рассеяния, показывающей центроиды (обозначенные квадратами), и раскрашиваем наблюдения в соответствии с центроидом, которому они были назначены:
Давайте посмотрим на общую ошибку, сложив все вклады. Мы рассмотрим эту ошибку как меру сходимости. Другими словами, если ошибка не изменится, мы можем считать, что центроиды стабилизировали свое положение, и мы можем прекратить наши итерации. На практике нам нужно помнить о том, что мы нашли локальный минимум (выходящий за рамки этой статьи).
Шаг 5. Обновите местоположение центроида. Теперь, когда у нас есть первая попытка определить наши кластеры, нам нужно обновить положение k центроидов. Мы делаем это, вычисляя среднее значение положения наблюдений, присвоенных каждому центроиду. Давайте посмотрим:
Мы можем убедиться, что позиция была обновлена. Давайте еще раз посмотрим на нашу диаграмму рассеяния:
Шаг 6. Повторите шаги 3–5. Теперь мы возвращаемся, чтобы вычислить расстояние до каждого центроида, назначить наблюдения и обновить местоположение центроида. Это вызывает функцию для инкапсуляции цикла:
Хорошо, теперь мы готовы применить нашу функцию. Сначала мы очистим наш набор данных и дадим алгоритму поработать:
Давайте посмотрим расположение последних центроидов:
И графически посмотрим на наши кластеры:
Как мы видим, получены три группы. В этом конкретном примере данные таковы, что различие между группами четкое. Однако не во всех случаях нам может повезти так же. Так что вопрос о том, сколько групп существует, все еще остается. Мы можем использовать экранный график, чтобы минимизировать ошибки, рассматривая запуск алгоритма с последовательностью (k=1,2,3,4,...) и ища «колено» на графике, обозначающее большое количество кластеров для использования:
Теперь мы можем применить «правило локтя», которое является эвристикой и помогает нам определить количество кластеров. Если мы думаем о линии, показанной выше, как об изображении руки, то «локоть» — это точка перегиба. В данном случае «колено» расположено между 2 и 4 кластерами, что указывает на то, что выбор 3 подходит. Использование Scikit-learn Мы видели, как выполнить первоначальную реализацию алгоритма, но во многих случаях вы можете захотеть встать на плечи гигантов и использовать другие проверенные и проверенные модули, которые помогут вам в работе по машинному обучению. В этом случае Scikit-learn — хороший выбор, и он имеет очень хорошую реализацию (k)-средних. Если вы хотите узнать больше об алгоритме и его оценке, вы можете взглянуть на главу 5 « Наука о данных и аналитика с помощью Python», где для обсуждения я использую набор данных Wine. В этом случае мы покажем, как можно реализовать k-средние в нескольких строках кода, используя известный набор данных Iris. Мы можем загрузить его непосредственно из Scikit-learn и перетасовать данные, чтобы гарантировать, что точки не перечислены в каком-либо определенном порядке.
Мы можем вызвать реализацию KMeans, чтобы создать экземпляр модели и подогнать ее. Параметр n_clusters — это количество кластеров (k). В примере ниже мы запрашиваем 3 кластера:
Вот и все! Мы можем посмотреть на метки, предоставленные алгоритмом, следующим образом:
Для сравнения изменим порядок меток:
Мы можем проверить, сколько наблюдений было правильно назначено. Делаем это с помощью матрицы путаницы:
Как мы видим, большинство наблюдений были правильно идентифицированы. В частности, кажется, что все из кластера 1 были захвачены. Давайте посмотрим на расположение финальных кластеров:
И мы можем посмотреть на 3D-графику. В этом случае мы построим следующие характеристики: • Ширина лепестка Как видите, есть несколько наблюдений, которые различаются по цвету на двух графиках.
Краткое содержание В этом посте мы объяснили идеи, лежащие в основе алгоритма (k)-средних, и предоставили простую реализацию этих идей на Python. Надеюсь, вы согласны с тем, что это очень простой для понимания алгоритм, и если вы захотите использовать более надежную реализацию, Scikit-learn поможет нам. Учитывая свою простоту, (k)-means является очень популярным выбором для начала кластерного анализа. Источник: domino.ai Комментарии: |
|