- •Подготовка наборов данных:
- •Загрузите наборы.
- •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. Сделайте выводы о том, какой метод кластеризации подходит под каждый из наборов данных.
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], 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
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) plt.ylabel('Инерция') plt.xlabel('Количество кластеров') plt.xticks(list(range(1, 11))) plt.grid() plt.show()
elbow_method(blobs_norm) elbow_method(circles_std) |
Рисунок 2.1.2 – График метода локтя для датафрейма df_blobs
Рисунок 2.1.3 – График метода локтя для датафрейма df_circles
На Рисунке 2.1.2 явно видно, что «локоть» находится в точке 3. В то время как на Рисунке 2.1.3 сложно определить, где находится «локоть». Как мне кажется, он находится в точках в интервале от 3 до 7.
