You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/ru/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb

499 lines
38 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Нигерийская музыка, собранная со Spotify - анализ**\n",
"\n",
"Кластеризация — это вид [обучения без учителя](https://wikipedia.org/wiki/Unsupervised_learning), который предполагает, что набор данных не имеет меток или что его входные данные не связаны с заранее определенными выходными. Она использует различные алгоритмы для обработки немаркированных данных и группировки их на основе выявленных закономерностей.\n",
"\n",
"[**Тест перед лекцией**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Введение**\n",
"\n",
"[Кластеризация](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) очень полезна для исследования данных. Давайте посмотрим, может ли она помочь выявить тенденции и закономерности в том, как нигерийская аудитория потребляет музыку.\n",
"\n",
"> ✅ Подумайте минуту о применении кластеризации. В реальной жизни кластеризация происходит, когда у вас есть куча белья, и вы сортируете одежду членов семьи 🧦👕👖🩲. В науке о данных кластеризация используется для анализа предпочтений пользователей или определения характеристик любого немаркированного набора данных. Кластеризация, в некотором смысле, помогает навести порядок в хаосе, как в ящике с носками.\n",
"\n",
"В профессиональной среде кластеризация может использоваться для таких задач, как сегментация рынка, определение возрастных групп, покупающих определенные товары. Другой пример — обнаружение аномалий, например, для выявления мошенничества в наборе данных о транзакциях по кредитным картам. Или вы можете использовать кластеризацию для определения опухолей в серии медицинских снимков.\n",
"\n",
"✅ Подумайте минуту, как вы могли сталкиваться с кластеризацией в реальной жизни, например, в банковской сфере, электронной коммерции или бизнесе.\n",
"\n",
"> 🎓 Интересно, что анализ кластеров возник в области антропологии и психологии в 1930-х годах. Как вы думаете, как он мог использоваться тогда?\n",
"\n",
"Кроме того, кластеризацию можно использовать для группировки результатов поиска — например, по ссылкам на покупки, изображениям или отзывам. Кластеризация полезна, когда у вас есть большой набор данных, который вы хотите уменьшить и на котором хотите провести более детальный анализ. Таким образом, этот метод помогает изучить данные перед созданием других моделей.\n",
"\n",
"✅ После того как ваши данные организованы в кластеры, вы присваиваете им идентификатор кластера. Этот метод может быть полезен для сохранения конфиденциальности набора данных: вместо использования более раскрывающих данных вы можете ссылаться на точку данных по ее идентификатору кластера. Можете ли вы придумать другие причины, по которым вы бы использовали идентификатор кластера вместо других элементов кластера для его идентификации?\n",
"\n",
"### Начало работы с кластеризацией\n",
"\n",
"> 🎓 То, как мы создаем кластеры, во многом зависит от того, как мы группируем точки данных. Давайте разберем несколько терминов:\n",
">\n",
"> 🎓 ['Трансдуктивный' vs. 'индуктивный'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Трансдуктивный вывод основывается на наблюдаемых обучающих примерах, которые сопоставляются с конкретными тестовыми случаями. Индуктивный вывод основывается на обучающих примерах, которые формируют общие правила, применяемые затем к тестовым случаям.\n",
">\n",
"> Пример: Представьте, что у вас есть набор данных, который частично размечен. Некоторые элементы — это 'пластинки', некоторые — 'CD', а некоторые не имеют меток. Ваша задача — присвоить метки пустым элементам. Если вы выберете индуктивный подход, вы обучите модель на 'пластинках' и 'CD' и примените эти метки к немаркированным данным. Этот подход может столкнуться с трудностями при классификации элементов, которые на самом деле являются 'кассетами'. Трансдуктивный подход, напротив, более эффективно справляется с неизвестными данными, группируя похожие элементы вместе и затем присваивая метку группе. В этом случае кластеры могут отражать 'круглые музыкальные вещи' и 'квадратные музыкальные вещи'.\n",
">\n",
"> 🎓 ['Неплоская' vs. 'плоская' геометрия](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Этот термин происходит из математики и относится к измерению расстояний между точками с использованием либо 'плоской' ([евклидовой](https://wikipedia.org/wiki/Euclidean_geometry)), либо 'неплоской' (неевклидовой) геометрии.\n",
">\n",
"> 'Плоская' геометрия относится к евклидовой геометрии (части которой изучаются как 'планиметрия'), а 'неплоская' — к неевклидовой геометрии. Как геометрия связана с машинным обучением? Поскольку обе области основаны на математике, должен быть общий способ измерения расстояний между точками в кластерах, и это можно сделать 'плоским' или 'неплоским' способом, в зависимости от природы данных. [Евклидовы расстояния](https://wikipedia.org/wiki/Euclidean_distance) измеряются как длина отрезка между двумя точками. [Неевклидовы расстояния](https://wikipedia.org/wiki/Non-Euclidean_geometry) измеряются вдоль кривой. Если ваши данные, визуализированные, не лежат на плоскости, вам может понадобиться специализированный алгоритм для их обработки.\n",
"\n",
"<p >\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Инфографика от Дасани Мадипалли</figcaption>\n",
"\n",
"\n",
"\n",
"> 🎓 ['Расстояния'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Кластеры определяются их матрицей расстояний, например, расстояниями между точками. Эти расстояния можно измерять несколькими способами. Евклидовы кластеры определяются средним значением точек и содержат 'центроид' или центральную точку. Расстояния измеряются относительно этого центроида. Неевклидовы расстояния относятся к 'кластроидам', точке, ближайшей к другим точкам. Кластроиды, в свою очередь, могут определяться различными способами.\n",
">\n",
"> 🎓 ['Ограниченная кластеризация'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Ограниченная кластеризация](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) вводит 'полу-контролируемое' обучение в этот метод без учителя. Отношения между точками помечаются как 'нельзя связать' или 'должно быть связано', что накладывает определенные правила на набор данных.\n",
">\n",
"> Пример: Если алгоритм работает с немаркированными или частично маркированными данными, полученные кластеры могут быть низкого качества. В приведенном выше примере кластеры могут группировать 'круглые музыкальные вещи', 'квадратные музыкальные вещи', 'треугольные вещи' и 'печенье'. Если задать некоторые ограничения или правила (\"предмет должен быть из пластика\", \"предмет должен воспроизводить музыку\"), это поможет алгоритму делать более точные выборы.\n",
">\n",
"> 🎓 'Плотность'\n",
">\n",
"> Данные, которые содержат много шума, считаются 'плотными'. Расстояния между точками в каждом из кластеров могут быть более или менее плотными, или 'переполненными', и такие данные требуют анализа с использованием подходящего метода кластеризации. [Эта статья](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) демонстрирует разницу между использованием алгоритмов K-Means и HDBSCAN для исследования шумных данных с неравномерной плотностью кластеров.\n",
"\n",
"Углубите свои знания о методах кластеризации в этом [модуле обучения](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott).\n",
"\n",
"### **Алгоритмы кластеризации**\n",
"\n",
"Существует более 100 алгоритмов кластеризации, и их выбор зависит от природы данных. Рассмотрим основные из них:\n",
"\n",
"- **Иерархическая кластеризация**. Если объект классифицируется по его близости к другому объекту, а не к более удаленному, кластеры формируются на основе расстояний между их членами. Иерархическая кластеризация характеризуется повторным объединением двух кластеров.\n",
"\n",
"<p >\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Инфографика от Дасани Мадипалли</figcaption>\n",
"\n",
"\n",
"\n",
"- **Кластеризация по центроидам**. Этот популярный алгоритм требует выбора 'k', или количества кластеров, после чего алгоритм определяет центральную точку кластера и группирует данные вокруг нее. [Кластеризация K-средних](https://wikipedia.org/wiki/K-means_clustering) — популярная версия кластеризации по центроидам, которая разделяет набор данных на заранее определенные K группы. Центр определяется ближайшим средним значением, отсюда и название. Квадратное расстояние от кластера минимизируется.\n",
"\n",
"<p >\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Инфографика от Дасани Мадипалли</figcaption>\n",
"\n",
"\n",
"\n",
"- **Кластеризация на основе распределения**. Основанная на статистическом моделировании, кластеризация на основе распределения фокусируется на определении вероятности того, что точка данных принадлежит кластеру, и присваивает ее соответствующим образом. Методы гауссовой смеси относятся к этому типу.\n",
"\n",
"- **Кластеризация на основе плотности**. Точки данных группируются в кластеры на основе их плотности, или их близости друг к другу. Точки данных, находящиеся далеко от группы, считаются выбросами или шумом. DBSCAN, Mean-shift и OPTICS относятся к этому типу кластеризации.\n",
"\n",
"- **Кластеризация на основе сетки**. Для многомерных наборов данных создается сетка, и данные распределяются по ячейкам этой сетки, создавая кластеры.\n",
"\n",
"Лучший способ изучить кластеризацию — попробовать ее самостоятельно, и именно это вы сделаете в этом упражнении.\n",
"\n",
"Для выполнения этого модуля нам понадобятся некоторые пакеты. Вы можете установить их с помощью команды: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`.\n",
"\n",
"Или используйте следующий скрипт, который проверяет наличие необходимых пакетов и устанавливает их, если они отсутствуют.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## Упражнение - кластеризация данных\n",
"\n",
"Кластеризация как метод значительно выигрывает от правильной визуализации, поэтому начнем с визуализации наших музыкальных данных. Это упражнение поможет нам определить, какой из методов кластеризации будет наиболее эффективно использоваться для данного типа данных.\n",
"\n",
"Начнем с импорта данных.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core tidyverse and make it available in your current R session\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# Import the data into a tibble\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
"\r\n",
"# View the first 5 rows of the data set\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Иногда нам может понадобиться немного больше информации о наших данных. Мы можем посмотреть на `данные` и `их структуру`, используя функцию [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Glimpse into the data set\r\n",
"df %>% \r\n",
" glimpse()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Отличная работа!💪\n",
"\n",
"Мы можем заметить, что `glimpse()` покажет общее количество строк (наблюдений) и столбцов (переменных), а затем первые несколько записей каждой переменной в строке после имени переменной. Кроме того, *тип данных* переменной указан сразу после имени переменной внутри `< >`.\n",
"\n",
"`DataExplorer::introduce()` может аккуратно обобщить эту информацию:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Отлично! Мы только что узнали, что в наших данных нет пропущенных значений.\n",
"\n",
"Пока мы этим занимаемся, можем изучить общие статистики центральной тенденции (например, [среднее](https://en.wikipedia.org/wiki/Arithmetic_mean) и [медиана](https://en.wikipedia.org/wiki/Median)) и меры разброса (например, [стандартное отклонение](https://en.wikipedia.org/wiki/Standard_deviation)) с помощью `summarytools::descr()`.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe common statistics\r\n",
"df %>% \r\n",
" descr(stats = \"common\")\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Давайте посмотрим на общие значения данных. Обратите внимание, что популярность может быть `0`, что показывает песни без рейтинга. Мы скоро удалим их.\n",
"\n",
"> 🤔 Если мы работаем с кластеризацией, методом без учителя, который не требует размеченных данных, почему мы показываем эти данные с метками? На этапе исследования данных они полезны, но для работы алгоритмов кластеризации они не обязательны.\n",
"\n",
"### 1. Исследуем популярные жанры\n",
"\n",
"Давайте выясним самые популярные жанры 🎶, подсчитав количество их упоминаний.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Popular genres\r\n",
"top_genres <- df %>% \r\n",
" count(artist_top_genre, sort = TRUE) %>% \r\n",
"# Encode to categorical and reorder the according to count\r\n",
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
"\r\n",
"# Print the top genres\r\n",
"top_genres\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Это было здорово! Говорят, одна картинка стоит тысячи строк датафрейма (хотя, если честно, никто так не говорит 😅). Но вы поняли суть, верно?\n",
"\n",
"Один из способов визуализации категориальных данных (переменных типа character или factor) — это использование столбчатых диаграмм. Давайте построим столбчатую диаграмму для 10 самых популярных жанров:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Change the default gray theme\r\n",
"theme_set(theme_light())\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Теперь гораздо проще определить, что у нас есть `отсутствующие` жанры 🧐!\n",
"\n",
"> Хорошая визуализация покажет вам то, чего вы не ожидали, или поднимет новые вопросы о данных - Хэдли Уикхэм и Гаррет Гролемунд, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Обратите внимание: если основной жанр описан как `Missing`, это означает, что Spotify его не классифицировал, так что давайте избавимся от него.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" filter(artist_top_genre != \"Missing\") %>% \r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Из небольшого исследования данных мы узнали, что три ведущих жанра доминируют в этом наборе данных. Давайте сосредоточимся на `afro dancehall`, `afropop` и `nigerian pop`, а также отфильтруем набор данных, чтобы удалить все записи с популярностью, равной 0 (это означает, что они не были классифицированы по популярности в наборе данных и могут считаться шумом для наших целей):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"nigerian_songs <- df %>% \r\n",
" # Concentrate on top 3 genres\r\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
" # Remove unclassified observations\r\n",
" filter(popularity != 0)\r\n",
"\r\n",
"\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"nigerian_songs %>%\r\n",
" count(artist_top_genre) %>%\r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Давайте посмотрим, существует ли очевидная линейная связь между числовыми переменными в нашем наборе данных. Эта связь количественно оценивается с помощью [статистики корреляции](https://en.wikipedia.org/wiki/Correlation).\n",
"\n",
"Статистика корреляции — это значение в диапазоне от -1 до 1, которое указывает на силу связи. Значения выше 0 указывают на *положительную* корреляцию (высокие значения одной переменной, как правило, совпадают с высокими значениями другой), тогда как значения ниже 0 указывают на *отрицательную* корреляцию (высокие значения одной переменной, как правило, совпадают с низкими значениями другой).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Narrow down to numeric variables and fid correlation\r\n",
"corr_mat <- nigerian_songs %>% \r\n",
" select(where(is.numeric)) %>% \r\n",
" cor()\r\n",
"\r\n",
"# Visualize correlation matrix\r\n",
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Данные не имеют сильной корреляции, за исключением связи между `energy` и `loudness`, что логично, поскольку громкая музыка обычно довольно энергичная. `Popularity` имеет связь с `release date`, что также понятно, так как более новые песни, вероятно, более популярны. Также кажется, что длина и энергия имеют корреляцию.\n",
"\n",
"Будет интересно посмотреть, что алгоритм кластеризации сможет извлечь из этих данных!\n",
"\n",
"> 🎓 Помните, что корреляция не означает причинно-следственной связи! У нас есть доказательства корреляции, но нет доказательств причинности. [Забавный веб-сайт](https://tylervigen.com/spurious-correlations) содержит визуализации, которые подчеркивают эту мысль.\n",
"\n",
"### 2. Изучение распределения данных\n",
"\n",
"Давайте зададим более тонкие вопросы. Сильно ли различаются жанры в восприятии их танцевальности в зависимости от их популярности? Давайте исследуем распределение данных по популярности и танцевальности для наших трех ведущих жанров вдоль заданных осей x и y, используя [графики плотности](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Perform 2D kernel density estimation\r\n",
"density_estimate_2d <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
" geom_density_2d(bins = 5, size = 1) +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" xlim(-20, 80) +\r\n",
" ylim(0, 1.2)\r\n",
"\r\n",
"# Density plot based on the popularity\r\n",
"density_estimate_pop <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" theme(legend.position = \"none\")\r\n",
"\r\n",
"# Density plot based on the danceability\r\n",
"density_estimate_dance <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
"\r\n",
"\r\n",
"# Patch everything together\r\n",
"library(patchwork)\r\n",
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Мы видим, что существуют концентрические круги, которые совпадают, независимо от жанра. Может ли быть так, что вкусы нигерийцев сходятся на определённом уровне танцевальности для этого жанра?\n",
"\n",
"В целом, три жанра совпадают по популярности и танцевальности. Определение кластеров в этих слабо упорядоченных данных будет сложной задачей. Давайте посмотрим, сможет ли диаграмма рассеяния подтвердить это.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# A scatter plot of popularity and danceability\r\n",
"scatter_plot <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
" geom_point(size = 2, alpha = 0.8) +\r\n",
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
"\r\n",
"# Add a touch of interactivity\r\n",
"ggplotly(scatter_plot)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Точечный график тех же осей показывает схожую картину сходимости.\n",
"\n",
"В целом, для кластеризации вы можете использовать точечные графики, чтобы показать кластеры данных, поэтому освоение этого типа визуализации очень полезно. В следующем уроке мы возьмем эти отфильтрованные данные и применим кластеризацию методом k-средних, чтобы обнаружить группы в этих данных, которые пересекаются интересным образом.\n",
"\n",
"## **🚀 Задание**\n",
"\n",
"В рамках подготовки к следующему уроку создайте диаграмму о различных алгоритмах кластеризации, которые вы можете обнаружить и использовать в производственной среде. Какие проблемы пытается решить кластеризация?\n",
"\n",
"## [**Тест после лекции**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Обзор и самостоятельное изучение**\n",
"\n",
"Прежде чем применять алгоритмы кластеризации, как мы уже узнали, важно понять природу вашего набора данных. Подробнее об этом можно прочитать [здесь](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)\n",
"\n",
"Углубите свои знания о методах кластеризации:\n",
"\n",
"- [Обучение и оценка моделей кластеризации с использованием Tidymodels и других инструментов](https://rpubs.com/eR_ic/clustering)\n",
"\n",
"- Брэдли Бёмке и Брэндон Гринвелл, [*Практическое машинное обучение с R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
"\n",
"## **Задание**\n",
"\n",
"[Изучите другие способы визуализации кластеризации](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## СПАСИБО:\n",
"\n",
"[Джен Лупер](https://www.twitter.com/jenlooper) за создание оригинальной версии этого модуля на Python ♥️\n",
"\n",
"[`Дасани Мадипалли`](https://twitter.com/dasani_decoded) за создание потрясающих иллюстраций, которые делают концепции машинного обучения более понятными и легкими для восприятия.\n",
"\n",
"Счастливого обучения,\n",
"\n",
"[Эрик](https://twitter.com/ericntay), Золотой посол Microsoft Learn.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.\n"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "99c36449cad3708a435f6798cfa39972",
"translation_date": "2025-08-29T23:29:02+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "ru"
}
},
"nbformat": 4,
"nbformat_minor": 1
}