from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs

# Generate sample data
X, y = make_blobs(n_samples=100, centers=4, n_features=2, random_state=42)

# Create an Agglomerative Clustering object with n clusters
n_clusters = 4
clusterer = AgglomerativeClustering(n_clusters=n_clusters)

# Fit the clustering object to the data
cluster_labels = clusterer.fit_predict(X)

# Print the cluster labels for each data point
print("Cluster labels:", cluster_labels)

В этом примере мы сначала создаем синтетический набор данных, используя функцию make_blobs из scikit-learn, со 100 выборками и 4 кластерами. Затем мы создаем объект AgglomerativeClustering с 4 кластерами и подгоняем его к данным с помощью метода fit_predict. Наконец, мы печатаем полученные метки кластера для каждой точки данных.

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

Как построить Дендограмму

from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
import numpy as np

# Generate sample data
X = np.random.rand(10, 2)

# Compute the linkage matrix
Z = linkage(X, 'ward')

# Plot the dendrogram
fig = plt.figure(figsize=(10, 5))
dn = dendrogram(Z)
plt.xlabel('Data points')
plt.ylabel('Distance')
plt.show()

Функция связи.

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

Существует несколько типов функций связи, которые можно использовать, каждый из которых имеет свой собственный способ измерения различий между кластерами:

  • Одиночное соединение: измеряет кратчайшее расстояние между любыми двумя точками в двух кластерах.
  • Полная связь: измеряет максимальное расстояние между любыми двумя точками в двух кластерах.
  • Средняя связь: измеряет среднее расстояние между всеми парами точек в двух кластерах.
  • Связь с округами: минимизирует сумму квадратов различий во всех кластерах, что приводит к более компактным кластерам.

Библиотека scipy предоставляет реализацию функции связи, которая принимает в качестве входных данных матрицу попарных расстояний между точками данных и критерий связи. Вот пример того, как использовать scipy для вычисления матрицы связи для 2D-набора данных с 10 образцами с использованием критерия связи "опеки":

from scipy.cluster.hierarchy import linkage
import numpy as np

# Generate sample data
X = np.random.rand(10, 2)

# Compute the linkage matrix using the "ward" linkage criterion
Z = linkage(X, 'ward')

В этом примере мы сначала создаем случайный набор 2D-данных с 10 образцами с помощью NumPy. Затем мы вычисляем матрицу связи, используя функцию linkage из scipy.cluster.hierarchy с критерием связи "опеки". Результирующая матрица Z представляет собой матрицу (n-1) x 4, где n — количество точек данных, и каждая строка представляет собой операцию слияния между двумя кластерами, причем первые два столбца указывают индексы объединенных кластеров, а третий столбец с указанием расстояния между ними. Четвертый столбец используется функцией dendrogram для построения графиков.