1. Обучим k-means и определим центры кластеров.

import numpy as np

from sklearn.cluster import KMeans

 

X = np.array([

    [1, 1],

    [1, 3],

    [2, 2],

    [8, 8],

    [9, 8],

    [8, 9]

])

 

model = KMeans(

    n_clusters=2,

    random_state=42,

    n_init=10

)

 

labels = model.fit_predict(X)

 

print("Метки:", labels)

print("Центры:")

print(model.cluster_centers_)

print("Inertia:", model.inertia_)

Центры кластеров:

Порядок центров может отличаться.

Внутрикластерная сумма квадратов составляет приблизительно 4.00.

График elbow показывает изменение внутрикластерной суммы квадратов при изменении количества кластеров, но сам по себе не гарантирует правильный выбор k.

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

2. Применим DBSCAN и иерархическую кластеризацию.

import numpy as np

from sklearn.cluster import DBSCAN, AgglomerativeClustering

 

X = np.array([

    [0.0, 0.0],

    [0.2, 0.1],

    [0.1, 0.2],

    [5.0, 5.0],

    [5.2, 5.1],

    [5.1, 5.2],

    [10.0, 10.0]

])

 

dbscan = DBSCAN(

    eps=0.5,

    min_samples=2

)

 

dbscan_labels = dbscan.fit_predict(X)

 

hierarchical = AgglomerativeClustering(

    n_clusters=2

)

 

hierarchical_labels = hierarchical.fit_predict(X)

 

print("DBSCAN:", dbscan_labels)

print("Иерархическая:", hierarchical_labels)

 

print("Шумовые объекты:")

print(X[dbscan_labels == -1])

DBSCAN выделяет две плотные группы и обозначает точку (10, 10) как шум.

Иерархическая кластеризация с двумя кластерами распределяет все наблюдения между двумя группами, включая удалённую точку.

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

3. Выполним PCA и оценим результат кластеризации.

from sklearn.datasets import make_blobs

from sklearn.preprocessing import StandardScaler

from sklearn.decomposition import PCA

from sklearn.cluster import KMeans

from sklearn.metrics import silhouette_score

 

X, _ = make_blobs(

    n_samples=150,

    n_features=4,

    centers=3,

    random_state=42

)

 

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

 

pca = PCA(n_components=2)

X_reduced = pca.fit_transform(X_scaled)

 

model = KMeans(

    n_clusters=3,

    random_state=42,

    n_init=10

)

 

labels = model.fit_predict(X_reduced)

 

score = silhouette_score(

    X_reduced,

    labels

)

 

print("Исходная форма:", X.shape)

print("После PCA:", X_reduced.shape)

print("Silhouette:", round(score, 3))

print(

    "Объяснённая дисперсия:",

    pca.explained_variance_ratio_

)

После PCA данные имеют форму (150, 2).

Коэффициент силуэта позволяет оценить, насколько объекты близки к своему кластеру по сравнению с другими кластерами. Более высокое значение обычно свидетельствует о более выраженном разделении групп.

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

При оценке также необходимо учитывать устойчивость кластеров, шум и особенности исходных данных.

В данном эксперименте PCA используется только для анализа и кластеризации искусственного набора данных. Если PCA включается в предсказательную модель, его следует обучать только на обучающих данных.