Загрузка данных
# Рабочая тетрадь №5
# Кластеризация: k-средних и иерархическая кластеризация
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.datasets import load_iris
from scipy.cluster.hierarchy import dendrogram, linkage
# =========================
# ЗАДАНИЕ 1
# Кластеризация массива X методом k-средних
# =========================
print("ЗАДАНИЕ 1. Кластеризация массива X методом k-средних")
X = np.array([
[5, 3],
[10, 15],
[15, 12],
[24, 10],
[30, 45],
[85, 70],
[71, 80],
[60, 78],
[55, 52],
[80, 91]
])
# Экспериментируем с количеством кластеров
for k in [2, 3, 4]:
kmeans = KMeans(n_clusters=k, random_state=0, n_init=10)
labels = kmeans.fit_predict(X)
print(f"\nКоличество кластеров: {k}")
print("Метки кластеров:", labels)
print("Центры кластеров:")
print(kmeans.cluster_centers_)
plt.figure(figsize=(6, 5))
plt.scatter(X[:, 0], X[:, 1], c=labels, s=100)
plt.scatter(
kmeans.cluster_centers_[:, 0],
kmeans.cluster_centers_[:, 1],
marker="X",
s=250,
label="Центры кластеров"
)
for i, point in enumerate(X):
plt.text(point[0] + 1, point[1] + 1, str(i + 1))
plt.title(f"Задание 1. KMeans для массива X, k = {k}")
plt.xlabel("Признак 1")
plt.ylabel("Признак 2")
plt.legend()
plt.grid(True)
plt.show()
# =========================
# ЗАДАНИЕ 2
# Кластеризация ирисов Фишера методом k-средних
# =========================
print("\n\nЗАДАНИЕ 2. Кластеризация ирисов Фишера методом k-средних")
iris = load_iris()
iris_data = iris.data
iris_names = iris.feature_names
print("Размер набора данных Iris:", iris_data.shape)
print("Признаки:", iris_names)
# Для наглядного графика возьмем два признака:
# длина чашелистика и ширина чашелистика
iris_2d = iris_data[:, [0, 1]]
for k in [2, 3, 4]:
kmeans_iris = KMeans(n_clusters=k, random_state=0, n_init=10)
iris_labels = kmeans_iris.fit_predict(iris_data)
print(f"\nКоличество кластеров: {k}")
print("Первые 20 предсказанных кластеров:")
print(iris_labels[:20])
print("Центры кластеров:")
print(kmeans_iris.cluster_centers_)
# Для графика обучим KMeans только на двух признаках,
# чтобы центры тоже можно было красиво показать на плоскости
kmeans_iris_2d = KMeans(n_clusters=k, random_state=0, n_init=10)
iris_labels_2d = kmeans_iris_2d.fit_predict(iris_2d)
plt.figure(figsize=(7, 5))
plt.scatter(
iris_2d[:, 0],
iris_2d[:, 1],
c=iris_labels_2d,
s=60
)
plt.scatter(
kmeans_iris_2d.cluster_centers_[:, 0],
kmeans_iris_2d.cluster_centers_[:, 1],
marker="X",
s=250,
label="Центры кластеров"
)
plt.title(f"Задание 2. KMeans для Iris, k = {k}")
plt.xlabel("Длина чашелистика")
plt.ylabel("Ширина чашелистика")
plt.legend()
plt.grid(True)
plt.show()
# =========================
# ЗАДАНИЕ 3
# Иерархическая кластеризация ирисов Фишера
# Используем любые два признака
# =========================
print("\n\nЗАДАНИЕ 3. Иерархическая кластеризация ирисов Фишера")
# Используем два признака:
# 0 — длина чашелистика
# 2 — длина лепестка
iris_hier = iris_data[:, [0, 2]]
print("Используемые признаки:")
print("1) Длина чашелистика")
print("2) Длина лепестка")
# Сначала построим дендрограмму
linked = linkage(iris_hier, method="ward")
plt.figure(figsize=(12, 6))
dendrogram(linked)
plt.title("Дендрограмма для ирисов Фишера")
plt.xlabel("Объекты")
plt.ylabel("Расстояние")
plt.show()
# Теперь выполним иерархическую кластеризацию
for k in [2, 3, 4]:
hierarchical = AgglomerativeClustering(
n_clusters=k,
linkage="ward"
)
hier_labels = hierarchical.fit_predict(iris_hier)
print(f"\nКоличество кластеров: {k}")
print("Первые 20 предсказанных кластеров:")
print(hier_labels[:20])
plt.figure(figsize=(7, 5))
plt.scatter(
iris_hier[:, 0],
iris_hier[:, 1],
c=hier_labels,
s=60
)
plt.title(f"Задание 3. Иерархическая кластеризация Iris, k = {k}")
plt.xlabel("Длина чашелистика")
plt.ylabel("Длина лепестка")
plt.grid(True)
plt.show()
# =========================
# КРАТКИЙ ВЫВОД
# =========================
print("\n\nВЫВОД:")
print("В первом задании массив X был разделен на группы методом k-средних.")
print("При изменении количества кластеров меняется распределение точек по группам.")
print("Во втором задании набор ирисов Фишера был кластеризован методом KMeans.")
print("В третьем задании была выполнена иерархическая кластеризация ирисов по двум признакам.")
print("Дендрограмма помогает визуально оценить, на сколько кластеров можно разделить данные.")