Добавил:
Я за два дня прошел весь курс ТВиМС Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5zad

.py
Скачиваний:
0
Добавлен:
20.06.2025
Размер:
5.13 Кб
Скачать
import 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()
Соседние файлы в предмете Программирование на Python