Breathing K-Means — это расширение алгоритма K-Means, которое динамически обновляет центры кластеров во время итераций, позволяя им «дышать» и исследовать большее пространство поиска. Вот пошаговое руководство по реализации Breathing K-Means в Python:
Шаг 1. Импортируйте необходимые библиотеки
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs
Разберем каждую строку кода:
Первая строка импортирует библиотеку NumPy, которая является основным пакетом для научных вычислений в Python.
Вторая строка импортирует модуль pyplot
из библиотеки Matplotlib, которая представляет собой библиотеку для построения графиков в Python. Matplotlib позволяет создавать различные типы графиков, диаграмм и визуализаций для эффективного анализа и представления ваших данных.
Третья строка импортирует функцию make_blobs
из модуля datasets
библиотеки scikit-learn. Scikit-learn — это мощная библиотека машинного обучения на Python, которая предоставляет различные инструменты для анализа данных, моделирования и оценки. Функция make_blobs
— это служебная функция, используемая для создания синтетических наборов данных с заданными характеристиками, такими как количество выборок, центров и стандартное отклонение.
Шаг 2. Сгенерируйте синтетические данные с помощью функции make_blobs
из scikit-learn.
X, _ = make_blobs(n_samples=500, centers=4, random_state=42)
Разберем код построчно:
make_blobs
: это функция из модуляdatasets
scikit-learn, которая генерирует синтетические наборы данных. Он обычно используется для создания кластеров точек данных с определенными характеристиками.n_samples=500
: Этот параметр указывает количество выборок или точек данных для генерации. В этом случае он генерирует 500 точек данных.centers=4
: этот параметр определяет количество кластеров или центров в сгенерированных данных. Каждый центр представляет отдельную группу или кластер точек данных. В этом случае он генерирует точки данных, принадлежащие 4 кластерам.random_state=42
: Этот параметр устанавливает случайное начальное число для воспроизводимости. Это гарантирует, что каждый раз, когда вы запускаете код, создается один и тот же набор данных с одинаковыми характеристиками. В этом случае используется случайное состояние 42.X, _ = make_blobs(...)
: Эта строка присваивает сгенерированный набор данных переменнойX
. Переменная_
используется для отбрасывания второго вывода функцииmake_blobs
, который не нужен в этом фрагменте кода.
В целом, строка кода генерирует синтетический набор данных X
с использованием функции make_blobs
. Набор данных состоит из 500 точек данных, которые разделены на 4 отдельных кластера.
Шаг 3. Определите функцию для вычисления квадрата евклидова расстояния между двумя точками.
def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2) ** 2))
Разберем код построчно:
def euclidean_distance(x1, x2):
: Эта строка определяет функцию с именемeuclidean_distance
, которая принимает два входных параметра,x1
иx2
. Эта функция вычисляет евклидово расстояние между двумя точками в многомерном пространстве.return np.sqrt(np.sum((x1 - x2) ** 2))
: Эта строка содержит расчет для определения евклидова расстояния междуx1
иx2
. Вот разбивка расчета:
(x1 - x2)
: соответствующие элементыx2
вычитаются изx1
, в результате чего получается новый массив, представляющий разницу между координатами двух точек.(x1 - x2) ** 2
: возводит в квадрат каждый элемент массива разностей, что гарантирует, что все значения будут положительными.np.sum((x1 - x2) ** 2)
: вычисляет сумму всех квадратов разностей, эффективно вычисляя сумму квадратов евклидовых расстояний в каждом измерении.np.sqrt(np.sum((x1 - x2) ** 2))
: Наконец, это берет квадратный корень из суммы квадратов разностей, что дает евклидово расстояние междуx1
иx2
.
Евклидово расстояние является широко используемой метрикой для измерения расстояния по прямой между двумя точками в декартовой системе координат. Он вычисляет длину отрезка, соединяющего две точки. Функция euclidean_distance
инкапсулирует это вычисление и позволяет вам легко вычислить евклидово расстояние между любыми двумя точками в вашем коде.
Шаг 4: Реализуйте алгоритм Breathing K-Means
def breathing_kmeans(X, k, epsilon=0.01, max_iterations=100): # Initialize cluster centers randomly centers = X[np.random.choice(len(X), size=k, replace=False)] # Repeat until convergence or maximum iterations reached for _ in range(max_iterations): # Assign each data point to the nearest cluster center clusters = [[] for _ in range(k)] for x in X: distances = [euclidean_distance(x, center) for center in centers] nearest_cluster = np.argmin(distances) clusters[nearest_cluster].append(x) # Update cluster centers by taking the mean of each cluster prev_centers = np.copy(centers) for i in range(k): if clusters[i]: centers[i] = np.mean(clusters[i], axis=0) # Check for convergence center_shift = np.mean([euclidean_distance(prev_centers[i], centers[i]) for i in range(k)]) if center_shift < epsilon: break return centers
Разберем код построчно:
def breathing_kmeans(X, k, epsilon=0.01, max_iterations=100):
def breathing_kmeans(X, k, epsilon=0.01, max_iterations=100):
: Эта строка определяет функцию с именем breathing_kmeans
, которая принимает четыре входных параметра: X
, который представляет набор данных, k
для количества кластеров, epsilon
для порога сходимости и max_iterations
для максимального количества итераций.
centers = X[np.random.choice(len(X), size=k, replace=False)]
centers = X[np.random.choice(len(X), size=k, replace=False)]
: Эта строка случайным образом инициализирует центры кластера. Он использует np.random.choice
для случайного выбора k
индексов из диапазона длины X
без замены. Затем он использует эти индексы для извлечения соответствующих точек данных из X
и назначает их в качестве начальных центров кластеров.
for _ in range(max_iterations):
for _ in range(max_iterations):
: Эта строка запускает цикл, который повторяется до тех пор, пока не будет достигнуто сходимость или максимальное количество итераций. _
используется как соглашение, чтобы указать, что переменная цикла не используется в цикле.
clusters = [[] for _ in range(k)] for x in X: distances = [euclidean_distance(x, center) for center in centers] nearest_cluster = np.argmin(distances) clusters[nearest_cluster].append(x)
Код в этом блоке присваивает каждой точке данных ближайший центр кластера. Он создает пустой список для каждого кластера в переменной clusters
. Затем для каждой точки данных x
в X
он вычисляет евклидово расстояние между x
и каждым центром кластера, используя функцию euclidean_distance
. Он находит индекс ближайшего центра кластера, используя np.argmin
, и добавляет x
к соответствующему кластеру в списке clusters
.
prev_centers = np.copy(centers) for i in range(k): if clusters[i]: centers[i] = np.mean(clusters[i], axis=0)
Код в этом блоке обновляет центры кластеров, взяв среднее значение каждого кластера. Он создает копию текущих центров кластеров как prev_centers
. Затем для каждого индекса кластера i
проверяется, не является ли кластер пустым (if clusters[i]:
). Если кластер не пуст, он вычисляет среднее значение по каждому измерению (axis=0
) точек данных в кластере и присваивает результат обновленному центру кластера.
center_shift = np.mean([euclidean_distance(prev_centers[i], centers[i]) for i in range(k)]) if center_shift < epsilon: break
Код в этом блоке проверяет сходимость, вычисляя среднее смещение центров кластеров между итерациями. Он вычисляет евклидово расстояние между каждым предыдущим центром кластера и его обновленным аналогом, используя функцию euclidean_distance
. Он вычисляет среднее значение этих расстояний и сравнивает его с порогом сходимости epsilon
. Если средний сдвиг меньше epsilon
, цикл выходит из цикла и дальнейшие итерации останавливаются.
return centers
return centers
: Эта строка возвращает окончательные центры кластеров после сходимости или максимальное количество итераций.
В целом, функция breathing_kmeans
реализует алгоритм Breathing K-Means. Он случайным образом инициализирует центры кластеров, назначает точки данных ближайшим центрам кластеров, обновляет центры кластеров на основе среднего значения каждого кластера, проверяет сходимость и повторяет процесс до тех пор, пока не будет достигнута сходимость или максимальное количество итераций. Функция возвращает окончательные центры кластеров.
Шаг 5. Визуализируйте данные и центры кластеров
def plot_clusters(X, centers): plt.scatter(X[:, 0], X[:, 1], color='b', s=30) plt.scatter(centers[:, 0], centers[:, 1], color='r', marker='*', s=200) plt.title('Breathing K-Means Clustering') plt.show()
Разберем код построчно:
def plot_clusters(X, centers):
: Эта строка определяет функцию с именемplot_clusters
, которая принимает два параметра:X
представляет набор данных, аcenters
представляет центры кластеров.plt.scatter(X[:, 0], X[:, 1], color='b', s=30)
: Эта линия создает точечную диаграмму набора данныхX
. Он отображает значения первого столбцаX
по оси x и значения второго столбца по оси y. Параметрcolor='b'
задает синий цвет точек данных, аs=30
определяет размер точек данных.plt.scatter(centers[:, 0], centers[:, 1], color='r', marker='*', s=200)
: В этой строке добавляются маркеры точечной диаграммы для представления центров кластеров. Он отображает значения первого столбцаcenters
по оси x и значения второго столбца по оси y. Параметрcolor='r'
задает красный цвет маркеров,marker='*'
устанавливает стиль маркера в виде звезды (*), аs=200
определяет размер маркеров.plt.title('Breathing K-Means Clustering')
: Эта строка задает заголовок графика «Дыхательная кластеризация K-средних».plt.show()
: Эта строка отображает график на экране.
В целом функция plot_clusters
используется для создания точечной диаграммы набора данных X
, где точки данных отображаются синим цветом, а центры кластеров отмечены красными звездочками. Функция также устанавливает заголовок графика на «Дыхательная кластеризация K-средних» и отображает график на экране. Эта визуализация помогает понять распределение точек данных и расположение центров кластеров в контексте алгоритма кластеризации Breathing K-Means.
Шаг 6. Примените алгоритм Breathing K-Means к данным и визуализируйте результаты.
k = 4 final_centers = breathing_kmeans(X, k) plot_clusters(X, final_centers)
Разберем код построчно:
k = 4
: Эта строка присваивает значение 4 переменнойk
. Это указывает на то, что мы хотим выполнить кластеризацию с 4 кластерами.initial_centers = kmeans_plusplus(X, k)
: Эта строка вызывает функциюkmeans_plusplus
с набором данныхX
и значениемk
. Он присваивает возвращенное значение, представляющее начальные центры кластера, переменнойinitial_centers
. Функцияkmeans_plusplus
инициализирует центры кластеров с помощью алгоритма K-Means++.plot_clusters(X, initial_centers)
: Эта строка вызывает функциюplot_clusters
с набором данныхX
и начальными кластерными центрамиinitial_centers
в качестве аргументов. Эта функция создает точечную диаграмму набора данных с точками данных, окрашенными в синий цвет, и начальными центрами кластеров, отмеченными красными звездочками. График помогает визуализировать начальное распределение точек данных и положение начальных центров кластеров.
Таким образом, эти строки кода выполняют следующие шаги:
- Определите количество желаемых кластеров (
k
). - Вычислите начальные кластерные центры, используя алгоритм K-Means++.
- Визуализируйте набор данных и начальные кластерные центры, используя точечную диаграмму.
Вот и все! Вы реализовали алгоритм Breathing K-Means на Python. Полученный график покажет точки данных вместе с окончательными центрами кластеров, определенными алгоритмом Breathing K-Means.
Обратите внимание, что приведенные выше реализации предполагают двумерный набор данных, но вы можете изменить код для работы и с многомерными данными. Кроме того, не стесняйтесь настраивать параметры и экспериментировать с различными наборами данных, чтобы изучить поведение алгоритмов.
Заинтересованные читатели могут прочитать следующий учебник по алгоритму K-средних:
Существует еще один алгоритм, известный как K-Means++++, который представляет собой усовершенствование исходного алгоритма K-Means, который помогает лучше выбирать начальные центры кластеров, уменьшая вероятность сходимости к неоптимальным решениям. Пошаговое руководство по реализации K-Means++ на Python можно найти в следующем учебнике:
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Хлопайте за историю и подписывайтесь на автора 👉
- 📰 Смотрите больше контента в публикации Level Up Coding
- 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
- 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"
🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу