Пример 1. Кластеризация методом k-means

Кластеризация объединяет похожие объекты в группы без заранее заданных меток классов.

Алгоритм k-means стремится минимизировать внутрикластерную сумму квадратов расстояний до центров кластеров. Он последовательно назначает объекты ближайшим центрам и пересчитывает центроиды.

Рассмотрим четыре точки из лекции:

Центр первой группы: (0, 1).

Центр второй группы: (9, 8).

Реализация на Python:

import numpy as np

from sklearn.cluster import KMeans

 

X = np.array([

    [0, 0],

    [0, 2],

    [8, 8],

    [10, 8]

])

 

model = KMeans(

    n_clusters=2,

    random_state=42,

    n_init=10

)

 

labels = model.fit_predict(X)

 

print("Метки кластеров:", labels)

print("Центры кластеров:")

print(model.cluster_centers_)

print("Сумма квадратов:", model.inertia_)

Результат:

Центры кластеров соответствуют точкам (0, 1) и (9, 8). Их порядок и номера кластеров могут отличаться.

Внутрикластерная сумма квадратов равна 4.

Таким образом, k-means разделяет наблюдения на две группы по близости к центроидам.

Пример 2. Кластеризация DBSCAN и обнаружение шума

Алгоритм DBSCAN ищет области высокой плотности наблюдений и может выделять шумовые объекты.

В отличие от k-means, ему не требуется заранее указывать количество кластеров.

Реализация на Python:

import numpy as np

from sklearn.cluster import DBSCAN

 

X = np.array([

    [0.0, 0.0],

    [0.1, 0.0],

    [0.0, 0.1],

    [5.0, 5.0],

    [5.1, 5.0],

    [5.0, 5.1],

    [10.0, 0.0]

])

 

model = DBSCAN(

    eps=0.3,

    min_samples=2

)

 

labels = model.fit_predict(X)

 

for point, label in zip(X, labels):

    print("Объект:", point, "Кластер:", label)

Результат:

Алгоритм обнаруживает две группы близко расположенных объектов.

Точка (10, 0) обозначается меткой -1, что означает шум.

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

Пример 3. Снижение размерности методом PCA

Метод главных компонент (PCA) находит ортогональные направления максимальной дисперсии данных.

Он позволяет представить исходные наблюдения с меньшим количеством признаков.

Реализация на Python:

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.decomposition import PCA

from sklearn.pipeline import make_pipeline

 

X = np.array([

    [2, 4, 6],

    [3, 6, 9],

    [4, 8, 12],

    [5, 10, 15],

    [6, 12, 18]

])

 

model = make_pipeline(

    StandardScaler(),

    PCA(n_components=2)

)

 

X_reduced = model.fit_transform(X)

 

pca = model.named_steps["pca"]

 

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

print("Новая форма:", X_reduced.shape)

print(

    "Доля объяснённой дисперсии:",

    pca.explained_variance_ratio_

)

Результат:

Исходная форма: (5, 3).

Новая форма: (5, 2).

Данные преобразованы из трёхмерного пространства в двумерное.

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

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