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

Лабы по ОМО 2025 / Baraeva_Elizaveta_lb2

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
1 Мб
Скачать
☆
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Основы машинного обучения»
Тема: Кластеризация
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Жангиров Т. Р.
Санкт-Петербург
2025
2
Цель работы.
Изучить методы кластеризации данных (K-Means, DBSCAN, иерархическая), научится анализировать кластеризованные данные, выявлять выбросы, анализировать пересечение, интерпретировать полученные результаты, визуализировать данные. Также сравнить эти методы.
Задание.
Вариант 12W
1. Подготовка наборов данных:
1.1. Загрузите наборы.
1.2. Проверьте корректность загрузки.
1.3. Постройте диаграмму рассеяния набора данных. Опишите форму
данных, и особенности в данных.
1.4. Подготовьте наборы данных проведя стандартизация или
нормировку данных. Обоснуйте выбор операции.
2. K-Means:
2.1. Проведите исследование оптимального количества кластеров
методов локтя. Сделайте выводы, о наиболее подходящем количестве кластеров.
2.2. Проведите исследование оптимального количества кластеров
методом силуэта. Сделайте выводы, о наиболее подходящем количестве кластеров.
2.3. Проведите кластеризацию алгоритмом K-means, с выбранным оптимальным количеством кластеров.
2.4. Постройте диаграмму рассеяния результатов кластеризации с
выделением разным цветом разных кластеров.
3
2.5. Постройте диаграмму Вороного для результатов кластеризации.
На диаграмме отметьте центроиды полученных кластеров.
2.6. Постройте для каждого признака диаграмму “box-plot” или “violin-plot”, с разделением по кластерам. Сделайте выводы о разделении кластеров и успешности применения кластеризации K­means к набору данных.
2.7. Рассчитайте для каждого кластера кол-во точек, среднее, СКО, минимум и максимум. Сопоставьте результаты с построенными графиками.
3. DBSCAN:
3.1. Подберите параметры алгоритма DBSCAN, которые на ваш взгляд
дают наилучшие результаты. Опишите процесс (почему и как изменяли параметры) подбора параметров.
3.2. Постройте диаграмму рассеяния результатов кластеризации с
выделением разным цветом разных кластеров.
3.3. Сделайте выводы об успешности кластеризации.
4. Иерархическая кластеризация:
4.1. Проведите иерархическую кластеризацию для параметра linkage указанного в вашем варианте, используя количество кластеров, полученных в п.2 или п.3. Постройте дендрограмму. Сделайте выводы, о разделении кластеров и необходимости изменить количество кластеров (если считаете, что необходимо изменить количество кластеров, то повторите кластеризацию с другим количеством кластеров).
4.2. Постройте диаграмму рассеяния результатов кластеризации с
выделением разным цветом разных кластеров.
4
4.3. Сравните результаты кластеризации с результатами, полученными в п.2 и п.3. Сделайте выводы о том, какой метод кластеризации подходит под каждый из наборов данных.
Выполнение работы.
1. Подготовка наборов данных:
1.1. Загрузите наборы.
Для загрузки наборов необходимо использовать метод read_csv из библиотеки Pandas. В метод передаем название файла. Реализация данного функционала представлена в Листинге 1.1.1. Листинг 1.1.1 – Загрузка данных из файла
import pandas as pd df_blobs = pd.read_csv("lab2_blobs.csv") df_circles = pd.read_csv("lab2_circles.csv")
1.2. Проверьте корректность загрузки.
Вызвав метод head, можно проверить корректность загруженных данных (по умолчанию он возвращает 5 первых строк). Для этого выведем их. Реализация приведена в Листинге 1.2.1, а результат в Таблице 1.2.2 и Таблице
1.2.3. Листинг 1.2.1 – Вызов метода head
print(df_blobs.head()) print(df_circles.head())
Таблица 1.2.2 – Результат вывода первых пяти записей датафрейма df_blobs
# x
y
0
0.9232
0.3500
1
-0.5394
0.1214
2
0.5548
1.8120
5
3
-0.1227
0.3402
4
0.0411
-0.0905
Таблица 1.2.3 – Результат вывода первых пяти записей датафрейма df_circles
# x
y 0 0.4192
0.9737
1
-0.3424
0.9707
2
0.5116
-0.1549
3
0.4426
-0.0733
4
-0.3582
-0.1086
Можно заметить, что перед x стоит #. Для того чтобы ее убрать воспользуемся функцией rename и затем снова проверим вывод. Реализация приведена в Листинге 1.2.4, а результат в Таблице 1.2.5 и Таблице 1.2.6. Листинг 1.2.4 – Изменение названия столбца функцией rename
df_circles = df_circles.rename(columns={'# x': 'x'}) df_blobs = df_blobs.rename(columns={'# x': 'x'})
Таблица 1.2.5 – Результат вывода первых пяти записей датафрейма df_blobs
x y 0 0.9232
0.3500
1
-0.5394
0.1214
2
0.5548
1.8120
3
-0.1227
0.3402
4
0.0411
-0.0905
Таблица 1.2.6 – Результат вывода первых пяти записей датафрейма df_circles
x y
0
0.4192
0.9737
1
-0.3424
0.9707
6
2
0.5116
-0.1549
3
0.4426
-0.0733
4
-0.3582
-0.1086
1.3. Постройте диаграмму рассеяния набора данных. Опишите форму
данных, и особенности в данных.
Для начала подключим библиотеки Seaborn и Matplotlib. Для каждого графика создадим объект plt.figure. Затем с помощью sns.scatterplot построим диаграммы рассеяния. Передадим датасеты и названия осей. После зададим
заголовки и отобразим диаграммы. Реализация представлена в Листинге
1.3.1. Диаграммы изображены на Рисунке 1.3.2 и Рисунке 1.3.3. Листинг 1.3.1 – Реализация построения диаграмм рассеяния
import seaborn as sns import matplotlib.pyplot as plt plt.figure() sns.scatterplot(data=df_blobs, x='x', y='y') plt.title('Диаграмма рассеяния (blobs)') plt.show()
plt.figure() sns.scatterplot(data=df_circles, x='x', y='y') plt.title('Диаграмма рассеяния (circles)') plt.show()
7
Рисунок 1.3.2 – Диаграмма рассеяния датафрейма df_blobs
Рисунок 1.3.3 – Диаграмма рассеяния датафрейма df_circles
Данные на Рисунке 1.3.2 сгруппированы в виде трех отдельных групп
точек. Это указывает на кластеризованную структуру данных. В левой
нижней группе точки расположены плотнее, чем в двух других. Данные на Рисунке 1.3.3 расположены в виде эллипсов. Можно четко выделить два слоя
8
– внутренний и внешний. Это указывает на нелинейные зависимости в данных. Также во внутреннем круге виден разрыв по вертикали.
1.4. Подготовьте наборы данных проведя стандартизация или нормировку данных. Обоснуйте выбор операции.
Так как данные датафрейма df_blobs представляют собой кластеры, они не распределены нормально. В этом случае лучше использовать нормировку (MinMaxScaler), так как она сохранит относительные расстояния между точками. У датафрейма df_circles данные представлены в виде круговых кластеров, что говорит о различных масштабах вдоль разных осей. В этом случае лучше использовать стандартизацию (StandardScaler), так как она сохранит относительную структуру данных.
Для начала импортируем MinMaxScaler и StandardScaler из библиотеки sklearn.preprocessing. Затем с помощью метода fit_transform подготовим данные, используя нормировку и стандартизацию для df_blobs и df_circles соответственно. Далее с помощью plt.scatter построим диаграммы рассеяния для датафреймов. Добавим контур для точек, заголовок и подписи осей. Реализация представлена в Листинге 1.4.1. Диаграммы изображены на Рисунке 1.4.2 и Рисунке 1.4.3. Листинге 1.4.1 – Реализация подготовки наборов данных
from sklearn.preprocessing import MinMaxScaler, StandardScaler blobs_norm = MinMaxScaler().fit_transform(df_blobs) plt.scatter(blobs_norm[:, 0], blobs_norm[:, 1], edgecolors='w', linewidths=0.5) plt.title("Нормализованная диаграмма рассеяния (MinMaxScaler)") plt.xlabel("x") plt.ylabel("y") plt.show()
circles_std = StandardScaler().fit_transform(df_circles) plt.scatter(circles_std[:, 0], circles_std[:, 1],
9
edgecolors='w', linewidths=0.5)
plt.title("Стандартизованная диаграмма рассеяния
(StandardScaler)") plt.xlabel("x") plt.ylabel("y") plt.show()
Рисунок 1.4.2 – Диаграмма рассеяния датафрейма df_blobs
Рисунок 1.4.3 – Диаграмма рассеяния датафрейма df_circles
10
2. K-Means:
2.1. Проведите исследование оптимального количества кластеров
методов локтя. Сделайте выводы, о наиболее подходящем количестве
кластеров.
Для метода локтя необходимо построить график зависимости инерции (либо другой метрики качества) от количества кластеров. По графику выбрать точку, которая напоминает «локоть». Абсцисса точки и будет оптимальным количеством кластеров.
Для начала импортируем KMeans из библиотеки sklearn.cluster. Создадим функцию elbow_method, которая принимает датасет и строит график. Внутри функции создается массив значений инерции. В цикле до 10
для каждого значения создаётся модель KMeans с соответствующим числом
кластеров. Параметр n_init=5 означает, что алгоритм запустится 5 раз с разными начальными центрами кластеров. После обучения модели на данных с помощью метода fit, добавляем значение инерции через атрибут inertia_ в список inert_list. После цикла строится график. По оси x откладывается количество кластеров, по y – соответствующие значения инерции. В конце функция вызывается для датафреймов df_blobs и df_circles. Реализация представлена в Листинге 2.1.1. Графики изображены на Рисунке 2.1.2 и Рисунке 2.1.3. Листинг 2.1.1 – Реализация метода локтя
from sklearn.cluster import KMeans
def elbow_method(data): inert_list = [] for i in range(10): temp_km = KMeans(i + 1, n_init=5) temp_km.fit(data) inert_list.append(temp_km.inertia_) plt.plot(list(range(1, 11)), inert_list)
Соседние файлы в папке Лабы по ОМО 2025