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.
642 lines
27 KiB
642 lines
27 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"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"
|
|
},
|
|
"colab": {
|
|
"name": "lesson_14.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": [],
|
|
"toc_visible": true
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "ad65fb4aad0a156b42216e4929f490fc",
|
|
"translation_date": "2025-09-06T14:28:43+00:00",
|
|
"source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb",
|
|
"language_code": "sw"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "GULATlQXLXyR"
|
|
},
|
|
"source": [
|
|
"## Chunguza K-Means clustering kwa kutumia R na kanuni za data safi.\n",
|
|
"\n",
|
|
"### [**Jaribio la kabla ya somo**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n",
|
|
"\n",
|
|
"Katika somo hili, utajifunza jinsi ya kuunda makundi kwa kutumia kifurushi cha Tidymodels na vifurushi vingine katika mfumo wa R (tutaviita marafiki 🧑🤝🧑), pamoja na seti ya data ya muziki wa Nigeria uliyoingiza awali. Tutashughulikia misingi ya K-Means kwa Clustering. Kumbuka kwamba, kama ulivyojifunza katika somo la awali, kuna njia nyingi za kufanya kazi na makundi, na mbinu unayotumia inategemea data yako. Tutajaribu K-Means kwa kuwa ni mbinu ya kawaida zaidi ya clustering. Twende kazi!\n",
|
|
"\n",
|
|
"Maneno utakayojifunza:\n",
|
|
"\n",
|
|
"- Alama ya Silhouette\n",
|
|
"\n",
|
|
"- Njia ya Elbow\n",
|
|
"\n",
|
|
"- Inertia\n",
|
|
"\n",
|
|
"- Variance\n",
|
|
"\n",
|
|
"### **Utangulizi**\n",
|
|
"\n",
|
|
"[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) ni mbinu inayotokana na uwanja wa usindikaji wa ishara. Inatumika kugawanya na kupanga vikundi vya data katika `k clusters` kulingana na kufanana kwa sifa zao.\n",
|
|
"\n",
|
|
"Makundi yanaweza kuonyeshwa kama [Voronoi diagrams](https://wikipedia.org/wiki/Voronoi_diagram), ambayo yanajumuisha nukta (au 'mbegu') na eneo lake linalohusiana.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/voronoi.png\"\n",
|
|
" width=\"500\"/>\n",
|
|
" <figcaption>Infographic na Jen Looper</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"Hatua za K-Means clustering ni kama ifuatavyo:\n",
|
|
"\n",
|
|
"1. Mwanasayansi wa data huanza kwa kutaja idadi ya makundi yanayotakiwa kuundwa.\n",
|
|
"\n",
|
|
"2. Kisha, algoriti huchagua kwa nasibu K uchunguzi kutoka seti ya data ili kutumika kama vituo vya awali vya makundi (yaani, centroids).\n",
|
|
"\n",
|
|
"3. Kisha, kila uchunguzi uliobaki unagawiwa kwa centroid yake ya karibu zaidi.\n",
|
|
"\n",
|
|
"4. Kisha, wastani mpya wa kila kundi unahesabiwa na centroid inahamishwa hadi wastani huo.\n",
|
|
"\n",
|
|
"5. Sasa kwamba vituo vimehesabiwa upya, kila uchunguzi unakaguliwa tena ili kuona kama unaweza kuwa karibu na kundi tofauti. Vitu vyote vinagawiwa tena kwa kutumia wastani wa makundi uliosasishwa. Hatua za kugawa makundi na kusasisha centroid hurudiwa mara kwa mara hadi mgawanyo wa makundi usibadilike tena (yaani, wakati mchakato unafikia muafaka). Kwa kawaida, algoriti hukoma wakati kila mzunguko mpya husababisha harakati ndogo za centroids na makundi yanakuwa thabiti.\n",
|
|
"\n",
|
|
"<div>\n",
|
|
"\n",
|
|
"> Kumbuka kwamba kutokana na nasibu ya uchunguzi wa awali wa k uliotumika kama centroids za kuanzia, tunaweza kupata matokeo tofauti kidogo kila tunapotekeleza utaratibu. Kwa sababu hii, algoriti nyingi hutumia *mianzo ya nasibu* kadhaa na kuchagua mzunguko wenye WCSS ya chini zaidi. Kwa hivyo, inashauriwa sana kila mara kuendesha K-Means na thamani kadhaa za *nstart* ili kuepuka *muafaka usiofaa wa ndani.*\n",
|
|
"\n",
|
|
"</div>\n",
|
|
"\n",
|
|
"Uhuishaji huu mfupi ukitumia [mchoro](https://github.com/allisonhorst/stats-illustrations) wa Allison Horst unaelezea mchakato wa clustering:\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/kmeans.gif\"\n",
|
|
" width=\"550\"/>\n",
|
|
" <figcaption>Mchoro na @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Swali la msingi linalojitokeza katika clustering ni hili: unajuaje ni makundi mangapi ya kugawanya data yako? Changamoto moja ya kutumia K-Means ni kwamba utahitaji kuanzisha `k`, yaani idadi ya `centroids`. Kwa bahati nzuri, `njia ya elbow` husaidia kukadiria thamani nzuri ya kuanzia kwa `k`. Utajaribu muda si mrefu.\n",
|
|
"\n",
|
|
"### \n",
|
|
"\n",
|
|
"**Mahitaji ya awali**\n",
|
|
"\n",
|
|
"Tutaanza moja kwa moja kutoka pale tulipoishia katika [somo la awali](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), ambapo tulichambua seti ya data, tukafanya visualizations nyingi na kuchuja seti ya data kwa uchunguzi wa kuvutia. Hakikisha umeangalia!\n",
|
|
"\n",
|
|
"Tutahitaji vifurushi kadhaa ili kukamilisha moduli hii. Unaweza kuviweka kwa: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n",
|
|
"\n",
|
|
"Vinginevyo, script hapa chini hukagua kama una vifurushi vinavyohitajika kukamilisha moduli hii na kuvifunga kwako endapo vingine vinakosekana.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "ah_tBi58LXyi"
|
|
},
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"\n",
|
|
"pacman::p_load('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork')\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "7e--UCUTLXym"
|
|
},
|
|
"source": [
|
|
"Tuanzie kazi mara moja!\n",
|
|
"\n",
|
|
"## 1. Mdundo na data: Punguza hadi aina 3 maarufu zaidi za muziki\n",
|
|
"\n",
|
|
"Hii ni muhtasari wa kile tulichofanya katika somo lililopita. Hebu tukate na kuchambua data!\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Ycamx7GGLXyn"
|
|
},
|
|
"source": [
|
|
"# Load the core tidyverse and make it available in your current R session\n",
|
|
"library(tidyverse)\n",
|
|
"\n",
|
|
"# Import the data into a tibble\n",
|
|
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\", show_col_types = FALSE)\n",
|
|
"\n",
|
|
"# Narrow down to top 3 popular genres\n",
|
|
"nigerian_songs <- df %>% \n",
|
|
" # Concentrate on top 3 genres\n",
|
|
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \n",
|
|
" # Remove unclassified observations\n",
|
|
" filter(popularity != 0)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# Visualize popular genres using bar plots\n",
|
|
"theme_set(theme_light())\n",
|
|
"nigerian_songs %>%\n",
|
|
" count(artist_top_genre) %>%\n",
|
|
" ggplot(mapping = aes(x = artist_top_genre, y = n,\n",
|
|
" fill = artist_top_genre)) +\n",
|
|
" geom_col(alpha = 0.8) +\n",
|
|
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\n",
|
|
" ggtitle(\"Top genres\") +\n",
|
|
" theme(plot.title = element_text(hjust = 0.5))\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "b5h5zmkPLXyp"
|
|
},
|
|
"source": [
|
|
"🤩 Hilo lilifanikiwa vizuri!\n",
|
|
"\n",
|
|
"## 2. Uchunguzi zaidi wa data.\n",
|
|
"\n",
|
|
"Je, data hii ni safi kiasi gani? Hebu tuangalie data zisizo za kawaida kwa kutumia grafu za sanduku (box plots). Tutazingatia safu za nambari zenye data chache zisizo za kawaida (ingawa unaweza kusafisha data zisizo za kawaida). Grafu za sanduku zinaweza kuonyesha wigo wa data na zitasaidia kuchagua ni safu zipi za kutumia. Kumbuka, grafu za sanduku hazionyeshi tofauti (variance), kipengele muhimu cha data nzuri inayoweza kugawanyika katika makundi. Tafadhali angalia [mjadala huu](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) kwa maelezo zaidi.\n",
|
|
"\n",
|
|
"[Grafu za sanduku](https://en.wikipedia.org/wiki/Box_plot) hutumika kuonyesha kwa picha usambazaji wa data ya `nambari`, kwa hivyo hebu tuanze kwa *kuchagua* safu zote za nambari pamoja na aina maarufu za muziki.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "HhNreJKLLXyq"
|
|
},
|
|
"source": [
|
|
"# Select top genre column and all other numeric columns\n",
|
|
"df_numeric <- nigerian_songs %>% \n",
|
|
" select(artist_top_genre, where(is.numeric)) \n",
|
|
"\n",
|
|
"# Display the data\n",
|
|
"df_numeric %>% \n",
|
|
" slice_head(n = 5)\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "uYXrwJRaLXyq"
|
|
},
|
|
"source": [
|
|
"Tazama jinsi msaidizi wa kuchagua `where` unavyorahisisha hili 💁? Chunguza kazi nyingine kama hizi [hapa](https://tidyselect.r-lib.org/).\n",
|
|
"\n",
|
|
"Kwa kuwa tutakuwa tunatengeneza boxplot kwa kila kipengele cha nambari na tunataka kuepuka kutumia loops, hebu tuweke data yetu katika muundo *mrefu zaidi* ambao utatuwezesha kutumia `facets` - chati ndogo ambazo kila moja inaonyesha sehemu moja ya data.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "gd5bR3f8LXys"
|
|
},
|
|
"source": [
|
|
"# Pivot data from wide to long\n",
|
|
"df_numeric_long <- df_numeric %>% \n",
|
|
" pivot_longer(!artist_top_genre, names_to = \"feature_names\", values_to = \"values\") \n",
|
|
"\n",
|
|
"# Print out data\n",
|
|
"df_numeric_long %>% \n",
|
|
" slice_head(n = 15)\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "-7tE1swnLXyv"
|
|
},
|
|
"source": [
|
|
"Sasa ni muda wa `ggplots` zaidi! Kwa hivyo tutatumia `geom` gani?\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "r88bIsyuLXyy"
|
|
},
|
|
"source": [
|
|
"# Make a box plot\n",
|
|
"df_numeric_long %>% \n",
|
|
" ggplot(mapping = aes(x = feature_names, y = values, fill = feature_names)) +\n",
|
|
" geom_boxplot() +\n",
|
|
" facet_wrap(~ feature_names, ncol = 4, scales = \"free\") +\n",
|
|
" theme(legend.position = \"none\")\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "EYVyKIUELXyz"
|
|
},
|
|
"source": [
|
|
"Rahisi-gg!\n",
|
|
"\n",
|
|
"Sasa tunaweza kuona kuwa data hii ina kelele kidogo: kwa kuchunguza kila safu kama boxplot, unaweza kuona data zilizotengwa (outliers). Unaweza kupitia seti ya data na kuondoa data hizi zilizotengwa, lakini kufanya hivyo kutafanya data kuwa ndogo sana.\n",
|
|
"\n",
|
|
"Kwa sasa, hebu tuchague safu ambazo tutatumia kwa zoezi letu la kugawanya makundi. Hebu tuchague safu za nambari zenye viwango vinavyofanana. Tunaweza kubadilisha `artist_top_genre` kuwa nambari lakini kwa sasa tutaiacha.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "-wkpINyZLXy0"
|
|
},
|
|
"source": [
|
|
"# Select variables with similar ranges\n",
|
|
"df_numeric_select <- df_numeric %>% \n",
|
|
" select(popularity, danceability, acousticness, loudness, energy) \n",
|
|
"\n",
|
|
"# Normalize data\n",
|
|
"# df_numeric_select <- scale(df_numeric_select)\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "D7dLzgpqLXy1"
|
|
},
|
|
"source": [
|
|
"## 3. Kuhesabu k-means clustering katika R\n",
|
|
"\n",
|
|
"Tunaweza kuhesabu k-means katika R kwa kutumia kazi ya ndani `kmeans`, angalia `help(\"kmeans()\")`. Kazi ya `kmeans()` inakubali fremu ya data yenye safu zote za nambari kama hoja yake kuu.\n",
|
|
"\n",
|
|
"Hatua ya kwanza wakati wa kutumia k-means clustering ni kubainisha idadi ya makundi (k) ambayo yatatengenezwa katika suluhisho la mwisho. Tunajua kuna aina 3 za muziki ambazo tumechambua kutoka kwenye seti ya data, kwa hivyo hebu tujaribu 3:\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "uC4EQ5w7LXy5"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"# Kmeans clustering for 3 clusters\n",
|
|
"kclust <- kmeans(\n",
|
|
" df_numeric_select,\n",
|
|
" # Specify the number of clusters\n",
|
|
" centers = 3,\n",
|
|
" # How many random initial configurations\n",
|
|
" nstart = 25\n",
|
|
")\n",
|
|
"\n",
|
|
"# Display clustering object\n",
|
|
"kclust\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "hzfhscWrLXy-"
|
|
},
|
|
"source": [
|
|
"Kitu cha kmeans kina taarifa kadhaa ambazo zimeelezewa vizuri katika `help(\"kmeans()\")`. Kwa sasa, hebu tuzingatie chache. Tunaona kwamba data imegawanywa katika makundi 3 yenye ukubwa wa 65, 110, 111. Matokeo pia yanajumuisha vituo vya makundi (wastani) kwa makundi 3 katika vigezo 5.\n",
|
|
"\n",
|
|
"Vector ya clustering ni mgawanyo wa kundi kwa kila uchunguzi. Hebu tutumie kazi ya `augment` kuongeza mgawanyo wa kundi kwenye seti ya data ya awali.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "0XwwpFGQLXy_"
|
|
},
|
|
"source": [
|
|
"# Add predicted cluster assignment to data set\n",
|
|
"augment(kclust, df_numeric_select) %>% \n",
|
|
" relocate(.cluster) %>% \n",
|
|
" slice_head(n = 10)\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "NXIVXXACLXzA"
|
|
},
|
|
"source": [
|
|
"Perfect, tumegawanya seti yetu ya data katika vikundi 3. Sasa, je, makundi yetu ni mazuri kiasi gani 🤷? Hebu tuangalie `Silhouette score`\n",
|
|
"\n",
|
|
"### **Silhouette score**\n",
|
|
"\n",
|
|
"[Uchambuzi wa Silhouette](https://en.wikipedia.org/wiki/Silhouette_(clustering)) unaweza kutumika kuchunguza umbali wa kutenganisha kati ya makundi yaliyopatikana. Alama hii inatofautiana kutoka -1 hadi 1, na ikiwa alama iko karibu na 1, kundi ni lenye msongamano na limetenganishwa vizuri na makundi mengine. Thamani karibu na 0 inaonyesha makundi yanayofungamana na sampuli zikiwa karibu sana na mpaka wa maamuzi wa makundi jirani. [chanzo](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n",
|
|
"\n",
|
|
"Njia ya wastani ya silhouette inahesabu wastani wa silhouette wa uchunguzi kwa thamani tofauti za *k*. Alama ya wastani ya silhouette ya juu inaonyesha upangaji mzuri wa makundi.\n",
|
|
"\n",
|
|
"`silhouette` ni kazi katika kifurushi cha cluster inayotumika kuhesabu upana wa wastani wa silhouette.\n",
|
|
"\n",
|
|
"> Silhouette inaweza kuhesabiwa kwa kutumia kipimo chochote cha [umbali](https://en.wikipedia.org/wiki/Distance \"Distance\"), kama vile [umbali wa Euclidean](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") au [umbali wa Manhattan](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") ambao tulijadili katika [somo lililopita](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb).\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Jn0McL28LXzB"
|
|
},
|
|
"source": [
|
|
"# Load cluster package\n",
|
|
"library(cluster)\n",
|
|
"\n",
|
|
"# Compute average silhouette score\n",
|
|
"ss <- silhouette(kclust$cluster,\n",
|
|
" # Compute euclidean distance\n",
|
|
" dist = dist(df_numeric_select))\n",
|
|
"mean(ss[, 3])\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "QyQRn97nLXzC"
|
|
},
|
|
"source": [
|
|
"Alama yetu ni **.549**, kwa hivyo iko katikati. Hii inaonyesha kuwa data yetu haifai sana kwa aina hii ya ugawanyaji. Hebu tuone kama tunaweza kuthibitisha hisia hii kwa njia ya kuona. [Kifurushi cha factoextra](https://rpkgs.datanovia.com/factoextra/index.html) kinatoa kazi (`fviz_cluster()`) za kuonyesha ugawanyaji.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "7a6Km1_FLXzD"
|
|
},
|
|
"source": [
|
|
"library(factoextra)\n",
|
|
"\n",
|
|
"# Visualize clustering results\n",
|
|
"fviz_cluster(kclust, df_numeric_select)\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "IBwCWt-0LXzD"
|
|
},
|
|
"source": [
|
|
"Kuwepo kwa mwingiliano katika makundi kunaonyesha kuwa data yetu haifai sana kwa aina hii ya ugawaji, lakini tuendelee.\n",
|
|
"\n",
|
|
"## 4. Kuamua idadi bora ya makundi\n",
|
|
"\n",
|
|
"Swali la msingi ambalo mara nyingi hujitokeza katika ugawaji wa K-Means ni hili - bila lebo za darasa zinazojulikana, unajuaje ni makundi mangapi ya kugawa data yako?\n",
|
|
"\n",
|
|
"Njia moja ya kujaribu kujua ni kutumia sampuli ya data `kuunda mfululizo wa mifano ya ugawaji` na idadi inayoongezeka ya makundi (kwa mfano kutoka 1-10), na kutathmini vipimo vya ugawaji kama vile **Silhouette score.**\n",
|
|
"\n",
|
|
"Hebu tuamue idadi bora ya makundi kwa kuhesabu algoriti ya ugawaji kwa thamani tofauti za *k* na kutathmini **Within Cluster Sum of Squares** (WCSS). Jumla ya WCSS inapima ukaribu wa ugawaji, na tunataka iwe ndogo iwezekanavyo, ambapo thamani za chini zinaonyesha kuwa vidokezo vya data viko karibu zaidi.\n",
|
|
"\n",
|
|
"Hebu tuchunguze athari za chaguo tofauti za `k`, kutoka 1 hadi 10, kwenye ugawaji huu.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "hSeIiylDLXzE"
|
|
},
|
|
"source": [
|
|
"# Create a series of clustering models\n",
|
|
"kclusts <- tibble(k = 1:10) %>% \n",
|
|
" # Perform kmeans clustering for 1,2,3 ... ,10 clusters\n",
|
|
" mutate(model = map(k, ~ kmeans(df_numeric_select, centers = .x, nstart = 25)),\n",
|
|
" # Farm out clustering metrics eg WCSS\n",
|
|
" glanced = map(model, ~ glance(.x))) %>% \n",
|
|
" unnest(cols = glanced)\n",
|
|
" \n",
|
|
"\n",
|
|
"# View clustering rsulsts\n",
|
|
"kclusts\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "m7rS2U1eLXzE"
|
|
},
|
|
"source": [
|
|
"Sasa kwa kuwa tuna jumla ya ndani ya mraba wa makundi (tot.withinss) kwa kila algoriti ya kugawanya na kituo *k*, tunatumia [mbinu ya kiwiko](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) kutafuta idadi bora ya makundi. Mbinu hii inahusisha kuchora WCSS kama kazi ya idadi ya makundi, na kuchagua [kiwiko cha mchepuko](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Elbow of the curve\") kama idadi ya makundi ya kutumia.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "o_DjHGItLXzF"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"# Use elbow method to determine optimum number of clusters\n",
|
|
"kclusts %>% \n",
|
|
" ggplot(mapping = aes(x = k, y = tot.withinss)) +\n",
|
|
" geom_line(size = 1.2, alpha = 0.8, color = \"#FF7F0EFF\") +\n",
|
|
" geom_point(size = 2, color = \"#FF7F0EFF\")\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "pLYyt5XSLXzG"
|
|
},
|
|
"source": [
|
|
"Grafu inaonyesha kupungua kubwa kwa WCSS (kwa hivyo *ukamilifu zaidi*) kadri idadi ya makundi inavyoongezeka kutoka moja hadi mawili, na kupungua zaidi kunakoonekana kutoka makundi mawili hadi matatu. Baada ya hapo, kupungua hakutambuliki sana, na kusababisha `kiwiko` 💪 kwenye grafu karibu na makundi matatu. Hii ni ishara nzuri kwamba kuna makundi mawili hadi matatu ya alama za data ambazo zimetenganishwa vyema.\n",
|
|
"\n",
|
|
"Sasa tunaweza kuendelea na kutoa modeli ya makundi ambapo `k = 3`:\n",
|
|
"\n",
|
|
"> `pull()`: hutumika kutoa safu moja\n",
|
|
">\n",
|
|
"> `pluck()`: hutumika kuorodhesha miundo ya data kama vile orodha\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "JP_JPKBILXzG"
|
|
},
|
|
"source": [
|
|
"# Extract k = 3 clustering\n",
|
|
"final_kmeans <- kclusts %>% \n",
|
|
" filter(k == 3) %>% \n",
|
|
" pull(model) %>% \n",
|
|
" pluck(1)\n",
|
|
"\n",
|
|
"\n",
|
|
"final_kmeans\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "l_PDTu8tLXzI"
|
|
},
|
|
"source": [
|
|
"Hebu tuendelee na tuone makundi tuliyopata. Unapenda kuwa na mwingiliano kwa kutumia `plotly`?\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "dNcleFe-LXzJ"
|
|
},
|
|
"source": [
|
|
"# Add predicted cluster assignment to data set\n",
|
|
"results <- augment(final_kmeans, df_numeric_select) %>% \n",
|
|
" bind_cols(df_numeric %>% select(artist_top_genre)) \n",
|
|
"\n",
|
|
"# Plot cluster assignments\n",
|
|
"clust_plt <- results %>% \n",
|
|
" ggplot(mapping = aes(x = popularity, y = danceability, color = .cluster, shape = artist_top_genre)) +\n",
|
|
" geom_point(size = 2, alpha = 0.8) +\n",
|
|
" paletteer::scale_color_paletteer_d(\"ggthemes::Tableau_10\")\n",
|
|
"\n",
|
|
"ggplotly(clust_plt)\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "6JUM_51VLXzK"
|
|
},
|
|
"source": [
|
|
"Labda tungetarajia kwamba kila kundi (linalowakilishwa na rangi tofauti) lingekuwa na aina tofauti za muziki (zinazowakilishwa na maumbo tofauti).\n",
|
|
"\n",
|
|
"Hebu tuangalie usahihi wa mfano.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "HdIMUGq7LXzL"
|
|
},
|
|
"source": [
|
|
"# Assign genres to predefined integers\n",
|
|
"label_count <- results %>% \n",
|
|
" group_by(artist_top_genre) %>% \n",
|
|
" mutate(id = cur_group_id()) %>% \n",
|
|
" ungroup() %>% \n",
|
|
" summarise(correct_labels = sum(.cluster == id))\n",
|
|
"\n",
|
|
"\n",
|
|
"# Print results \n",
|
|
"cat(\"Result:\", label_count$correct_labels, \"out of\", nrow(results), \"samples were correctly labeled.\")\n",
|
|
"\n",
|
|
"cat(\"\\nAccuracy score:\", label_count$correct_labels/nrow(results))\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "C50wvaAOLXzM"
|
|
},
|
|
"source": [
|
|
"Usahihi wa modeli hii si mbaya, lakini si mzuri sana. Inawezekana kuwa data haifai vizuri kwa K-Means Clustering. Data hii haina uwiano mzuri, haina uhusiano wa kutosha, na kuna tofauti kubwa sana kati ya thamani za safu ili kuunda makundi vizuri. Kwa kweli, makundi yanayoundwa huenda yameathiriwa sana au kupotoshwa na zile kategoria tatu za muziki tulizotaja hapo juu.\n",
|
|
"\n",
|
|
"Hata hivyo, hilo lilikuwa somo la kujifunza!\n",
|
|
"\n",
|
|
"Katika nyaraka za Scikit-learn, unaweza kuona kuwa modeli kama hii, yenye makundi yasiyo na mipaka dhahiri, ina tatizo la 'tofauti':\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/problems.png\"\n",
|
|
" width=\"500\"/>\n",
|
|
" <figcaption>Picha kutoka Scikit-learn</figcaption>\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"## **Tofauti**\n",
|
|
"\n",
|
|
"Tofauti inafafanuliwa kama \"wastani wa tofauti za mraba kutoka kwa wastani\" [chanzo](https://www.mathsisfun.com/data/standard-deviation.html). Katika muktadha wa tatizo hili la clustering, inahusu data ambapo namba za seti yetu ya data zina mwelekeo wa kutofautiana sana kutoka kwa wastani.\n",
|
|
"\n",
|
|
"✅ Huu ni wakati mzuri wa kufikiria njia zote unazoweza kutumia kurekebisha tatizo hili. Je, urekebishe data kidogo zaidi? Utumie safu tofauti? Utumie algorithimu tofauti? Kidokezo: Jaribu [kupanua data yako](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) ili kuifanya iwe ya kawaida na ujaribu safu nyingine.\n",
|
|
"\n",
|
|
"> Jaribu '[kikokotoo cha tofauti](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ili kuelewa dhana hii zaidi.\n",
|
|
"\n",
|
|
"------------------------------------------------------------------------\n",
|
|
"\n",
|
|
"## **🚀Changamoto**\n",
|
|
"\n",
|
|
"Tumia muda na daftari hili, ukibadilisha vigezo. Je, unaweza kuboresha usahihi wa modeli kwa kusafisha data zaidi (kwa mfano, kuondoa data zisizo za kawaida)? Unaweza kutumia uzito ili kutoa uzito zaidi kwa sampuli fulani za data. Je, ni nini kingine unaweza kufanya ili kuunda makundi bora?\n",
|
|
"\n",
|
|
"Kidokezo: Jaribu kupanua data yako. Kuna msimbo uliotolewa maoni katika daftari unaoongeza upanuzi wa kawaida ili kufanya safu za data zifanane zaidi kwa karibu katika suala la masafa. Utagundua kuwa ingawa alama ya silhouette inashuka, 'kink' katika grafu ya kiwiko inakuwa laini. Hii ni kwa sababu kuacha data bila kupanuliwa kunaruhusu data yenye tofauti ndogo kuwa na uzito zaidi. Soma zaidi kuhusu tatizo hili [hapa](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n",
|
|
"\n",
|
|
"## [**Maswali ya baada ya somo**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n",
|
|
"\n",
|
|
"## **Mapitio na Kujisomea**\n",
|
|
"\n",
|
|
"- Angalia Simulator ya K-Means [kama hii](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Unaweza kutumia zana hii kuona alama za data za sampuli na kubaini centroids zake. Unaweza kuhariri nasibu ya data, idadi ya makundi na idadi ya centroids. Je, hii inakusaidia kupata wazo la jinsi data inaweza kugawanywa?\n",
|
|
"\n",
|
|
"- Pia, angalia [karatasi hii kuhusu K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) kutoka Stanford.\n",
|
|
"\n",
|
|
"Unataka kujaribu ujuzi wako mpya wa clustering kwenye seti za data zinazofaa kwa K-Means clustering? Tafadhali angalia:\n",
|
|
"\n",
|
|
"- [Fanya mafunzo na tathmini modeli za clustering](https://rpubs.com/eR_ic/clustering) ukitumia Tidymodels na marafiki\n",
|
|
"\n",
|
|
"- [Uchambuzi wa K-Means Cluster](https://uc-r.github.io/kmeans_clustering), Mwongozo wa Programu ya R ya UC Business Analytics\n",
|
|
"\n",
|
|
"- [K-Means clustering kwa kanuni za data iliyopangwa](https://www.tidymodels.org/learn/statistics/k-means/)\n",
|
|
"\n",
|
|
"## **Kazi**\n",
|
|
"\n",
|
|
"[Jaribu mbinu tofauti za clustering](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n",
|
|
"\n",
|
|
"## ASANTE KWA:\n",
|
|
"\n",
|
|
"[Jen Looper](https://www.twitter.com/jenlooper) kwa kuunda toleo la awali la Python la moduli hii ♥️\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) kwa kuunda michoro ya kushangaza inayofanya R kuwa ya kuvutia na ya kupendeza zaidi. Pata michoro zaidi kwenye [galeria yake](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
|
|
"\n",
|
|
"Jifunze kwa furaha,\n",
|
|
"\n",
|
|
"[Eric](https://twitter.com/ericntay), Balozi wa Wanafunzi wa Microsoft Learn wa Dhahabu.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"500\"/>\n",
|
|
" <figcaption>Sanaa na @allison_horst</figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, inashauriwa kutumia huduma ya tafsiri ya kitaalamu ya binadamu. Hatutawajibika kwa maelewano mabaya au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n"
|
|
]
|
|
}
|
|
]
|
|
} |