Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab2_3352_ГарееваКР.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
1.07 Mб
Скачать

Построение графиков для поиска кластеров

Программа:

# Построим scatter plot для поиска кластеров

fig, axes = plt.subplots(2, 2, figsize=(15, 12))

# График 1: Цемент vs Прочность

axes[0,0].scatter(df_clean['Cement'], df_clean['Comp_Strength'], alpha=0.6, c='blue')

axes[0,0].set_xlabel('Цемент (кг/м³)')

axes[0,0].set_ylabel('Прочность (МПа)')

axes[0,0].set_title('Цемент vs Прочность')

axes[0,0].grid(True)

# График 2: Отношение цемент/вода vs Прочность

axes[0,1].scatter(df_clean['Cement/Water'], df_clean['Comp_Strength'], alpha=0.6, c='green')

axes[0,1].set_xlabel('Отношение Цемент/Вода')

axes[0,1].set_ylabel('Прочность (МПа)')

axes[0,1].set_title('Цемент/Вода vs Прочность')

axes[0,1].grid(True)

# График 3: Возраст vs Прочность

axes[1,0].scatter(df_clean['Age'], df_clean['Comp_Strength'], alpha=0.6, c='red')

axes[1,0].set_xlabel('Возраст (дни)')

axes[1,0].set_ylabel('Прочность (МПа)')

axes[1,0].set_title('Возраст vs Прочность')

axes[1,0].grid(True)

# График 4: Вода vs Прочность

axes[1,1].scatter(df_clean['Water'], df_clean['Comp_Strength'], alpha=0.6, c='purple')

axes[1,1].set_xlabel('Вода (кг/м³)')

axes[1,1].set_ylabel('Прочность (МПа)')

axes[1,1].set_title('Вода vs Прочность')

axes[1,1].grid(True)

plt.tight_layout()

plt.show()

Результаты:

Анализ кластеров

На графиках видны естественные группы бетонов:

- Низкопрочные смеси (мало цемента, много воды)

- Среднепрочные смеси (средние показатели)

- Высокопрочные смеси (много цемента, оптимальное водоцементное отношение)

Отношение цемент/вода хорошо разделяет смеси по эффективности

Признаки для кластеризации:

['Cement', 'Water', 'Age', 'Cement/Water', 'Comp_Strength']

Размерность данных: (981, 5)

Методы локтя и силуэта для определения оптимального числа кластеров

Программа:

inertia = []

silhouette_scores = []

k_range = range(2, 8)

for k in k_range:

kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)

kmeans.fit(X_scaled)

inertia.append(kmeans.inertia_)

silhouette_scores.append(silhouette_score(X_scaled, kmeans.labels_))

# Визуализация метода локтя

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))

ax1.plot(k_range, inertia, 'bo-')

ax1.set_xlabel('Количество кластеров')

ax1.set_ylabel('Inertia')

ax1.set_title('Метод локтя')

ax1.grid(True)

ax2.plot(k_range, silhouette_scores, 'ro-')

ax2.set_xlabel('Количество кластеров')

ax2.set_ylabel('Silhouette Score')

ax2.set_title('Silhouette Score')

ax2.grid(True)

plt.tight_layout()

plt.show()

Метод локтя анализирует внутрикластерную дисперсию (inertia). Оптимальное k соответствует точке на графике, где уменьшение inertia резко замедляется, образуя "локоть".

Метод силуэта оценивает качество кластеризации по шкале от -1 до 1, где значения ближе к 1 указывают на хорошо разделенные кластеры.

Анализ оптимального числа кластеров

k = 2: Silhouette Score = 0.324

k = 3: Silhouette Score = 0.362

k = 4: Silhouette Score = 0.286

k = 5: Silhouette Score = 0.293

k = 6: Silhouette Score = 0.255

k = 7: Silhouette Score = 0.274

Выбрано количество кластеров: 3