diff --git a/Lab_4/lab_products_clustering_cuml.ipynb b/Lab_4/lab_products_clustering_cuml.ipynb new file mode 100644 index 0000000..3384280 --- /dev/null +++ b/Lab_4/lab_products_clustering_cuml.ipynb @@ -0,0 +1,193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e7893b9e", + "metadata": {}, + "source": [ + "# Лабораторная работа: Методы искусственного интеллекта\n", + "## Задача кластеризации продуктов с использованием cuML\n", + "### Вариант: Продукты\n", + "В данной работе используется библиотека cuML для GPU-ускоренного анализа данных. Цель: провести кластеризацию продуктов на основе их характеристик." + ] + }, + { + "cell_type": "markdown", + "id": "e3834005", + "metadata": {}, + "source": [ + "### Загрузка и исследование данных" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5530d138", + "metadata": {}, + "outputs": [], + "source": [ + "import cudf\n", + "import cuml\n", + "from cuml.preprocessing import LabelEncoder\n", + "from cuml.decomposition import PCA\n", + "from cuml.cluster import KMeans\n", + "import cupy as cp\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Загрузка данных\n", + "df = cudf.read_csv('your_dataset_path.csv')\n", + "print(df.info())\n", + "print(df.head())" + ] + }, + { + "cell_type": "markdown", + "id": "49112908", + "metadata": {}, + "source": [ + "### Предварительная обработка данных" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e3ef9fa", + "metadata": {}, + "outputs": [], + "source": [ + "# Обработка пропущенных значений\n", + "df = df.dropna()\n", + "\n", + "# Кодирование категориального признака 'items'\n", + "label_encoder = LabelEncoder()\n", + "df['items_encoded'] = label_encoder.fit_transform(df['items'])\n", + "\n", + "# Нормализация числовых признаков\n", + "numeric_features = ['items_encoded', 'price']\n", + "df_scaled = df[numeric_features].astype('float32')\n", + "\n", + "# Преобразование данных в формат cupy\n", + "X = cp.asarray(df_scaled.values)" + ] + }, + { + "cell_type": "markdown", + "id": "ff5f1f8f", + "metadata": {}, + "source": [ + "### Понижение размерности и визуализация данных" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e15c80bb", + "metadata": {}, + "outputs": [], + "source": [ + "# Применение PCA для понижения размерности\n", + "pca = PCA(n_components=2)\n", + "reduced_data = pca.fit_transform(X)\n", + "\n", + "# Визуализация данных\n", + "plt.scatter(reduced_data[:, 0], reduced_data[:, 1])\n", + "plt.title('Визуализация данных после PCA')\n", + "plt.xlabel('PC1')\n", + "plt.ylabel('PC2')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f2eef505", + "metadata": {}, + "source": [ + "### Выбор оптимального количества кластеров" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f72195d2", + "metadata": {}, + "outputs": [], + "source": [ + "# Оценка инерции и коэффициента силуэта\n", + "inertia = []\n", + "silhouette_scores = []\n", + "k_range = range(2, 11)\n", + "for k in k_range:\n", + " kmeans = KMeans(n_clusters=k, random_state=42)\n", + " kmeans.fit(reduced_data)\n", + " inertia.append(kmeans.inertia_)\n", + " silhouette_scores.append(cuml.metrics.silhouette_score(reduced_data, kmeans.labels_))\n", + "\n", + "# Построение графиков\n", + "plt.figure(figsize=(14, 5))\n", + "plt.subplot(1, 2, 1)\n", + "plt.plot(k_range, inertia, marker='o')\n", + "plt.title('Критерий инерции')\n", + "plt.xlabel('Число кластеров')\n", + "plt.ylabel('Инерция')\n", + "\n", + "plt.subplot(1, 2, 2)\n", + "plt.plot(k_range, silhouette_scores, marker='o')\n", + "plt.title('Коэффициент силуэта')\n", + "plt.xlabel('Число кластеров')\n", + "plt.ylabel('Силуэт')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "180e85ac", + "metadata": {}, + "source": [ + "### Кластерный анализ" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd573024", + "metadata": {}, + "outputs": [], + "source": [ + "# Кластеризация с использованием KMeans\n", + "optimal_k = 4 # Выбираем на основе графиков\n", + "kmeans = KMeans(n_clusters=optimal_k, random_state=42)\n", + "labels = kmeans.fit_predict(reduced_data)\n", + "\n", + "# Визуализация кластеров\n", + "plt.scatter(reduced_data[:, 0], reduced_data[:, 1], c=labels, cmap='viridis')\n", + "plt.title('Кластеры (KMeans)')\n", + "plt.xlabel('PC1')\n", + "plt.ylabel('PC2')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "407d268e", + "metadata": {}, + "source": [ + "### Оценка качества кластеризации" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d00795e2", + "metadata": {}, + "outputs": [], + "source": [ + "# Оценка коэффициента силуэта\n", + "silhouette = cuml.metrics.silhouette_score(reduced_data, labels)\n", + "print(f'Силуэт для кластеризации: {silhouette:.2f}')" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +}