- •Подготовка наборов данных:
- •Загрузите наборы.
- •1.2. Проверьте корректность загрузки.
- •1.3. Постройте диаграмму рассеяния набора данных. Опишите форму данных, и особенности в данных.
- •1.4. Подготовьте наборы данных проведя стандартизация или нормировку данных. Обоснуйте выбор операции.
- •2.1. Проведите исследование оптимального количества кластеров методов локтя. Сделайте выводы, о наиболее подходящем количестве кластеров.
- •2.2. Проведите исследование оптимального количества кластеров методом силуэта. Сделайте выводы, о наиболее подходящем количестве кластеров.
- •2.3. Проведите кластеризацию алгоритмом k-means, с выбранным оптимальным количеством кластеров.
- •2.4. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.
- •2.5. Постройте диаграмму Вороного для результатов кластеризации. На диаграмме отметьте центроиды полученных кластеров.
- •2.7. Рассчитайте для каждого кластера кол-во точек, среднее, ско, минимум и максимум. Сопоставьте результаты с построенными графиками.
- •3.1. Подберите параметры алгоритма dbscan, которые на ваш взгляд дают наилучшие результаты. Опишите процесс (почему и как изменяли параметры) подбора параметров.
- •3.2. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.
- •3.3. Сделайте выводы об успешности кластеризации.
- •4. Иерархическая кластеризация:
- •4.2. Постройте диаграмму рассеяния результатов кластеризации с выделением разным цветом разных кластеров.
- •4.3. Сравните результаты кластеризации с результатами, полученными в п.2 и п.3. Сделайте выводы о том, какой метод кластеризации подходит под каждый из наборов данных.
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 внутренних кластера и отчасти желтый кластер.
