
Добавил:
renka1
Я за два дня прошел весь курс ТВиМС
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:5zad
.pyimport numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import NearestNeighbors
import pandas as pd
# Чтение данных из файла
data = []
with open("5_1.txt", "r") as f:
for line in f:
data.append([float(x) for x in line.strip().split()])
data = np.array(data)
# Стандартизация данных
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# Определение оптимального значения eps с помощью метода "колена"
neighbors = NearestNeighbors(n_neighbors=2)
neighbors_fit = neighbors.fit(data_scaled)
distances, indices = neighbors_fit.kneighbors(data_scaled)
distances = np.sort(distances[:, 1])
plt.figure(figsize=(10, 6))
plt.plot(distances)
plt.xlabel('Объекты')
plt.ylabel('Расстояние')
plt.title('График метода "колена" для определения eps')
plt.axhline(y=0.5, color='r', linestyle='--')
plt.grid(True)
plt.show()
# Применение DBSCAN с оптимизированными параметрами
dbscan = DBSCAN(eps=0.5, min_samples=4)
clusters = dbscan.fit_predict(data_scaled)
# Определение количества кластеров (групп)
n_clusters = len(set(clusters)) - (1 if -1 in clusters else 0)
print(f"Количество обнаруженных групп: {n_clusters}")
# Выделение выбросов (метка -1)
outliers = data[clusters == -1]
print(f"Количество выбросов (некорректно записанных объектов): {len(outliers)}")
# Вывод индексов выбросов
outlier_indices = np.where(clusters == -1)[0]
print("Индексы некорректно записанных объектов (нумерация с 0):")
print(outlier_indices)
# Создание DataFrame для удобного просмотра выбросов
outliers_df = pd.DataFrame(outliers, index=outlier_indices, columns=['Параметр 1', 'Параметр 2', 'Параметр 3', 'Параметр 4'])
print("\nНекорректно записанные объекты:")
print(outliers_df)
# Многомерная визуализация
plt.figure(figsize=(16, 12))
# Визуализация для пар параметров
plt.subplot(2, 3, 1)
plt.scatter(data[:, 0], data[:, 1], c=clusters, cmap='viridis', marker='o')
plt.scatter(outliers[:, 0], outliers[:, 1], c='red', marker='x', s=100)
plt.xlabel('Параметр 1')
plt.ylabel('Параметр 2')
plt.title('Кластеры по параметрам 1 и 2')
plt.grid(True)
plt.subplot(2, 3, 2)
plt.scatter(data[:, 0], data[:, 2], c=clusters, cmap='viridis', marker='o')
plt.scatter(outliers[:, 0], outliers[:, 2], c='red', marker='x', s=100)
plt.xlabel('Параметр 1')
plt.ylabel('Параметр 3')
plt.title('Кластеры по параметрам 1 и 3')
plt.grid(True)
plt.subplot(2, 3, 3)
plt.scatter(data[:, 0], data[:, 3], c=clusters, cmap='viridis', marker='o')
plt.scatter(outliers[:, 0], outliers[:, 3], c='red', marker='x', s=100)
plt.xlabel('Параметр 1')
plt.ylabel('Параметр 4')
plt.title('Кластеры по параметрам 1 и 4')
plt.grid(True)
plt.subplot(2, 3, 4)
plt.scatter(data[:, 1], data[:, 2], c=clusters, cmap='viridis', marker='o')
plt.scatter(outliers[:, 1], outliers[:, 2], c='red', marker='x', s=100)
plt.xlabel('Параметр 2')
plt.ylabel('Параметр 3')
plt.title('Кластеры по параметрам 2 и 3')
plt.grid(True)
plt.subplot(2, 3, 5)
plt.scatter(data[:, 1], data[:, 3], c=clusters, cmap='viridis', marker='o')
plt.scatter(outliers[:, 1], outliers[:, 3], c='red', marker='x', s=100)
plt.xlabel('Параметр 2')
plt.ylabel('Параметр 4')
plt.title('Кластеры по параметрам 2 и 4')
plt.grid(True)
plt.subplot(2, 3, 6)
plt.scatter(data[:, 2], data[:, 3], c=clusters, cmap='viridis', marker='o')
plt.scatter(outliers[:, 2], outliers[:, 3], c='red', marker='x', s=100)
plt.xlabel('Параметр 3')
plt.ylabel('Параметр 4')
plt.title('Кластеры по параметрам 3 и 4')
plt.grid(True)
plt.tight_layout()
plt.show()
# Дополнительный анализ - гистограммы распределения по кластерам
plt.figure(figsize=(14, 10))
for i in range(4):
plt.subplot(2, 2, i+1)
for cluster_id in set(clusters):
if cluster_id != -1: # Исключаем выбросы
cluster_data = data[clusters == cluster_id]
plt.hist(cluster_data[:, i], bins=20, alpha=0.5, label=f'Кластер {cluster_id}')
plt.xlabel(f'Параметр {i+1}')
plt.ylabel('Частота')
plt.title(f'Распределение параметра {i+1} по кластерам')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()