Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по ОМО 2025 / Baraeva_Elizaveta_lb2.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
1 Мб
Скачать
☆

3.1. Подберите параметры алгоритма dbscan, которые на ваш взгляд дают наилучшие результаты. Опишите процесс (почему и как изменяли параметры) подбора параметров.

MinPoints возьмем равным 6, чтобы алгоритм не был слишком чувствительным к шуму. Для подбора значения эпсилон будем использовать график K-расстояний, который для каждой точки вычисляет расстояния до 6 ближайших соседей, берет дальнее расстояние и строит график для точек, сортируя эти расстояния по возрастанию. Ордината изгиба графика и будет значением эпсилон.  Для нахождения «соседей» воспользуемся NearestNeighbors из библиотеки sklearn.neighbors. Далее для каждой точки отсортируем массив расстояний и возьмем последнее. Реализация приведена в Листинге 3.1.1. Графики представлены на Рисунке 3.1.2 и Рисунке 3.1.3.

Листинг 3.1.1 – Реализация построения графика K-расстояний

from sklearn.neighbors import NearestNeighbors

def k_distance_graph(df):

neighbors = NearestNeighbors(n_neighbors=6).fit(df)

distances, indices = neighbors.kneighbors(df)

distances = sorted(distances[:, 5])

plt.plot(distances)

plt.ylabel("Расстояние до 6-го ближайшего соседа")

plt.xlabel("Точки")

plt.grid(True)

plt.show()

blobs_df = pd.DataFrame(blobs_norm, columns=['x', 'y'])

circles_df = pd.DataFrame(circles_std, columns=['x', 'y'])

k_distance_graph(blobs_df)

k_distance_graph(circles_df)

Рисунок 3.1.2 – График K-расстояний датасета blobs

Рисунок 3.1.3 – График K-расстояний датасета circles

Для датасета blobs эпсилон возьмем равным 0.08, а для circles – 0.3.

3.2. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.

Для кластеризации импортируем DBSCAN из библиотеки sklearn.cluster. Создадим функцию dbscan, которая принимает датафрейм, значение эпсилон и значение minPoints. Она кластеризует данные, отдельно записывает кластеры и выбросы и рисует диаграмму. Реализация приведена в Листинге 3.2.1. Диаграммы представлены на Рисунке 3.2.2 и Рисунке 3.2.3.

Листинг 3.2.1 – Реализация DBSCAN и построения диаграмм

from sklearn.cluster import DBSCAN

def dbscan(df, esp, min_samples):

clusters = DBSCAN(eps=esp, min_samples=min_samples).fit_predict(df)

core_points = df[clusters != -1]

outliers = df[clusters == -1]

plt.scatter(core_points.iloc[:, 0], core_points.iloc[:, 1], c=clusters[clusters != -1], s=50)

plt.scatter(outliers.iloc[:, 0], outliers.iloc[:, 1], c='red', marker='x', s=50)

plt.xlabel("x")

plt.ylabel("y")

plt.show()

dbscan(blobs_df, 0.08, 6)

dbscan(circles_df, 0.3, 6)

Рисунок 3.2.2 – Диаграмма рассеяния датасета blobs

Рисунок 3.2.3 – Диаграмма рассеяния датасета circles

3.3. Сделайте выводы об успешности кластеризации.

Кластеризация датасета blobs выполнена успешно. DBSCAN нашел логично отделенные кластеры и корректно определил выбросы. С K-means количество и вид кластеров совпадают.

Кластеризация датасета circles выполнена также хорошо. Алгоритм корректно определил как плотные компактные группы, так и сложную структуру – кольцо. С K-means количество кластеров не совпадает. Одинаковы только 2 внутренних кластера и отчасти желтый кластер.

Соседние файлы в папке Лабы по ОМО 2025