K-Means Clustering הוא אלגוריתם למידה ללא פיקוח המשמש לפתרון בעיות האשכולות בלמידת מכונה או מדעי הנתונים. בנושא זה, נלמד מהו אלגוריתם K-means clustering, כיצד האלגוריתם עובד, יחד עם יישום Python של clustering k-means.
מהו אלגוריתם K-Means?
K-Means Clustering הוא אלגוריתם למידה ללא פיקוח , שמקבץ את מערך הנתונים ללא תווית לאשכולות שונים. כאן K מגדיר את מספר האשכולות המוגדרים מראש שצריך ליצור בתהליך, כאילו K=2 יהיו שני אשכולות, ועבור K=3 יהיו שלושה אשכולות וכן הלאה.
זהו אלגוריתם איטרטיבי המחלק את מערך הנתונים ללא תווית ל-k אשכולות שונים באופן שכל מערך נתונים שייך רק לקבוצה אחת בעלת מאפיינים דומים.
זה מאפשר לנו לאסוף את הנתונים לקבוצות שונות ודרך נוחה לגלות את קטגוריות הקבוצות במערך הנתונים ללא תווית בעצמו ללא צורך בהכשרה כלשהי.
זהו אלגוריתם מבוסס מרכז, שבו כל אשכול משויך למרכז. המטרה העיקרית של אלגוריתם זה היא למזער את סכום המרחקים בין נקודת הנתונים לאשכולות התואמים להם.
האלגוריתם לוקח את מערך הנתונים ללא תווית כקלט, מחלק את מערך הנתונים ל-k-מספר של אשכולות וחוזר על התהליך עד שאינו מוצא את האשכולות הטובים ביותר. הערך של k צריך להיות מוגדר מראש באלגוריתם זה.
פירוש ה-k מקבץ האלגוריתם מבצע בעיקר שתי משימות:
- קובע את הערך הטוב ביותר עבור K נקודות מרכז או צנטרואידים על ידי תהליך איטרטיבי.
- מקצה כל נקודת נתונים למרכז ה-k הקרוב ביותר שלה. נקודות הנתונים האלה שנמצאות בקרבת מרכז k המסוים, יוצרות אשכול.
מכאן שלכל אשכול יש נקודות נתונים עם כמה מאפיינים משותפים, והוא רחוק מאשכולות אחרים.
התרשים שלהלן מסביר את פעולתו של אלגוריתם ה-K-means Clustering:
כיצד פועל אלגוריתם K-Means?
פעולתו של אלגוריתם K-Means מוסברת בשלבים הבאים:
שלב 1: בחר את המספר K כדי לקבוע את מספר האשכולות.
שלב 2: בחר אקראיות K נקודות או מוקדים. (זה יכול להיות אחר ממערך הקלט).
שלב 3: הקצה כל נקודת נתונים למרכז הקרוב ביותר שלה, אשר יהווה את ה-K אשכולות המוגדרים מראש.
שלב 4: חשב את השונות והצב מרכז חדש של כל אשכול.
שלב-5: חזור על השלבים השלישיים, כלומר הקצאה מחדש של כל נקודת נתונים למרכז הקרוב ביותר של כל אשכול.
שלב-6: אם מתרחשת הקצאה מחדש, עבור לשלב 4, אחרת עבור אל FINISH.
שלב-7 : הדגם מוכן.
בואו נבין את השלבים לעיל על ידי התחשבות בעלילות החזותיות:
נניח שיש לנו שני משתנים M1 ו-M2. עלילת הפיזור של ציר x-y של שני משתנים אלה ניתנת להלן:
- ניקח את מספר k של אשכולות, כלומר K=2, כדי לזהות את מערך הנתונים ולהכניס אותם לאשכולות שונים. זה אומר שכאן ננסה לקבץ מערכי נתונים אלה לשני אשכולות שונים.
- אנחנו צריכים לבחור כמה נקודות k אקראיות או מרכז כדי ליצור את האשכול. נקודות אלו יכולות להיות הנקודות ממערך הנתונים או כל נקודה אחרת. אז, כאן אנו בוחרים את שתי הנקודות שלהלן כנקודות k, שאינן חלק ממערך הנתונים שלנו. שקול את התמונה הבאה:
- כעת נקצה כל נקודת נתונים של חלקת הפיזור לנקודת ה-K או המרכז הקרוב ביותר שלה. נחשב אותו על ידי יישום מתמטיקה שלמדנו כדי לחשב את המרחק בין שתי נקודות. אז, נצייר חציון בין שני הסנטרואידים. שקול את התמונה הבאה:
מהתמונה לעיל, ברור שנקודות בצד שמאל של הקו קרובות למרכז K1 או כחול, ונקודות מימין לקו קרובות למרכז הצהוב. בואו נצבע אותם בכחול ובצהוב להדמיה ברורה.
- כפי שאנו צריכים למצוא את האשכול הקרוב ביותר, כך נחזור על התהליך על ידי בחירה מרכז חדש . כדי לבחור את הצנטרואידים החדשים, נחשב את מרכז הכובד של הצנטרואידים הללו, ונמצא את הצנטרואידים החדשים כמפורט להלן:
- לאחר מכן, נקצה מחדש כל נקודת נתונים למרכז החדש. לשם כך, נחזור על אותו תהליך של מציאת קו חציוני. החציון יהיה כמו בתמונה למטה:
מהתמונה לעיל, אנו יכולים לראות, נקודה צהובה אחת נמצאת בצד שמאל של הקו, ושתי נקודות כחולות ממש לקו. אז שלוש הנקודות הללו יוקצו למרכזים חדשים.
מכיוון שההקצאה מחדש התרחשה, כך נלך שוב לשלב 4, שהוא מציאת centroids או נקודות K חדשים.
- אנו נחזור על התהליך על ידי מציאת מרכז הכובד של צנטרואידים, כך שהצנטרואידים החדשים יהיו כפי שמוצג בתמונה למטה:
- כפי שקיבלנו את ה-centroids החדשים, כך שוב יצייר את הקו החציוני ויקצה מחדש את נקודות הנתונים. אז התמונה תהיה:
- אנו יכולים לראות בתמונה לעיל; אין נקודות נתונים שונות משני צדי הקו, מה שאומר שהמודל שלנו נוצר. שקול את התמונה הבאה:
מכיוון שהדגם שלנו מוכן, אז נוכל להסיר כעת את ה-centroids המשוערים, ושני האשכולות הסופיים יהיו כפי שמוצג בתמונה למטה:
כיצד לבחור את הערך של 'מספר K של אשכולות' ב-K-means Clustering?
הביצועים של אלגוריתם האשכולות K-means תלויים באשכולות יעילים ביותר שהוא יוצר. אבל בחירת המספר האופטימלי של אשכולות היא משימה גדולה. ישנן כמה דרכים שונות למצוא את המספר האופטימלי של אשכולות, אך כאן אנו דנים בשיטה המתאימה ביותר למצוא את מספר האשכולות או הערך של K. השיטה ניתנת להלן:
שיטת המרפק
שיטת המרפק היא אחת הדרכים הפופולריות ביותר למצוא את המספר האופטימלי של אשכולות. שיטה זו משתמשת במושג ערך WCSS. WCSS מייצג בתוך אשכול סכום של ריבועים , המגדיר את סך כל הווריאציות בתוך אשכול. הנוסחה לחישוב הערך של WCSS (עבור 3 אשכולות) ניתנת להלן:
WCSS= ∑פאני באשכול 1מרחק (Pאניג1)2+∑פאני באשכול 2מרחק (Pאניג2)2+∑פאני ב-Cluster3מרחק (Pאניג3)2בנוסחה שלעיל של WCSS,
∑פאני באשכול 1מרחק (Pאניג1)2: זהו סכום הריבוע של המרחקים בין כל נקודת נתונים והמרכז שלה בתוך אשכול1 וזהה עבור שני האיברים האחרים.
כדי למדוד את המרחק בין נקודות הנתונים למרכז, אנו יכולים להשתמש בכל שיטה כמו מרחק אוקלידי או מרחק מנהטן.
כדי למצוא את הערך האופטימלי של אשכולות, שיטת המרפק עוקבת אחר השלבים הבאים:
- הוא מבצע את ה-K-means clustering על מערך נתונים נתון עבור ערכי K שונים (נע בין 1-10).
- עבור כל ערך של K, מחשב את ערך WCSS.
- משרטט עקומה בין ערכי WCSS מחושבים למספר האשכולות K.
- נקודת העיקול החדה או נקודת העלילה נראית כמו זרוע, אז הנקודה הזו נחשבת לערך הטוב ביותר של K.
מכיוון שהגרף מציג את העיקול החד, שנראה כמו מרפק, מכאן שהוא ידוע כשיטת המרפק. הגרף של שיטת המרפק נראה כמו התמונה הבאה:
הערה: אנו יכולים לבחור את מספר האשכולות השווה לנקודות הנתונים הנתונות. אם נבחר את מספר האשכולות השווה לנקודות הנתונים, אז הערך של WCSS הופך לאפס, וזו תהיה נקודת הקצה של העלילה.
יישום Python של אלגוריתם Clustering של K-means
בסעיף לעיל, דנו באלגוריתם K-means, כעת בואו נראה כיצד ניתן ליישם אותו באמצעות פִּיתוֹן .
סוגי נתונים של sql
לפני היישום, בואו נבין איזה סוג של בעיה נפתור כאן. אז, יש לנו מערך נתונים של קניון_לקוחות , שהם הנתונים של לקוחות שמבקרים בקניון ומבלים בו.
במערך הנתונים הנתון, יש לנו Customer_Id, מגדר, גיל, הכנסה שנתית ($) וציון הוצאות (שזה הערך המחושב של כמה לקוח הוציא בקניון, ככל שהערך יותר, כך הוא הוציא יותר). מתוך מערך הנתונים הזה, אנחנו צריכים לחשב כמה דפוסים, מכיוון שזו שיטה לא מפוקחת, אז אנחנו לא יודעים מה לחשב בדיוק.
להלן השלבים שיש לבצע עבור היישום:
שלב-1: שלב עיבוד נתונים מראש
השלב הראשון יהיה עיבוד מוקדם של הנתונים, כפי שעשינו בנושאים הקודמים שלנו של רגרסיה וסיווג. אבל לבעיית הקיבוץ, זה יהיה שונה מדגמים אחרים. בואו נדון בזה:
כפי שעשינו בנושאים קודמים, ראשית, נייבא את הספריות עבור המודל שלנו, שהוא חלק מעיבוד מוקדם של נתונים. הקוד ניתן להלן:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd
בקוד לעיל, ה רדום ייבאנו לביצוע חישוב מתמטיקה, matplotlib מיועד לשרטוט הגרף, ו פנדות מיועדים לניהול מערך הנתונים.
לאחר מכן, נייבא את מערך הנתונים שאנו צריכים להשתמש בו. אז הנה, אנו משתמשים במערך הנתונים Mall_Customer_data.csv. ניתן לייבא אותו באמצעות הקוד הבא:
# Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv')
על ידי ביצוע שורות הקוד לעיל, נקבל את מערך הנתונים שלנו ב-Spyder IDE. מערך הנתונים נראה כמו התמונה למטה:
ממערך הנתונים לעיל, עלינו למצוא בו כמה דפוסים.
כאן אנחנו לא צריכים שום משתנה תלוי עבור שלב עיבוד מוקדם של נתונים מכיוון שמדובר בבעיית אשכולות, ואין לנו מושג מה לקבוע. אז פשוט נוסיף שורת קוד עבור מטריצת התכונות.
x = dataset.iloc[:, [3, 4]].values
כפי שאנו יכולים לראות, אנו מחלצים רק 3מחקר ופיתוחו-4ה'תכונה. זה בגלל שאנחנו צריכים עלילה דו-ממדית כדי להמחיש את המודל, וחלק מהתכונות אינן נדרשות, כגון customer_id.
שלב-2: מציאת המספר האופטימלי של אשכולות בשיטת המרפק
בשלב השני, ננסה למצוא את המספר האופטימלי של אשכולות לבעיית האשכולות שלנו. אז, כפי שנדון לעיל, כאן אנו הולכים להשתמש בשיטת המרפק למטרה זו.
כידוע, שיטת המרפק משתמשת במושג WCSS כדי לצייר את העלילה על ידי שרטוט ערכי WCSS על ציר Y ומספר האשכולות על ציר X. אז אנחנו הולכים לחשב את הערך עבור WCSS עבור ערכי k שונים הנעים בין 1 ל-10. להלן הקוד עבורו:
#finding optimal number of clusters using the elbow method from sklearn.cluster import KMeans wcss_list= [] #Initializing the list for the values of WCSS #Using for loop for iterations from 1 to 10. for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state= 42) kmeans.fit(x) wcss_list.append(kmeans.inertia_) mtp.plot(range(1, 11), wcss_list) mtp.title('The Elobw Method Graph') mtp.xlabel('Number of clusters(k)') mtp.ylabel('wcss_list') mtp.show()
כפי שאנו יכולים לראות בקוד לעיל, השתמשנו ה-KMeans כיתה של sclearn. ספריית אשכולות כדי ליצור את האשכולות.
לאחר מכן, יצרנו את wcss_list משתנה כדי לאתחל רשימה ריקה, המשמשת להכיל את הערך של wcss המחושב עבור ערכים שונים של k הנעים בין 1 ל-10.
לאחר מכן, אתחלנו את לולאת for עבור האיטרציה על ערך שונה של k הנע בין 1 ל-10; שכן עבור לולאה ב-Python, אל תכלול את המגבלה היוצאת, אז זה נלקח כ-11 כדי לכלול 10ה'ערך.
שאר החלקים של הקוד דומה לזה שעשינו בנושאים קודמים, שכן התאמנו את המודל על מטריצה של תכונות ולאחר מכן שרטטנו את הגרף בין מספר האשכולות ל-WCSS.
תְפוּקָה: לאחר ביצוע הקוד לעיל, נקבל את הפלט שלהלן:
מהעלילה לעיל, אנו יכולים לראות את נקודת המרפק נמצאת ב 5. אז מספר האשכולות כאן יהיה 5.
שלב 3: אימון אלגוריתם K-means על מערך האימון
מכיוון שיש לנו את מספר האשכולות, כך נוכל כעת לאמן את המודל במערך הנתונים.
כדי להכשיר את המודל, נשתמש באותן שתי שורות קוד כפי שהשתמשנו בסעיף לעיל, אבל כאן במקום להשתמש ב-i, נשתמש ב-5, כידוע יש 5 אשכולות שצריך להיווצר. הקוד ניתן להלן:
#training the K-means model on a dataset kmeans = KMeans(n_clusters=5, init='k-means++', random_state= 42) y_predict= kmeans.fit_predict(x)
השורה הראשונה זהה לעיל ליצירת האובייקט של המחלקה KMeans.
בשורת הקוד השנייה, יצרנו את המשתנה התלוי y_predict להכשיר את הדגם.
על ידי ביצוע שורות הקוד לעיל, נקבל את המשתנה y_predict. אנחנו יכולים לבדוק את זה למטה סייר המשתנה אפשרות ב-Spyder IDE. כעת אנו יכולים להשוות את הערכים של y_predict עם מערך הנתונים המקורי שלנו. שקול את התמונה הבאה:
מהתמונה שלמעלה, אנו יכולים כעת להתייחס לכך שה-CustomerID 1 שייך לאשכול
3 (מכיוון שהאינדקס מתחיל מ-0, מכאן ש-2 ייחשב כ-3), ו-2 שייך לאשכול 4, וכן הלאה.
שלב 4: הדמיית האשכולות
השלב האחרון הוא לדמיין את האשכולות. מכיוון שיש לנו 5 אשכולות עבור המודל שלנו, כך נדמיין כל אשכול אחד אחד.
כדי לדמיין את האשכולות תשתמש בתרשים פיזור באמצעות הפונקציה mtp.scatter() של matplotlib.
#visulaizing the clusters mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') #for first cluster mtp.scatter(x[y_predict == 1, 0], x[y_predict == 1, 1], s = 100, c = 'green', label = 'Cluster 2') #for second cluster mtp.scatter(x[y_predict== 2, 0], x[y_predict == 2, 1], s = 100, c = 'red', label = 'Cluster 3') #for third cluster mtp.scatter(x[y_predict == 3, 0], x[y_predict == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') #for fourth cluster mtp.scatter(x[y_predict == 4, 0], x[y_predict == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') #for fifth cluster mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroid') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show()
בשורות הקוד לעיל, כתבנו קוד עבור כל אשכולות, בטווח שבין 1 ל-5. הקואורדינטה הראשונה של ה-mtp.scatter, כלומר, x[y_predict == 0, 0] המכילה את ערך x להצגת המטריצה של כולל ערכים, וה-y_predict נע בין 0 ל-1.
תְפוּקָה:
תמונת הפלט מציגה בבירור את חמשת האשכולות השונים עם צבעים שונים. האשכולות נוצרים בין שני פרמטרים של מערך הנתונים; הכנסה שנתית של לקוח והוצאה. אנחנו יכולים לשנות את הצבעים והתוויות לפי הדרישה או הבחירה. אנו יכולים גם לראות כמה נקודות מהדפוסים שלעיל, הניתנים להלן:
- Cluster2 מראה שללקוח יש הכנסה גבוהה אך הוצאה נמוכה, כך שנוכל לסווג אותם כ זָהִיר .
- Cluster3 מציג את ההכנסה הנמוכה וגם את ההוצאה הנמוכה כך שניתן לסווג אותם כהגיוניים.
- Cluster4 מציג את הלקוחות עם הכנסה נמוכה עם הוצאה גבוהה מאוד כך שניתן לסווג אותם כ רשלן .
- Cluster5 מציג ללקוחות בעלי הכנסה גבוהה והוצאות גבוהות כך שניתן לסווג אותם כיעד, ולקוחות אלו יכולים להיות הלקוחות הרווחיים ביותר עבור בעל הקניון.