{ "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-06T12:16:51+00:00", "source_file": "5-Clustering/2-K-Means/solution/R/lesson_15-R.ipynb", "language_code": "ms" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "GULATlQXLXyR" }, "source": [ "## Terokai pengelompokan K-Means menggunakan R dan prinsip data Tidy.\n", "\n", "### [**Kuiz sebelum kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)\n", "\n", "Dalam pelajaran ini, anda akan belajar cara mencipta kelompok menggunakan pakej Tidymodels dan pakej lain dalam ekosistem R (kita akan panggil mereka kawan πŸ§‘β€πŸ€β€πŸ§‘), serta set data muzik Nigeria yang anda import sebelum ini. Kita akan membincangkan asas K-Means untuk pengelompokan. Ingatlah bahawa, seperti yang anda pelajari dalam pelajaran sebelumnya, terdapat banyak cara untuk bekerja dengan kelompok dan kaedah yang anda gunakan bergantung pada data anda. Kita akan mencuba K-Means kerana ia adalah teknik pengelompokan yang paling biasa. Mari kita mulakan!\n", "\n", "Istilah yang akan anda pelajari:\n", "\n", "- Skor Silhouette\n", "\n", "- Kaedah Elbow\n", "\n", "- Inertia\n", "\n", "- Varians\n", "\n", "### **Pengenalan**\n", "\n", "[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) adalah kaedah yang berasal dari bidang pemprosesan isyarat. Ia digunakan untuk membahagikan dan memisahkan kumpulan data kepada `k kelompok` berdasarkan persamaan dalam ciri-ciri mereka.\n", "\n", "Kelompok ini boleh divisualisasikan sebagai [diagram Voronoi](https://wikipedia.org/wiki/Voronoi_diagram), yang merangkumi satu titik (atau 'benih') dan kawasan yang berkaitan dengannya.\n", "\n", "

\n", " \n", "

Infografik oleh Jen Looper
\n", "\n", "\n", "Pengelompokan K-Means mempunyai langkah-langkah berikut:\n", "\n", "1. Saintis data bermula dengan menentukan bilangan kelompok yang dikehendaki untuk dicipta.\n", "\n", "2. Seterusnya, algoritma secara rawak memilih K pemerhatian daripada set data untuk dijadikan pusat awal bagi kelompok (iaitu, centroid).\n", "\n", "3. Seterusnya, setiap pemerhatian yang tinggal diberikan kepada centroid yang paling dekat dengannya.\n", "\n", "4. Seterusnya, purata baru bagi setiap kelompok dikira dan centroid dipindahkan ke purata tersebut.\n", "\n", "5. Setelah pusat-pusat dikira semula, setiap pemerhatian diperiksa semula untuk melihat sama ada ia mungkin lebih dekat dengan kelompok lain. Semua objek diberikan semula menggunakan purata kelompok yang dikemas kini. Langkah pemberian kelompok dan pengemaskinian centroid diulang secara iteratif sehingga pemberian kelompok berhenti berubah (iaitu, apabila penumpuan dicapai). Biasanya, algoritma akan berhenti apabila setiap iterasi baru menghasilkan pergerakan centroid yang tidak ketara dan kelompok menjadi statik.\n", "\n", "
\n", "\n", "> Perlu diingat bahawa disebabkan oleh pengacakan pemerhatian awal k yang digunakan sebagai centroid permulaan, kita boleh mendapatkan hasil yang sedikit berbeza setiap kali kita menggunakan prosedur ini. Atas sebab ini, kebanyakan algoritma menggunakan beberapa *permulaan rawak* dan memilih iterasi dengan WCSS terendah. Oleh itu, sangat disarankan untuk sentiasa menjalankan K-Means dengan beberapa nilai *nstart* untuk mengelakkan *optimum tempatan yang tidak diingini.*\n", "\n", "
\n", "\n", "Animasi pendek ini menggunakan [karya seni](https://github.com/allisonhorst/stats-illustrations) oleh Allison Horst menerangkan proses pengelompokan:\n", "\n", "

\n", " \n", "

Karya seni oleh @allison_horst
\n", "\n", "\n", "\n", "Satu soalan asas yang timbul dalam pengelompokan ialah: bagaimana anda tahu berapa banyak kelompok untuk memisahkan data anda? Satu kelemahan menggunakan K-Means termasuk fakta bahawa anda perlu menetapkan `k`, iaitu bilangan `centroid`. Nasib baik, `kaedah elbow` membantu untuk menganggarkan nilai permulaan yang baik untuk `k`. Anda akan mencubanya sebentar lagi.\n", "\n", "### \n", "\n", "**Prasyarat**\n", "\n", "Kita akan bermula dari tempat kita berhenti dalam [pelajaran sebelumnya](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb), di mana kita menganalisis set data, membuat banyak visualisasi dan menapis set data kepada pemerhatian yang menarik. Pastikan anda menyemaknya!\n", "\n", "Kita memerlukan beberapa pakej untuk menyelesaikan modul ini. Anda boleh memasangnya dengan: `install.packages(c('tidyverse', 'tidymodels', 'cluster', 'summarytools', 'plotly', 'paletteer', 'factoextra', 'patchwork'))`\n", "\n", "Sebagai alternatif, skrip di bawah akan memeriksa sama ada anda mempunyai pakej yang diperlukan untuk menyelesaikan modul ini dan memasangnya untuk anda sekiranya ada yang hilang.\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": [ "Mari kita mulakan dengan pantas!\n", "\n", "## 1. Tarian dengan data: Tumpukan kepada 3 genre muzik paling popular\n", "\n", "Ini adalah ringkasan apa yang telah kita lakukan dalam pelajaran sebelumnya. Jom kita analisis dan pecahkan 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": [ "🀩 Itu berjalan dengan baik!\n", "\n", "## 2. Lebih banyak penerokaan data.\n", "\n", "Seberapa bersih data ini? Mari kita periksa pencilan menggunakan plot kotak. Kita akan memberi tumpuan kepada lajur berangka dengan pencilan yang lebih sedikit (walaupun anda boleh membersihkan pencilan tersebut). Plot kotak boleh menunjukkan julat data dan akan membantu memilih lajur mana yang hendak digunakan. Perlu diingat, plot kotak tidak menunjukkan varians, elemen penting untuk data yang boleh dikelompokkan dengan baik. Sila lihat [perbincangan ini](https://stats.stackexchange.com/questions/91536/deduce-variance-from-boxplot) untuk bacaan lanjut.\n", "\n", "[Plot kotak](https://en.wikipedia.org/wiki/Box_plot) digunakan untuk menggambarkan secara grafik taburan data `berangka`, jadi mari kita mulakan dengan *memilih* semua lajur berangka bersama-sama dengan genre muzik popular.\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": [ "Lihat bagaimana pembantu pemilihan `where` memudahkan perkara ini πŸ’? Terokai fungsi-fungsi lain seperti ini [di sini](https://tidyselect.r-lib.org/).\n", "\n", "Oleh kerana kita akan membuat kotak plot untuk setiap ciri numerik dan kita ingin mengelakkan penggunaan gelung, mari kita susun semula data kita ke dalam format yang *lebih panjang* yang akan membolehkan kita memanfaatkan `facets` - subplot yang masing-masing memaparkan satu subset 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": [ "Lebih panjang lagi! Sekarang masa untuk beberapa `ggplots`! Jadi, `geom` apa yang akan kita gunakan?\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": [ "Mudah-gg!\n", "\n", "Sekarang kita dapat lihat data ini agak berisik: dengan memerhatikan setiap lajur sebagai kotak plot, anda boleh nampak nilai luar. Anda boleh melalui set data ini dan membuang nilai luar tersebut, tetapi itu akan menjadikan data agak terhad.\n", "\n", "Buat masa ini, mari kita pilih lajur mana yang akan kita gunakan untuk latihan pengelompokan kita. Mari kita pilih lajur berangka dengan julat yang serupa. Kita boleh mengekodkan `artist_top_genre` sebagai nilai berangka tetapi kita akan abaikan buat masa ini.\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. Mengira pengelompokan k-means dalam R\n", "\n", "Kita boleh mengira k-means dalam R menggunakan fungsi terbina dalam `kmeans`, lihat `help(\"kmeans()\")`. Fungsi `kmeans()` menerima bingkai data dengan semua lajur bernombor sebagai argumen utamanya.\n", "\n", "Langkah pertama apabila menggunakan pengelompokan k-means adalah untuk menentukan bilangan kelompok (k) yang akan dihasilkan dalam penyelesaian akhir. Kita tahu terdapat 3 genre lagu yang telah kita asingkan daripada set data, jadi mari kita cuba 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": [ "Objek kmeans mengandungi beberapa maklumat yang dijelaskan dengan baik dalam `help(\"kmeans()\")`. Buat masa ini, mari kita fokus pada beberapa perkara. Kita dapat lihat bahawa data telah dikelompokkan kepada 3 kluster dengan saiz 65, 110, 111. Hasil keluaran juga mengandungi pusat kluster (purata) untuk 3 kumpulan merentasi 5 pemboleh ubah.\n", "\n", "Vektor pengelompokan adalah tugasan kluster untuk setiap pemerhatian. Mari kita gunakan fungsi `augment` untuk menambah tugasan kluster ke dalam set data asal.\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": [ "Hebat, kita baru sahaja membahagikan set data kita kepada 3 kumpulan. Jadi, sejauh mana baiknya pengelompokan kita 🀷? Mari kita lihat pada `Silhouette score`.\n", "\n", "### **Silhouette score**\n", "\n", "[Analisis Silhouette](https://en.wikipedia.org/wiki/Silhouette_(clustering)) boleh digunakan untuk mengkaji jarak pemisahan antara kluster yang dihasilkan. Skor ini berbeza dari -1 hingga 1, dan jika skor menghampiri 1, kluster tersebut adalah padat dan terpisah dengan baik daripada kluster lain. Nilai yang hampir dengan 0 menunjukkan kluster yang bertindih dengan sampel yang sangat dekat dengan sempadan keputusan kluster jiran. [sumber](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam).\n", "\n", "Kaedah silhouette purata mengira purata silhouette bagi pemerhatian untuk nilai *k* yang berbeza. Skor silhouette purata yang tinggi menunjukkan pengelompokan yang baik.\n", "\n", "Fungsi `silhouette` dalam pakej cluster digunakan untuk mengira lebar silhouette purata.\n", "\n", "> Silhouette boleh dikira dengan mana-mana [metrik jarak](https://en.wikipedia.org/wiki/Distance \"Distance\"), seperti [jarak Euclidean](https://en.wikipedia.org/wiki/Euclidean_distance \"Euclidean distance\") atau [jarak Manhattan](https://en.wikipedia.org/wiki/Manhattan_distance \"Manhattan distance\") yang telah kita bincangkan dalam [pelajaran sebelumnya](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": [ "Skor kita ialah **.549**, jadi berada di tengah-tengah. Ini menunjukkan bahawa data kita tidak begitu sesuai untuk jenis pengelompokan ini. Mari kita lihat sama ada kita boleh mengesahkan andaian ini secara visual. [Pakej factoextra](https://rpkgs.datanovia.com/factoextra/index.html) menyediakan fungsi (`fviz_cluster()`) untuk memvisualisasikan pengelompokan.\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": [ "Tumpang tindih dalam kelompok menunjukkan bahawa data kita tidak begitu sesuai untuk jenis pengelompokan ini, tetapi mari kita teruskan.\n", "\n", "## 4. Menentukan jumlah kelompok yang optimum\n", "\n", "Satu persoalan asas yang sering timbul dalam pengelompokan K-Means ialah - tanpa label kelas yang diketahui, bagaimana anda tahu berapa banyak kelompok untuk memisahkan data anda?\n", "\n", "Salah satu cara untuk mencuba mengetahuinya adalah dengan menggunakan sampel data untuk `mencipta siri model pengelompokan` dengan bilangan kelompok yang meningkat (contohnya dari 1-10), dan menilai metrik pengelompokan seperti **Silhouette score.**\n", "\n", "Mari kita tentukan bilangan kelompok yang optimum dengan mengira algoritma pengelompokan untuk nilai *k* yang berbeza dan menilai **Within Cluster Sum of Squares** (WCSS). Jumlah WCSS mengukur kepadatan pengelompokan dan kita mahu ia sekecil mungkin, dengan nilai yang lebih rendah bermaksud titik data lebih rapat.\n", "\n", "Mari kita terokai kesan pilihan `k` yang berbeza, dari 1 hingga 10, terhadap pengelompokan ini.\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": [ "Sekarang kita mempunyai jumlah keseluruhan dalam-kluster sum-of-squares (tot.withinss) untuk setiap algoritma pengelompokan dengan pusat *k*, kita menggunakan [kaedah siku](https://en.wikipedia.org/wiki/Elbow_method_(clustering)) untuk mencari bilangan kluster yang optimum. Kaedah ini melibatkan melukis WCSS sebagai fungsi bilangan kluster, dan memilih [siku lengkung](https://en.wikipedia.org/wiki/Elbow_of_the_curve \"Siku lengkung\") sebagai bilangan kluster yang akan digunakan.\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": [ "Plot menunjukkan pengurangan besar dalam WCSS (jadi *ketatannya* lebih tinggi) apabila bilangan kluster meningkat dari satu ke dua, dan pengurangan yang lebih ketara lagi dari dua ke tiga kluster. Selepas itu, pengurangan menjadi kurang jelas, menghasilkan satu `elbow` πŸ’ͺ pada carta sekitar tiga kluster. Ini adalah petunjuk yang baik bahawa terdapat dua hingga tiga kluster data yang agak terpisah dengan baik.\n", "\n", "Kita kini boleh teruskan dan mengekstrak model pengelompokan di mana `k = 3`:\n", "\n", "> `pull()`: digunakan untuk mengekstrak satu lajur\n", ">\n", "> `pluck()`: digunakan untuk mengindeks struktur data seperti senarai\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": [ "Bagus! Mari kita visualisasikan kluster yang diperoleh. Berminat untuk sedikit interaktiviti menggunakan `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": [ "Mungkin kita menjangkakan bahawa setiap kelompok (diwakili oleh warna yang berbeza) akan mempunyai genre yang berbeza (diwakili oleh bentuk yang berbeza).\n", "\n", "Mari kita lihat ketepatan model ini.\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": [ "Ketepatan model ini tidaklah buruk, tetapi tidak begitu baik. Mungkin data ini tidak sesuai untuk K-Means Clustering. Data ini terlalu tidak seimbang, kurang berkorelasi, dan terdapat terlalu banyak variasi antara nilai-nilai kolum untuk membentuk kluster dengan baik. Malah, kluster yang terbentuk mungkin sangat dipengaruhi atau berat sebelah oleh tiga kategori genre yang telah kita tentukan sebelum ini.\n", "\n", "Walau bagaimanapun, ini adalah proses pembelajaran yang sangat menarik!\n", "\n", "Dalam dokumentasi Scikit-learn, anda boleh lihat bahawa model seperti ini, dengan kluster yang tidak begitu jelas, mempunyai masalah 'variasi':\n", "\n", "

\n", " \n", "

Infografik daripada Scikit-learn
\n", "\n", "\n", "\n", "## **Variasi**\n", "\n", "Variasi didefinisikan sebagai \"purata perbezaan kuasa dua daripada Min\" [sumber](https://www.mathsisfun.com/data/standard-deviation.html). Dalam konteks masalah pengelompokan ini, ia merujuk kepada data di mana nombor-nombor dalam set data kita cenderung menyimpang terlalu jauh daripada min.\n", "\n", "βœ… Ini adalah masa yang baik untuk memikirkan semua cara yang boleh anda gunakan untuk membetulkan isu ini. Ubah suai data sedikit lagi? Gunakan kolum yang berbeza? Gunakan algoritma yang berbeza? Petunjuk: Cuba [skala data anda](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) untuk menormalkannya dan uji kolum lain.\n", "\n", "> Cuba '[kalkulator variasi](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' ini untuk memahami konsep ini dengan lebih mendalam.\n", "\n", "------------------------------------------------------------------------\n", "\n", "## **πŸš€Cabaran**\n", "\n", "Luangkan masa dengan notebook ini, ubah suai parameter. Bolehkah anda meningkatkan ketepatan model dengan membersihkan data lebih banyak (contohnya, membuang outlier)? Anda boleh menggunakan berat untuk memberikan lebih banyak berat kepada sampel data tertentu. Apa lagi yang boleh anda lakukan untuk mencipta kluster yang lebih baik?\n", "\n", "Petunjuk: Cuba skala data anda. Terdapat kod yang dikomen dalam notebook yang menambah skala standard untuk menjadikan kolum data lebih serupa dari segi julat. Anda akan dapati bahawa walaupun skor siluet menurun, 'kink' dalam graf siku menjadi lebih lancar. Ini kerana membiarkan data tidak berskala membolehkan data dengan variasi yang kurang membawa lebih banyak berat. Baca lebih lanjut tentang masalah ini [di sini](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).\n", "\n", "## [**Kuiz selepas kuliah**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)\n", "\n", "## **Ulasan & Kajian Kendiri**\n", "\n", "- Lihatlah Simulator K-Means [seperti ini](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Anda boleh menggunakan alat ini untuk memvisualisasikan titik data sampel dan menentukan centroidnya. Anda boleh mengedit keacakan data, bilangan kluster dan bilangan centroid. Adakah ini membantu anda mendapatkan idea tentang bagaimana data boleh dikelompokkan?\n", "\n", "- Juga, lihat [handout tentang K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) dari Stanford.\n", "\n", "Ingin mencuba kemahiran pengelompokan yang baru anda pelajari pada set data yang sesuai untuk K-Means clustering? Sila lihat:\n", "\n", "- [Latih dan Nilai Model Pengelompokan](https://rpubs.com/eR_ic/clustering) menggunakan Tidymodels dan rakan-rakan\n", "\n", "- [Analisis Kluster K-Means](https://uc-r.github.io/kmeans_clustering), Panduan Pemrograman Analitik Perniagaan UC R\n", "\n", "- [Pengelompokan K-Means dengan prinsip data yang teratur](https://www.tidymodels.org/learn/statistics/k-means/)\n", "\n", "## **Tugasan**\n", "\n", "[Cuba kaedah pengelompokan yang berbeza](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/assignment.md)\n", "\n", "## TERIMA KASIH KEPADA:\n", "\n", "[Jen Looper](https://www.twitter.com/jenlooper) kerana mencipta versi Python asal modul ini β™₯️\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) kerana mencipta ilustrasi yang menakjubkan yang menjadikan R lebih mesra dan menarik. Cari lebih banyak ilustrasi di [galerinya](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n", "\n", "Selamat Belajar,\n", "\n", "[Eric](https://twitter.com/ericntay), Duta Pelajar Microsoft Learn Emas.\n", "\n", "

\n", " \n", "

Karya seni oleh @allison_horst
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk memastikan ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat yang kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n" ] } ] }