{ "cells": [ { "cell_type": "markdown", "id": "4cad8cf9-52c5-4a78-ac16-39833303e1dc", "metadata": {}, "source": [ "# **Искусственные нейронные сети: первые шаги**" ] }, { "cell_type": "markdown", "id": "977abacb-0595-48ac-b874-ff6bf995fe06", "metadata": {}, "source": [ "# Базовая нейросеть" ] }, { "cell_type": "code", "execution_count": 1, "id": "afa2b869-a183-4d03-8907-b9cbf8531379", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 11\n", " 1 1.00 0.75 0.86 8\n", " 2 0.85 1.00 0.92 11\n", "\n", " accuracy 0.93 30\n", " macro avg 0.95 0.92 0.92 30\n", "weighted avg 0.94 0.93 0.93 30\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\Практика. 2 курс\\Task 4\\venv\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.\n", " warnings.warn(\n" ] } ], "source": [ "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.metrics import classification_report\n", "\n", "# Загрузка и разбиение данных\n", "X, y = load_iris(return_X_y=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "# Модель MLP — многослойный перцептрон\n", "clf = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=500)\n", "clf.fit(X_train, y_train)\n", "\n", "# Отчёт о точности\n", "print(classification_report(y_test, clf.predict(X_test)))" ] }, { "cell_type": "code", "execution_count": 4, "id": "b683837e-c854-4b6a-b48b-3db80b514ecf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 8\n", " 1 0.00 0.00 0.00 12\n", " 2 0.43 0.90 0.58 10\n", "\n", " accuracy 0.57 30\n", " macro avg 0.48 0.63 0.53 30\n", "weighted avg 0.41 0.57 0.46 30\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\Практика. 2 курс\\Task 4\\venv\\Lib\\site-packages\\sklearn\\neural_network\\_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100) reached and the optimization hasn't converged yet.\n", " warnings.warn(\n" ] } ], "source": [ "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.metrics import classification_report\n", "\n", "# Загрузка и разбиение данных\n", "X, y = load_iris(return_X_y=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "# Модель MLP — многослойный перцептрон\n", "clf = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=100)\n", "clf.fit(X_train, y_train)\n", "\n", "# Отчёт о точности\n", "print(classification_report(y_test, clf.predict(X_test)))" ] }, { "cell_type": "code", "execution_count": 5, "id": "6a3624c4-87ce-4c7e-b0a5-9b3fae3230aa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 1.00 1.00 1.00 13\n", " 1 1.00 1.00 1.00 11\n", " 2 1.00 1.00 1.00 6\n", "\n", " accuracy 1.00 30\n", " macro avg 1.00 1.00 1.00 30\n", "weighted avg 1.00 1.00 1.00 30\n", "\n" ] } ], "source": [ "from sklearn.datasets import load_iris\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.metrics import classification_report\n", "\n", "# Загрузка и разбиение данных\n", "X, y = load_iris(return_X_y=True)\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "\n", "# Модель MLP — многослойный перцептрон\n", "clf = MLPClassifier(hidden_layer_sizes=(10,), activation='relu', max_iter=2500)\n", "clf.fit(X_train, y_train)\n", "\n", "# Отчёт о точности\n", "print(classification_report(y_test, clf.predict(X_test)))" ] }, { "cell_type": "markdown", "id": "707bf955-5dbd-49e5-8650-4aeedf59531a", "metadata": {}, "source": [ "# Самостоятельное задание" ] }, { "cell_type": "markdown", "id": "3df34b09-a006-4b05-9d6d-9cae917c8535", "metadata": {}, "source": [ "# Biclustering документов с алгоритмом Spectral Co-clustering\n", "\n", "## Цель задачи:\n", "Целью данной работы является демонстрация применения алгоритма Spectral Co-clustering для совместной кластеризации документов и слов (бикластеризации) на наборе данных 20 newsgroups. \n", "\n", "Бикластеризация позволяет находить подмножества слов, которые часто встречаются вместе в подмножествах документов, что полезно для тематического моделирования и анализа текстов.\n", "\n", "Алгоритм сравнивается с MiniBatchKMeans по метрике V-measure." ] }, { "cell_type": "markdown", "id": "eddfbff7-533d-4a11-89e8-60e4f520dcd4", "metadata": {}, "source": [ "## Импорт необходимых библиотек" ] }, { "cell_type": "code", "execution_count": 1, "id": "0c5dd022-f4d1-4668-87ee-bcc4d4a6b3ae", "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "from time import time\n", "import numpy as np\n", "from sklearn.cluster import MiniBatchKMeans, SpectralCoclustering\n", "from sklearn.datasets import fetch_20newsgroups\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.metrics.cluster import v_measure_score\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from sklearn.datasets import make_biclusters\n", "from sklearn.metrics import consensus_score" ] }, { "cell_type": "markdown", "id": "751a8517-5965-4995-bb3c-762c50a89bb2", "metadata": {}, "source": [ "## 1. Работа с встроенным датасетом (20 newsgroups)" ] }, { "cell_type": "markdown", "id": "f853c375-b8da-48ef-a046-908b014c2446", "metadata": {}, "source": [ "### 1.1 Загрузка и подготовка данных\n", "Используем встроенный датасет 20 newsgroups, исключая категорию 'comp.os.ms-windows.misc', так как она содержит много постов только с данными." ] }, { "cell_type": "code", "execution_count": 19, "id": "4bdd4f2d-5e13-40cd-a52e-4b39b468cec8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vectorizing...\n", "Coclustering...\n", "Done in 1.53s. V-measure: 0.4415\n", "MiniBatchKMeans...\n", "Done in 2.06s. V-measure: 0.3015\n", "\n", "Best biclusters:\n", "----------------\n", "bicluster 0 : 8 documents, 6 words\n", "categories : 100% talk.politics.mideast\n", "words : cosmo, angmar, alfalfa, alphalpha, proline, benson\n", "\n", "bicluster 1 : 1948 documents, 4325 words\n", "categories : 23% talk.politics.guns, 18% talk.politics.misc, 17% sci.med\n", "words : gun, guns, geb, banks, gordon, clinton, pitt, cdt, surrender, veal\n", "\n", "bicluster 2 : 1259 documents, 3534 words\n", "categories : 27% soc.religion.christian, 25% talk.politics.mideast, 25% alt.atheism\n", "words : god, jesus, christians, kent, sin, objective, belief, christ, faith, moral\n", "\n", "bicluster 3 : 775 documents, 1623 words\n", "categories : 30% comp.windows.x, 25% comp.sys.ibm.pc.hardware, 20% comp.graphics\n", "words : scsi, nada, ide, vga, esdi, isa, kth, s3, vlb, bmug\n", "\n", "bicluster 4 : 2180 documents, 2802 words\n", "categories : 18% comp.sys.mac.hardware, 16% sci.electronics, 16% comp.sys.ibm.pc.hardware\n", "words : voltage, shipping, circuit, receiver, processing, scope, mpce, analog, kolstad, umass\n", "\n" ] } ], "source": [ "# Authors: The scikit-learn developers\n", "# SPDX-License-Identifier: BSD-3-Clause\n", "from collections import Counter\n", "from time import time\n", "\n", "import numpy as np\n", "\n", "from sklearn.cluster import MiniBatchKMeans, SpectralCoclustering\n", "from sklearn.datasets import fetch_20newsgroups\n", "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.metrics.cluster import v_measure_score\n", "\n", "\n", "def number_normalizer(tokens):\n", " \"\"\"Map all numeric tokens to a placeholder.\n", "\n", " For many applications, tokens that begin with a number are not directly\n", " useful, but the fact that such a token exists can be relevant. By applying\n", " this form of dimensionality reduction, some methods may perform better.\n", " \"\"\"\n", " return (\"#NUMBER\" if token[0].isdigit() else token for token in tokens)\n", "\n", "\n", "class NumberNormalizingVectorizer(TfidfVectorizer):\n", " def build_tokenizer(self):\n", " tokenize = super().build_tokenizer()\n", " return lambda doc: list(number_normalizer(tokenize(doc)))\n", "\n", "\n", "# exclude 'comp.os.ms-windows.misc'\n", "categories = [\n", " \"alt.atheism\",\n", " \"comp.graphics\",\n", " \"comp.sys.ibm.pc.hardware\",\n", " \"comp.sys.mac.hardware\",\n", " \"comp.windows.x\",\n", " \"misc.forsale\",\n", " \"rec.autos\",\n", " \"rec.motorcycles\",\n", " \"rec.sport.baseball\",\n", " \"rec.sport.hockey\",\n", " \"sci.crypt\",\n", " \"sci.electronics\",\n", " \"sci.med\",\n", " \"sci.space\",\n", " \"soc.religion.christian\",\n", " \"talk.politics.guns\",\n", " \"talk.politics.mideast\",\n", " \"talk.politics.misc\",\n", " \"talk.religion.misc\",\n", "]\n", "newsgroups = fetch_20newsgroups(categories=categories)\n", "y_true = newsgroups.target\n", "\n", "vectorizer = NumberNormalizingVectorizer(stop_words=\"english\", min_df=5)\n", "cocluster = SpectralCoclustering(\n", " n_clusters=len(categories), svd_method=\"arpack\", random_state=0\n", ")\n", "kmeans = MiniBatchKMeans(\n", " n_clusters=len(categories), batch_size=20000, random_state=0, n_init=3\n", ")\n", "\n", "print(\"Vectorizing...\")\n", "X = vectorizer.fit_transform(newsgroups.data)\n", "\n", "print(\"Coclustering...\")\n", "start_time = time()\n", "cocluster.fit(X)\n", "y_cocluster = cocluster.row_labels_\n", "print(\n", " f\"Done in {time() - start_time:.2f}s. V-measure: \\\n", "{v_measure_score(y_cocluster, y_true):.4f}\"\n", ")\n", "\n", "\n", "print(\"MiniBatchKMeans...\")\n", "start_time = time()\n", "y_kmeans = kmeans.fit_predict(X)\n", "print(\n", " f\"Done in {time() - start_time:.2f}s. V-measure: \\\n", "{v_measure_score(y_kmeans, y_true):.4f}\"\n", ")\n", "\n", "\n", "feature_names = vectorizer.get_feature_names_out()\n", "document_names = list(newsgroups.target_names[i] for i in newsgroups.target)\n", "\n", "\n", "def bicluster_ncut(i):\n", " rows, cols = cocluster.get_indices(i)\n", " if not (np.any(rows) and np.any(cols)):\n", " import sys\n", "\n", " return sys.float_info.max\n", " row_complement = np.nonzero(np.logical_not(cocluster.rows_[i]))[0]\n", " col_complement = np.nonzero(np.logical_not(cocluster.columns_[i]))[0]\n", " # Note: the following is identical to X[rows[:, np.newaxis],\n", " # cols].sum() but much faster in scipy <= 0.16\n", " weight = X[rows][:, cols].sum()\n", " cut = X[row_complement][:, cols].sum() + X[rows][:, col_complement].sum()\n", " return cut / weight\n", "\n", "\n", "bicluster_ncuts = list(bicluster_ncut(i) for i in range(len(newsgroups.target_names)))\n", "best_idx = np.argsort(bicluster_ncuts)[:5]\n", "\n", "print()\n", "print(\"Best biclusters:\")\n", "print(\"----------------\")\n", "for idx, cluster in enumerate(best_idx):\n", " n_rows, n_cols = cocluster.get_shape(cluster)\n", " cluster_docs, cluster_words = cocluster.get_indices(cluster)\n", " if not len(cluster_docs) or not len(cluster_words):\n", " continue\n", "\n", " # categories\n", " counter = Counter(document_names[doc] for doc in cluster_docs)\n", "\n", " cat_string = \", \".join(\n", " f\"{(c / n_rows * 100):.0f}% {name}\" for name, c in counter.most_common(3)\n", " )\n", "\n", " # words\n", " out_of_cluster_docs = cocluster.row_labels_ != cluster\n", " out_of_cluster_docs = np.where(out_of_cluster_docs)[0]\n", " word_col = X[:, cluster_words]\n", " word_scores = np.array(\n", " word_col[cluster_docs, :].sum(axis=0)\n", " - word_col[out_of_cluster_docs, :].sum(axis=0)\n", " )\n", " word_scores = word_scores.ravel()\n", " important_words = list(\n", " feature_names[cluster_words[i]] for i in word_scores.argsort()[:-11:-1]\n", " )\n", "\n", " print(f\"bicluster {idx} : {n_rows} documents, {n_cols} words\")\n", " print(f\"categories : {cat_string}\")\n", " print(f\"words : {', '.join(important_words)}\\n\")" ] }, { "cell_type": "code", "execution_count": 2, "id": "927d506e-dd51-4616-888f-4c114a44b106", "metadata": {}, "outputs": [], "source": [ "# Исключаем 'comp.os.ms-windows.misc'\n", "categories = [\n", " \"alt.atheism\",\n", " \"comp.graphics\",\n", " \"comp.sys.ibm.pc.hardware\",\n", " \"comp.sys.mac.hardware\",\n", " \"comp.windows.x\",\n", " \"misc.forsale\",\n", " \"rec.autos\",\n", " \"rec.motorcycles\",\n", " \"rec.sport.baseball\",\n", " \"rec.sport.hockey\",\n", " \"sci.crypt\",\n", " \"sci.electronics\",\n", " \"sci.med\",\n", " \"sci.space\",\n", " \"soc.religion.christian\",\n", " \"talk.politics.guns\",\n", " \"talk.politics.mideast\",\n", " \"talk.politics.misc\",\n", " \"talk.religion.misc\",\n", "]\n", "\n", "# Загрузка данных\n", "newsgroups = fetch_20newsgroups(categories=categories)\n", "y_true = newsgroups.target" ] }, { "cell_type": "markdown", "id": "11c70dd8-8a44-48e8-89c6-c13f2bef8987", "metadata": {}, "source": [ "### 1.2 Препроцессинг данных\n", "Создаем кастомный векторизатор, который нормализует числа в тексте (заменяет их на #NUMBER)." ] }, { "cell_type": "code", "execution_count": 3, "id": "157bc5ce-66e6-4c66-ad2f-8b25a40af6b5", "metadata": {}, "outputs": [], "source": [ "def number_normalizer(tokens):\n", " \"\"\"Заменяет все числовые токены на placeholder #NUMBER\"\"\"\n", " return (\"#NUMBER\" if token[0].isdigit() else token for token in tokens)\n", "\n", "class NumberNormalizingVectorizer(TfidfVectorizer):\n", " def build_tokenizer(self):\n", " tokenize = super().build_tokenizer()\n", " return lambda doc: list(number_normalizer(tokenize(doc)))\n", "\n", "# Создаем векторизатор с удалением стоп-слов и минимальной частотой слова 5\n", "vectorizer = NumberNormalizingVectorizer(stop_words=\"english\", min_df=5)\n", "X = vectorizer.fit_transform(newsgroups.data)" ] }, { "cell_type": "markdown", "id": "067ce0e9-cc59-427d-9d59-079092991301", "metadata": {}, "source": [ "### 1.3 Обучение моделей" ] }, { "cell_type": "code", "execution_count": 4, "id": "1eef0f0c-8956-4b2e-b1c7-4191e78bfed7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coclustering...\n", "Done in 5.62s. V-measure: 0.4415\n", "MiniBatchKMeans...\n", "Done in 1.40s. V-measure: 0.3015\n" ] } ], "source": [ "# Инициализация моделей\n", "cocluster = SpectralCoclustering(\n", " n_clusters=len(categories), svd_method=\"arpack\", random_state=0\n", ")\n", "kmeans = MiniBatchKMeans(\n", " n_clusters=len(categories), batch_size=20000, random_state=0, n_init=3\n", ")\n", "\n", "# Обучение Spectral Co-clustering\n", "print(\"Coclustering...\")\n", "start_time = time()\n", "cocluster.fit(X)\n", "y_cocluster = cocluster.row_labels_\n", "print(f\"Done in {time() - start_time:.2f}s. V-measure: {v_measure_score(y_cocluster, y_true):.4f}\")\n", "\n", "# Обучение MiniBatchKMeans\n", "print(\"MiniBatchKMeans...\")\n", "start_time = time()\n", "y_kmeans = kmeans.fit_predict(X)\n", "print(f\"Done in {time() - start_time:.2f}s. V-measure: {v_measure_score(y_kmeans, y_true):.4f}\")" ] }, { "cell_type": "markdown", "id": "ffe70635-8ac9-4038-a7b7-6fba38141441", "metadata": {}, "source": [ "### 1.4 Анализ результатов\n", "Выводим информацию о лучших бикластерах." ] }, { "cell_type": "code", "execution_count": 11, "id": "8c166b37-814c-492b-a1e0-a4a367c88a7b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Best biclusters:\n", "----------------\n", "bicluster 0 : 8 documents, 6 words\n", "categories : 100% talk.politics.mideast\n", "words : cosmo, angmar, alfalfa, alphalpha, proline, benson\n", "\n", "bicluster 1 : 1948 documents, 4325 words\n", "categories : 23% talk.politics.guns, 18% talk.politics.misc, 17% sci.med\n", "words : gun, guns, geb, banks, gordon, clinton, pitt, cdt, surrender, veal\n", "\n", "bicluster 2 : 1259 documents, 3534 words\n", "categories : 27% soc.religion.christian, 25% talk.politics.mideast, 25% alt.atheism\n", "words : god, jesus, christians, kent, sin, objective, belief, christ, faith, moral\n", "\n", "bicluster 3 : 775 documents, 1623 words\n", "categories : 30% comp.windows.x, 25% comp.sys.ibm.pc.hardware, 20% comp.graphics\n", "words : scsi, nada, ide, vga, esdi, isa, kth, s3, vlb, bmug\n", "\n", "bicluster 4 : 2180 documents, 2802 words\n", "categories : 18% comp.sys.mac.hardware, 16% sci.electronics, 16% comp.sys.ibm.pc.hardware\n", "words : voltage, shipping, circuit, receiver, processing, scope, mpce, analog, kolstad, umass\n", "\n" ] } ], "source": [ "feature_names = vectorizer.get_feature_names_out()\n", "document_names = list(newsgroups.target_names[i] for i in newsgroups.target)\n", "\n", "def bicluster_ncut(i):\n", " \"\"\"Вычисляет normalized cut для бикластера\"\"\"\n", " rows, cols = cocluster.get_indices(i)\n", " if not (np.any(rows) and np.any(cols)):\n", " import sys\n", " return sys.float_info.max\n", " row_complement = np.nonzero(np.logical_not(cocluster.rows_[i]))[0]\n", " col_complement = np.nonzero(np.logical_not(cocluster.columns_[i]))[0]\n", " weight = X[rows][:, cols].sum()\n", " cut = X[row_complement][:, cols].sum() + X[rows][:, col_complement].sum()\n", " return cut / weight\n", "\n", "# Находим 5 лучших бикластеров\n", "bicluster_ncuts = [bicluster_ncut(i) for i in range(len(newsgroups.target_names))]\n", "best_idx = np.argsort(bicluster_ncuts)[:5]\n", "\n", "print(\"\\nBest biclusters:\")\n", "print(\"----------------\")\n", "for idx, cluster in enumerate(best_idx):\n", " n_rows, n_cols = cocluster.get_shape(cluster)\n", " cluster_docs, cluster_words = cocluster.get_indices(cluster)\n", " if not len(cluster_docs) or not len(cluster_words):\n", " continue\n", "\n", " # Анализ категорий\n", " counter = Counter(document_names[doc] for doc in cluster_docs)\n", " cat_string = \", \".join(\n", " f\"{(c / n_rows * 100):.0f}% {name}\" for name, c in counter.most_common(3)\n", " )\n", "\n", " # Анализ слов\n", " out_of_cluster_docs = cocluster.row_labels_ != cluster\n", " out_of_cluster_docs = np.where(out_of_cluster_docs)[0]\n", " word_col = X[:, cluster_words]\n", " word_scores = np.array(\n", " word_col[cluster_docs, :].sum(axis=0) - word_col[out_of_cluster_docs, :].sum(axis=0)\n", " )\n", " word_scores = word_scores.ravel()\n", " important_words = list(\n", " feature_names[cluster_words[i]] for i in word_scores.argsort()[:-11:-1]\n", " )\n", "\n", " print(f\"bicluster {idx} : {n_rows} documents, {n_cols} words\")\n", " print(f\"categories : {cat_string}\")\n", " print(f\"words : {', '.join(important_words)}\\n\")\n" ] }, { "cell_type": "markdown", "id": "60c0f67c-d371-4adc-9c0d-d1c5adc4b75f", "metadata": {}, "source": [ "### 1.5 Визуализация результатов\n", "Сравниваем результаты кластеризации по метрике V-measure." ] }, { "cell_type": "code", "execution_count": 5, "id": "3d19b351-a57b-4de0-ae2a-b71cfcf4cf15", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArMAAAHDCAYAAAA3LZJHAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPIFJREFUeJzt3Qu8VOP+x/Ff9/tFUimxKSRSKXUKJ5wocsstiZLkuJ7IQYmSOBVJLimikFtyJ+LouB45pQu55VaKdHPpSrH3/F/f5/Va818ze2bv2btpZj97f96v19CsvWbNs9asedZ3PetZz5SLRCIRAwAAADxUPtsFAAAAAIqLMAsAAABvEWYBAADgLcIsAAAAvEWYBQAAgLcIswAAAPAWYRYAAADeIswCAADAW4RZAAAAeIswCwAAAG8RZpEV33zzjf3973+3ffbZx6pWrWq1a9e2ww47zO6880777bffsl08APDKSSedZNWrV7dNmzYlnadPnz5WuXJl++mnnzJaNmBnI8wi42bNmmWtWrWyp556yk488US7++67bfTo0bbnnnva1VdfbYMGDcp2EQHAKwqqagh47rnnEv5969at9sILL1j37t1t1113zXj5gJ2p4k5dOhBn2bJldtZZZ9lee+1l//nPf2z33XeP/u3SSy+1r7/+2oVdAEDRWmZr1apljz/+uPXt2zff3xVkt2zZ4kIv/p+2SY0aNbJdDOwgWmaRUbfeeqtt3rzZHnzwwZggG2jevHlMy2y5cuXssssus8cee8z2339/1yWhXbt29s4778S87rvvvrNLLrnEzVOtWjXX8nDGGWfY8uXLY+Z76KGH3DKDhy7LqZX4gQceiJnvvPPOs5o1a+Yr39NPP+1e99Zbb8VM/9///udaPOrUqeOW2aVLF/vvf/8bM8+NN97oXrt+/fqY6R9++KGbrrKF3z8nJydmvpUrV7p107zx6/Xqq6/aEUcc4SplHdB69Ohhn376qRUm2B669Lhu3bqYv82dOze6nVTGoqxvsK4FPcLbcObMme5z1frVr1/fzjnnHPvhhx8SllnbJdHywtsvOEhdddVV1rRpU6tSpYrbN8aNG2eRSCRmvvAyKlSoYE2aNLELL7zQfv3110K3n16jdQ38+eefdvzxx1u9evXss88+S7it4x9HHnlkdJ6ff/7Z/vnPf7p9Uvufut8cd9xx9tFHH+V7799//92993777ee+F/o+nXrqqa4Lj/aPwra/9rGA1vWKK66Ibit9D8eOHWt5eXnReYJlahvecccd7oRUn5c++08++SSmbEXZf08++WQ3r9ahQYMGLpQtWbIk5rXTpk2zo48+2v1d5WvZsqVNmjQp3zbRck444YR801WH6H3Dgn00THVTo0aN8u2f+ozCn5PMnz8/ui0Lo9cW9FnEf5/vvfdeO/DAA926Nm7c2J3oF7Y/atvq858zZ46tXbs2398VclU3aPsmo3VWeXTVbOTIke67oNecfvrptmHDBtu2bZvbT/Q5aP/s37+/mxbv0UcfjX6f9V1QA4Y+/7B3333X1dG6Iqf11L535ZVX5utmtnr1avc+e+yxh5tP+7n2mfA2i/8ehveH8H4efAfffvttd7zQemi5O1qPIvtomUVGvfTSS66fbOfOnVN+jSqeGTNm2D/+8Q9XmamiV5CaN2+eHXTQQdEDy/vvv+8qTVVOquh0sNNBRKFCgStMB2OFpo0bN9rUqVNt4MCBruLr2rVrkddJLcwKHKq8R4wYYeXLl48efFVhd+jQwdJh+PDhLsDEmz59uvXr18+6devmAoguJ2rdDz/8cFu0aFG+UJGIQpwOQDqYBLQOChjx75nK+uqgqkAU0HIPOOAAFxIDeh4cYHSwOvTQQ113kzVr1ri+0wrHKn/dunXzlbdNmzYuqAat/do2YQqsOmi/+eabNmDAADf/a6+95rqxKCTr8w/r2bOnK7PCqEL8/fff7w6q2rZFccEFF7hA8O9//9sFrkSCfU9uueWWmL99++239vzzz7uD/N577+22xX333ecCo/ZjBRvJzc11oU3BRfu8TgDVV1Lvq2Cp/Thc9meffdZdfg5Pa9asmfu/9hctX9tF/dgVLvRdGjp0qP344482YcKEmDI+8sgj7r0UsLRv6LPSZ68A2rBhwyLvv6L9QiFy1apVds8997jy63MNvrfanxXu9JlWrFjR1SMKIwrbKke63H777W6bp+Laa68t0rJVL2n/DnvllVfsiSeeiJmmUKYgqW1w8cUX29KlS936q47Td6JSpUpJ30Otrg8//LALowrw4ZMk7f+9e/d2AbMwKqfmGzJkiLtapq5gel9913/55RdXxg8++MB9d7Wfhr9/2qdvuOEGO/PMM933QSfJev1f//rXmO+zTmC172kd1fig+lzz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XFu2bCnq4gAAAIDMhdm9997bFi9enG/67Nmz7YADDih+SQAAAICdPZqB+steeuml9vvvv1skErF58+bZE088YaNHj3Y/awsAAACU2DB7wQUXWLVq1ez666+3rVu32tlnn+1GNbjzzjvtrLPO2jmlBAAAANI1zmyfPn3cQ2F28+bN1qBBg+IsBgAAAMjejyZUr17dPQAAAAAvwuxPP/1kw4cPtzfffNPWrl1reXl5MX//+eef01k+AAAAIH1h9txzz7Wvv/7aBgwYYA0bNrRy5coVdREAAABAdsLsu+++a++99561bt06PSUAAAAAMjXObIsWLey3334r7vsBAAAA2Quz9957r/sp27ffftv1n924cWPMAwAAACix3Qzq1q3rQuvRRx8dM10/oKD+s7m5ueksHwAAAJC+MKvxZStVqmSPP/44N4ABAADArzD7ySef2KJFi2z//fffOSUCAAAAdlaf2fbt29vKlSuL+jIAAAAg+2H28ssvt0GDBtlDDz1kCxYssI8//jjmURwTJ060nJwcq1q1qnXs2NHmzZuXdN4pU6bYEUccYbvssot7dO3atcD5AQAAUHoVuZtBr1693P/PP//86DT1my3uDWAzZsywwYMH2+TJk12QnTBhgnXr1s2WLl1qDRo0yDf/W2+9Zb1797bOnTu78Dt27Fg79thj7dNPP7UmTZoUdXUAAABQlsLssmXL0lqA8ePH28CBA61///7uuULtrFmzbOrUqTZkyJB88z/22GMxzx944AF75plnbM6cOda3b9+0lg0AAAClLMzutddeaXvz7du3u64KQ4cOjU4rX7686zowd+7clJaxdetW++OPP6xevXoJ/75t2zb3CDAWLgAAQBnuMxtWu3Zt+/bbb4v9+vXr17tuCRriK0zPV69endIyrr32WmvcuLELwImMHj3a6tSpE300bdq02OUFAABAKQqz6iebTWPGjLEnn3zSnnvuOdd/NhG1+m7YsCH6YCQGAACAMtjNQOPLHnTQQWl98/r161uFChVszZo1MdP1vFGjRgW+dty4cS7MvvHGG3bwwQcnna9KlSruAQAAgDLcMqvAqNEGNDTWpk2b3LRzzjnHdTUorsqVK1u7du3czVuBvLw897xTp05JX3frrbfaqFGjbPbs2W7cWwAAAJRNKYfZt99+2w488EC76qqrbPfdd7d+/fq5IbLU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mTOtRYsWbv5WrVrZK6+8krGyAgAAoOTIepidMWOGDR482EaMGGELFy601q1bW7du3Wzt2rUJ53///fetd+/eNmDAAFu0aJGdcsop7vHJJ59kvOwAAAAo42F2/PjxNnDgQOvfv7+1bNnSJk+ebNWrV7epU6cmnP/OO++07t2729VXX20HHHCAjRo1yg455BC75557Ml52AAAAZFfFbL759u3bbcGCBTZ06NDotPLly1vXrl1t7ty5CV+j6WrJDVNL7vPPP59w/m3btrlHYMOGDe7/GzdutEzJ27Y1Y+8FIHsyWa+UNNRzQOm3MYN1XPBekUikZIfZ9evXW25urjVs2DBmup5/8cUXCV+zevXqhPNreiKjR4+2kSNH5pvetGnTHSo7AMSrMyHbJQCA0lXHbdq0yerUqVNyw2wmqNU33JKbl5dnP//8s+26665Wrly5rJYNpZfOKHXCtHLlSqtdu3a2iwMAaUUdh51NLbIKso0bNy503qyG2fr161uFChVszZo1MdP1vFGjRglfo+lFmb9KlSruEVa3bt0dLjuQClXyVPQASivqOOxMhbXIlogbwCpXrmzt2rWzOXPmxLSc6nmnTp0SvkbTw/PLv//976TzAwAAoPTKejcDdQHo16+ftW/f3jp06GATJkywLVu2uNENpG/fvtakSRPX91UGDRpkXbp0sdtvv9169OhhTz75pH344Yd2//33Z3lNAAAAUObCbK9evWzdunU2fPhwdxNXmzZtbPbs2dGbvFasWOFGOAh07tzZHn/8cbv++uvtuuuus3333deNZHDQQQdlcS2AWOraorGT47u4AEBpQB2HkqRcJJUxDwAAAIASKOs/mgAAAAAUF2EWAAAA3iLMAgAAwFuEWZRpy5cvdz+esXjxYiuJcnJy3AgfJdFDDz3EmM1AMR155JF2xRVXeFtXleS6CWUPYRYp06gTF198se25557uDlb9UEW3bt3sv//9b0bLoQpdI1hk0tdff+2Gi9tjjz3cuu+9997Wu3dvNyycL9J9MNRIJF9++WValgWUBuedd577jl100UX5/nbppZe6v2keefbZZ23UqFEpL1u/tvXjjz9GR+4Jvs/BQ+O2N2/e3G6++eaUfss+E3Vq/HL/+OMPV29quM1PPvkkOo8eH3zwQcxrt23bFv2lzrfeeivtZUPpQphFyk477TRbtGiRPfzw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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Сравнение V-measure\n", "plt.figure(figsize=(8, 5))\n", "plt.bar(['Spectral Co-clustering', 'MiniBatchKMeans'], \n", " [v_measure_score(y_cocluster, y_true), v_measure_score(y_kmeans, y_true)])\n", "plt.title('Сравнение методов кластеризации по V-measure')\n", "plt.ylabel('V-measure')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "b764e10c-184e-4fe2-be3b-41b684e93c4c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "ddb23f5d-791f-49cb-a044-e0a68153a0d5", "metadata": {}, "source": [ "## 2. Работа с внешним датасетом \n", "\n", "### 2.1 Загрузка и подготовка данных\n" ] }, { "cell_type": "code", "execution_count": 28, "id": "d3aca8eb-11d9-4236-9726-1be6ba5ae44d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Patient_IDAgeGenderSmoking_StatusYears_SmokingCigarettes_Per_DaySecondhand_Smoke_ExposureOccupation_ExposureAir_Pollution_LevelFamily_History...Diet_QualityRegionIncome_LevelEducation_LevelAccess_to_HealthcareScreening_FrequencyChronic_Lung_DiseaseLung_Cancer_StageDiagnosis_YearSurvival_Status
0P10000076FemaleNever637LowDiesel FumesLowYes...PoorWestMiddleTertiaryGoodRegularlyNoStage II2008Alive
1P10000139MaleNever3039LowSilicaLowYes...AverageNorthMiddlePrimaryPoorOccasionallyYesNaN2002Alive
2P10000285MaleFormer4714HighAsbestosLowYes...GoodSouthHighTertiaryAverageRegularlyNoStage II2007Deceased
3P10000345FemaleCurrent4532MediumSilicaHighNo...GoodWestLowSecondaryAverageNeverYesNaN2011Alive
4P10000448FemaleNever4626MediumSilicaLowNo...GoodNorthLowTertiaryAverageRegularlyNoNaN2016Alive
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " Patient_ID Age Gender Smoking_Status Years_Smoking Cigarettes_Per_Day \\\n", "0 P100000 76 Female Never 6 37 \n", "1 P100001 39 Male Never 30 39 \n", "2 P100002 85 Male Former 47 14 \n", "3 P100003 45 Female Current 45 32 \n", "4 P100004 48 Female Never 46 26 \n", "\n", " Secondhand_Smoke_Exposure Occupation_Exposure Air_Pollution_Level \\\n", "0 Low Diesel Fumes Low \n", "1 Low Silica Low \n", "2 High Asbestos Low \n", "3 Medium Silica High \n", "4 Medium Silica Low \n", "\n", " Family_History ... Diet_Quality Region Income_Level Education_Level \\\n", "0 Yes ... Poor West Middle Tertiary \n", "1 Yes ... Average North Middle Primary \n", "2 Yes ... Good South High Tertiary \n", "3 No ... Good West Low Secondary \n", "4 No ... Good North Low Tertiary \n", "\n", " Access_to_Healthcare Screening_Frequency Chronic_Lung_Disease \\\n", "0 Good Regularly No \n", "1 Poor Occasionally Yes \n", "2 Average Regularly No \n", "3 Average Never Yes \n", "4 Average Regularly No \n", "\n", " Lung_Cancer_Stage Diagnosis_Year Survival_Status \n", "0 Stage II 2008 Alive \n", "1 NaN 2002 Alive \n", "2 Stage II 2007 Deceased \n", "3 NaN 2011 Alive \n", "4 NaN 2016 Alive \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", "from sklearn.cluster import SpectralCoclustering\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "df = pd.read_csv(\"Lung_Cancer_Trends_Realistic.csv\")\n", "\n", "# Посмотрим на структуру данных\n", "df.head()" ] }, { "cell_type": "markdown", "id": "fbaa5791-49c3-483b-8a05-fd9e9355137c", "metadata": {}, "source": [ "### 2.2 Очистка данных" ] }, { "cell_type": "code", "execution_count": 24, "id": "bf3c8140-269c-4a4d-8de6-96e954e3e9c5", "metadata": {}, "outputs": [], "source": [ "# Удалим строки с пропущенными значениями\n", "df_clean = df.dropna()\n", "\n", "# Отделим категориальные и числовые признаки\n", "categorical_cols = df_clean.select_dtypes(include=[\"object\", \"category\"]).columns\n", "numeric_cols = df_clean.select_dtypes(include=[\"int64\", \"float64\"]).columns\n", "\n", "# One-Hot Encoding для категориальных признаков\n", "encoder = OneHotEncoder(sparse_output=False)\n", "encoded_cat = encoder.fit_transform(df_clean[categorical_cols])\n", "\n", "# Масштабирование числовых признаков\n", "scaler = StandardScaler()\n", "scaled_num = scaler.fit_transform(df_clean[numeric_cols])\n", "\n", "# Объединяем\n", "X = np.hstack([scaled_num, encoded_cat])" ] }, { "cell_type": "markdown", "id": "29b63bd0-181b-4c1f-a4c6-0b107eab164d", "metadata": {}, "source": [ "### 2.3 Обучение модели" ] }, { "cell_type": "code", "execution_count": 18, "id": "1de28a36-b569-4b7e-9d7e-216f58936961", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
SpectralCoclustering(n_clusters=5, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "SpectralCoclustering(n_clusters=5, random_state=42)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n_clusters = 5 # количество кластеров, можно изменить\n", "model = SpectralCoclustering(n_clusters=n_clusters, random_state=42)\n", "model.fit(X)" ] }, { "cell_type": "markdown", "id": "0dcc3335-3a64-448c-8c7a-7144974f52ca", "metadata": {}, "source": [ "### 2.4 Присвоение кластеров" ] }, { "cell_type": "code", "execution_count": 25, "id": "60a41ec0-ddfb-4a3f-818e-06f7a5dcda0f", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\user\\AppData\\Local\\Temp\\ipykernel_8300\\3849030686.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " df_clean[\"Cluster\"] = model.row_labels_\n" ] } ], "source": [ "df_clean[\"Cluster\"] = model.row_labels_" ] }, { "cell_type": "markdown", "id": "72e8393e-f745-4b5e-9b6d-a5a31b317e1e", "metadata": {}, "source": [ "### 2.5 Визуализация результатов" ] }, { "cell_type": "code", "execution_count": 26, "id": "696afb4c-e7a9-4182-8fef-4d97f03a49f6", "metadata": {}, "outputs": [ { "data": { "image/png": "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d+/eYty4caJkyZJhOychJMJoccjmzZu1AgUKaLfccov2+OOPa88//7xc8LtUqVJawYIFtS1btpimHThwoPbf//5XiybOnTunzZo1y3TfDz/8oH300UfagQMH5P9du3ZpAwYM0J588klt6dKlEctTamqq5fbffvstYNrvv/9eGzNmjPbUU09pTz/9tDZx4kTt559/1iLJmTNntJUrV2pnz56V/0+fPq299tprMh979uzRop1y5copP6MTJ07I+7Xiq6++0kaNGqWtW7fO+57uv/9+rVWrVtr7778f0rX++usvmd/k5GQto3Hjxg2f/xs3btTWrFkj7zkYx48f1xYuXKhNmzZNLviNbYHYunWrFk569eqlHTt2TIsFMmI5+vPPP7Xu3btrpUuX1nr27Kldu3ZN1oOZMmXSMmfOrN1zzz3ahQsXTNNeunRJps2SJYuWkJCgFS1aVC74jW2PPfaYlpKSclM6nPu2227Txo0bF/K7R178F7yPxMREbdOmTd5tTkD7hXv258cff9RKlCgh91WvXl07cuSIXOfKlUvLnTu3bN/Rzpvx+eefy2eq8+6778pnjXMVKlQoYB0IpkyZorVo0UJ7+OGHtRUrVvjsQ7uButis3Rs2bJiWM2dOeR0seOZYypQpoy1evNj2Mzl//rz273//W/vHP/6hffDBB5Zl341ypFKW8E7NFpSjBQsWeP874fr16wHlDtTZkJF0ueXq1auynHz66aeyXYzG+gjvCO3KZ599ps2dO1e2A2lpaSE9k+XLl2sffvih9t13393UbtkBzyaYPKdfC98yZE4s+G2nPSSxS1wql/Xr19f69+9v+iFiG/Y1aNDANK1eMVesWFEqH8EEv/RQDKwa4Pnz58uGAA0mGlxUIPnz59datmwpFQLsmzNnju3rHDx4UFZGO3futDwGjRUa3ezZs8vGCMqIsdJCZWSWV3Dy5EntzjvvlPvRiGFdp04drXjx4jKvaJytQGNgrKx+/fVX7cUXX5SN4MiRI2XerYAAlC9fPvluIZSgksY7wTtGI5kjRw5t27ZtAdP/61//0l544QW54De2BeKLL76wbJwD8c4775gueD4jRozw/g9nOQJQdPBO8D7y5s2rzZ49W8uTJ4/Wt29faajAM8J9m/H6669rly9flr9RFoYOHaplzZrV+5579+4dtKFxaqwIh6HCrjD3xx9/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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fit_data = X[np.argsort(model.row_labels_)]\n", "plt.figure(figsize=(12, 6))\n", "sns.heatmap(fit_data, cmap=\"viridis\", cbar=True)\n", "plt.title(\"Спектральное ко-кластеризованное представление данных\")\n", "plt.xlabel(\"Признаки\")\n", "plt.ylabel(\"Объекты (переставлены по кластеру)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "01e38c78-7641-4390-88c6-6a9a69d3ec46", "metadata": {}, "source": [ "### 2.6 Вывод информации о кластерах" ] }, { "cell_type": "code", "execution_count": 27, "id": "a378a466-7641-4d5f-bc12-810a754165ce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Bicluster 0 : 204 objects, 343 features\n", "Top features: Patient_ID_P100000, Patient_ID_P100002, Patient_ID_P100006, Patient_ID_P100013, Patient_ID_P100035, Patient_ID_P100056, Patient_ID_P100066, Patient_ID_P100079, Patient_ID_P100081, Patient_ID_P100091\n", "\n", "Bicluster 1 : 0 objects, 1 features\n", "Top features: BMI\n", "\n", "Bicluster 2 : 97 objects, 10 features\n", "Top features: Years_Smoking, Cigarettes_Per_Day, Gender_Female, Occupation_Exposure_Silica, Air_Pollution_Level_High, Family_History_No, Physical_Activity_Level_Low, Region_West, Access_to_Healthcare_Good, Lung_Cancer_Stage_Stage I\n", "\n", "Bicluster 3 : 0 objects, 1 features\n", "Top features: Diagnosis_Year\n", "\n", "Bicluster 4 : 0 objects, 1 features\n", "Top features: Age\n" ] } ], "source": [ "feature_names = list(numeric_cols) + list(encoder.get_feature_names_out(categorical_cols))\n", "\n", "for i in range(n_clusters):\n", " row_idx = np.where(model.row_labels_ == i)[0]\n", " col_idx = np.where(model.column_labels_ == i)[0]\n", "\n", " # Показываем информацию о кластере\n", " print(f\"\\nBicluster {i} : {len(row_idx)} objects, {len(col_idx)} features\")\n", " \n", " # Важнейшие признаки (топ-10)\n", " top_features = [feature_names[j] for j in col_idx[:10]]\n", " print(\"Top features:\", \", \".join(top_features))\n", "\n", " # Распределение категорий (если имеется колонка 'Category' или что-то похожее)\n", " if 'Category' in df_clean.columns:\n", " cluster_labels = df_clean.loc[df_clean[\"Cluster\"] == i, \"Category\"]\n", " print(f\"Category distribution for Bicluster {i}:\")\n", " print(cluster_labels.value_counts(normalize=True).head())" ] }, { "cell_type": "markdown", "id": "cbf8dd70-eddc-456d-8a2d-97482264c234", "metadata": {}, "source": [ "## Интерпретация результатов\n", "\n", "1. **На встроенном датасете (20 newsgroups):**\n", " - Spectral Co-clustering показал лучшие результаты (V-measure=0.4415) по сравнению с MiniBatchKMeans (V-measure=0.3015)\n", " - Алгоритм смог найти осмысленные бикластеры, объединяющие документы по темам и характерные для них слова\n", "\n", "2. **На внешнем датасете:**\n", " - Алгоритм Spectral Co-clustering выделил группы пациентов и признаки, которые часто встречаются вместе. Например, один кластер может соответствовать группе людей с высоким уровнем курения и одновременно низкой физической активностью.\n", "\n", " - Выделенные бикластеры помогают выявить взаимосвязи между определёнными признаками риска и группами наблюдений.\n", "\n", " - Однако, интерпретация результатов требует медицинского контекста — значения кластеров следует сопоставлять с экспертными знаниями о факторах риска (например, влияние курения, алкоголя, активности и других переменных на здоровье).\n", "\n", "3. **Выводы**\n", " - Spectral Co-clustering эффективен для задач совместной кластеризации строк и столбцов матрицы данных\n", " - Особенно полезен для текстовых данных, где можно одновременно кластеризовать документы и слова\n", " - Требует настройки параметров (количество кластеров, метод SVD) для оптимальной работы" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.3" } }, "nbformat": 4, "nbformat_minor": 5 }