# מבוא לקיבוץ קיבוץ הוא סוג של [למידה ללא פיקוח](https://wikipedia.org/wiki/Unsupervised_learning) שמניח כי מערך הנתונים אינו מתויג או שהקלטים שלו אינם מותאמים לפלטים מוגדרים מראש. הוא משתמש באלגוריתמים שונים כדי למיין נתונים לא מתויגים ולספק קבוצות בהתאם לדפוסים שהוא מזהה בנתונים. [![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare") > 🎥 לחצו על התמונה למעלה לצפייה בסרטון. בזמן שאתם לומדים על למידת מכונה עם קיבוץ, תהנו ממוזיקת דאנס הול ניגרית - זהו שיר מדורג מאוד משנת 2014 של PSquare. ## [שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/) ### מבוא [קיבוץ](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) הוא כלי שימושי מאוד לחקר נתונים. בואו נראה אם הוא יכול לעזור לגלות מגמות ודפוסים באופן שבו קהל ניגרי צורך מוזיקה. ✅ הקדישו רגע לחשוב על השימושים בקיבוץ. בחיים האמיתיים, קיבוץ מתרחש בכל פעם שיש לכם ערימת כביסה ואתם צריכים למיין את הבגדים של בני המשפחה 🧦👕👖🩲. במדעי הנתונים, קיבוץ מתרחש כשמנסים לנתח את העדפות המשתמש או לקבוע את המאפיינים של כל מערך נתונים לא מתויג. קיבוץ, במובן מסוים, עוזר לעשות סדר בכאוס, כמו מגירת גרביים. [![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering") > 🎥 לחצו על התמונה למעלה לצפייה בסרטון: ג'ון גוטאג מ-MIT מציג את נושא הקיבוץ בסביבה מקצועית, קיבוץ יכול לשמש לקביעת דברים כמו פילוח שוק, למשל, לקבוע אילו קבוצות גיל קונות אילו פריטים. שימוש נוסף יכול להיות זיהוי חריגות, אולי כדי לזהות הונאה מתוך מערך נתונים של עסקאות בכרטיסי אשראי. או שתוכלו להשתמש בקיבוץ כדי לזהות גידולים בסריקות רפואיות. ✅ הקדישו רגע לחשוב כיצד נתקלתם בקיבוץ 'בעולם האמיתי', בסביבה בנקאית, מסחר אלקטרוני או עסקית. > 🎓 מעניין, ניתוח קיבוץ מקורו בתחומי האנתרופולוגיה והפסיכולוגיה בשנות ה-30. האם אתם יכולים לדמיין כיצד הוא שימש אז? לחילופין, תוכלו להשתמש בו לקיבוץ תוצאות חיפוש - לפי קישורי קניות, תמונות או ביקורות, למשל. קיבוץ שימושי כשיש לכם מערך נתונים גדול שברצונכם לצמצם ועליו לבצע ניתוח מעמיק יותר, כך שהטכניקה יכולה לשמש ללמידה על נתונים לפני בניית מודלים אחרים. ✅ לאחר שמערך הנתונים שלכם מאורגן בקבוצות, אתם מקצים לו מזהה קבוצה, וטכניקה זו יכולה להיות שימושית לשמירה על פרטיות מערך הנתונים; תוכלו להתייחס לנקודת נתונים לפי מזהה הקבוצה שלה, במקום לפי נתונים מזהים יותר. האם אתם יכולים לחשוב על סיבות נוספות מדוע תעדיפו להתייחס למזהה קבוצה במקום לאלמנטים אחרים של הקבוצה כדי לזהות אותה? העמיקו את הבנתכם בטכניקות קיבוץ במודול [לימוד זה](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) ## התחלת עבודה עם קיבוץ [Scikit-learn מציעה מגוון רחב](https://scikit-learn.org/stable/modules/clustering.html) של שיטות לביצוע קיבוץ. הסוג שתבחרו תלוי במקרה השימוש שלכם. לפי התיעוד, לכל שיטה יש יתרונות שונים. הנה טבלה פשוטה של השיטות הנתמכות על ידי Scikit-learn ומקרי השימוש המתאימים להן: | שם השיטה | מקרה שימוש | | :------------------------ | :--------------------------------------------------------------------- | | K-Means | שימוש כללי, אינדוקטיבי | | Affinity propagation | קבוצות רבות ולא אחידות, אינדוקטיבי | | Mean-shift | קבוצות רבות ולא אחידות, אינדוקטיבי | | Spectral clustering | קבוצות מעטות ואחידות, טרנסדוקטיבי | | Ward hierarchical clustering | קבוצות רבות ומוגבלות, טרנסדוקטיבי | | Agglomerative clustering | קבוצות רבות ומוגבלות, מרחקים לא אוקלידיים, טרנסדוקטיבי | | DBSCAN | גיאומטריה לא שטוחה, קבוצות לא אחידות, טרנסדוקטיבי | | OPTICS | גיאומטריה לא שטוחה, קבוצות לא אחידות עם צפיפות משתנה, טרנסדוקטיבי | | Gaussian mixtures | גיאומטריה שטוחה, אינדוקטיבי | | BIRCH | מערך נתונים גדול עם חריגות, אינדוקטיבי | > 🎓 איך אנחנו יוצרים קבוצות קשור מאוד לאופן שבו אנחנו אוספים את נקודות הנתונים לקבוצות. בואו נפרק קצת את המונחים: > > 🎓 ['טרנסדוקטיבי' מול 'אינדוקטיבי'](https://wikipedia.org/wiki/Transduction_(machine_learning)) > > הסקה טרנסדוקטיבית נגזרת ממקרים שנצפו באימון שממופים למקרים ספציפיים בבדיקה. הסקה אינדוקטיבית נגזרת ממקרים באימון שממופים לכללים כלליים שמיושמים רק לאחר מכן על מקרים בבדיקה. > > דוגמה: דמיינו שיש לכם מערך נתונים שמסומן רק באופן חלקי. חלק מהפריטים הם 'תקליטים', חלק 'דיסקים', וחלק ריקים. המשימה שלכם היא לספק תוויות לריקים. אם תבחרו בגישה אינדוקטיבית, תאמנו מודל שמחפש 'תקליטים' ו'דיסקים', ותיישמו את התוויות הללו על הנתונים הלא מתויגים. גישה זו תתקשה לסווג פריטים שהם למעשה 'קלטות'. גישה טרנסדוקטיבית, לעומת זאת, מתמודדת עם נתונים לא ידועים בצורה יעילה יותר כשהיא עובדת על קיבוץ פריטים דומים יחד ואז מיישמת תווית לקבוצה. במקרה זה, הקבוצות עשויות לשקף 'דברים מוזיקליים עגולים' ו'דברים מוזיקליים מרובעים'. > > 🎓 ['גיאומטריה לא שטוחה' מול 'שטוחה'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering) > > נגזר מהמונחים המתמטיים, גיאומטריה לא שטוחה מול שטוחה מתייחסת למדידת המרחקים בין נקודות על ידי שיטות גיאומטריות 'שטוחות' ([אוקלידיות](https://wikipedia.org/wiki/Euclidean_geometry)) או 'לא שטוחות' (לא אוקלידיות). > >'שטוחה' בהקשר זה מתייחסת לגיאומטריה אוקלידית (חלקים ממנה נלמדים כגיאומטריה 'מישורית'), ו'לא שטוחה' מתייחסת לגיאומטריה לא אוקלידית. מה הקשר בין גיאומטריה ללמידת מכונה? ובכן, כשני תחומים שמבוססים על מתמטיקה, חייבת להיות דרך משותפת למדוד מרחקים בין נקודות בקבוצות, וזה יכול להיעשות בצורה 'שטוחה' או 'לא שטוחה', תלוי בטבע הנתונים. [מרחקים אוקלידיים](https://wikipedia.org/wiki/Euclidean_distance) נמדדים כאורך של קטע קו בין שתי נקודות. [מרחקים לא אוקלידיים](https://wikipedia.org/wiki/Non-Euclidean_geometry) נמדדים לאורך עקומה. אם הנתונים שלכם, כשהם מוצגים, נראים כאילו אינם קיימים על מישור, ייתכן שתצטרכו להשתמש באלגוריתם מיוחד כדי להתמודד איתם. > ![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png) > אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded) > > 🎓 ['מרחקים'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf) > > קבוצות מוגדרות על ידי מטריצת המרחקים שלהן, כלומר המרחקים בין נקודות. מרחק זה יכול להימדד בכמה דרכים. קבוצות אוקלידיות מוגדרות על ידי ממוצע ערכי הנקודות, ומכילות 'centroid' או נקודת מרכז. המרחקים נמדדים כך לפי המרחק ל-centroid. מרחקים לא אוקלידיים מתייחסים ל'clustroids', הנקודה הקרובה ביותר לנקודות אחרות. Clustroids בתורם יכולים להיות מוגדרים בדרכים שונות. > > 🎓 ['מוגבל'](https://wikipedia.org/wiki/Constrained_clustering) > > [קיבוץ מוגבל](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) מכניס 'למידה חצי מפוקחת' לשיטה ללא פיקוח זו. היחסים בין נקודות מסומנים כ'לא ניתן לקשר' או 'חייב לקשר' כך שכמה כללים נכפים על מערך הנתונים. > >דוגמה: אם אלגוריתם משוחרר על אצווה של נתונים לא מתויגים או חצי מתויגים, הקבוצות שהוא יוצר עשויות להיות באיכות ירודה. בדוגמה לעיל, הקבוצות עשויות לקבץ 'דברים מוזיקליים עגולים', 'דברים מוזיקליים מרובעים', 'דברים משולשים' ו'עוגיות'. אם ניתנים כמה מגבלות, או כללים לעקוב אחריהם ("הפריט חייב להיות עשוי מפלסטיק", "הפריט צריך להיות מסוגל להפיק מוזיקה") זה יכול לעזור 'להגביל' את האלגוריתם לקבל החלטות טובות יותר. > > 🎓 'צפיפות' > > נתונים שהם 'רועשים' נחשבים ל'צפופים'. המרחקים בין נקודות בכל אחת מהקבוצות שלהם עשויים להוכיח, בבדיקה, שהם צפופים יותר או פחות, או 'עמוסים' ולכן נתונים אלה צריכים להיות מנותחים עם שיטת הקיבוץ המתאימה. [מאמר זה](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) מדגים את ההבדל בין שימוש בקיבוץ K-Means לבין אלגוריתמים של HDBSCAN לחקר מערך נתונים רועש עם צפיפות קבוצות לא אחידה. ## אלגוריתמי קיבוץ ישנם מעל 100 אלגוריתמי קיבוץ, והשימוש בהם תלוי בטבע הנתונים שבידכם. בואו נדון בכמה מהעיקריים: - **קיבוץ היררכי**. אם אובייקט מסווג לפי קרבתו לאובייקט סמוך, ולא לאחד רחוק יותר, קבוצות נוצרות על בסיס המרחק של חבריהן אל ומאובייקטים אחרים. הקיבוץ האגרומרטיבי של Scikit-learn הוא היררכי. ![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png) > אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded) - **קיבוץ לפי מרכז**. אלגוריתם פופולרי זה דורש בחירה של 'k', או מספר הקבוצות שיש ליצור, ולאחר מכן האלגוריתם קובע את נקודת המרכז של קבוצה ואוסף נתונים סביב אותה נקודה. [קיבוץ K-means](https://wikipedia.org/wiki/K-means_clustering) הוא גרסה פופולרית של קיבוץ לפי מרכז. המרכז נקבע לפי הממוצע הקרוב ביותר, ומכאן השם. המרחק המרובע מהקבוצה ממוזער. ![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png) > אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded) - **קיבוץ מבוסס התפלגות**. מבוסס על מודלים סטטיסטיים, קיבוץ מבוסס התפלגות מתמקד בקביעת ההסתברות שנקודת נתונים שייכת לקבוצה, ומקצה אותה בהתאם. שיטות תערובת גאוסיאנית שייכות לסוג זה. - **קיבוץ מבוסס צפיפות**. נקודות נתונים מוקצות לקבוצות על בסיס צפיפותן, או התאגדותן זו סביב זו. נקודות נתונים רחוקות מהקבוצה נחשבות לחריגות או רעש. DBSCAN, Mean-shift ו-OPTICS שייכות לסוג זה של קיבוץ. - **קיבוץ מבוסס רשת**. עבור מערכי נתונים רב-ממדיים, נוצרת רשת והנתונים מחולקים בין תאי הרשת, ובכך נוצרים קבוצות. ## תרגיל - קבצו את הנתונים שלכם קיבוץ כטכניקה נעזר מאוד בהדמיה נכונה, אז בואו נתחיל בהדמיה של נתוני המוזיקה שלנו. תרגיל זה יעזור לנו להחליט אילו משיטות הקיבוץ נוכל להשתמש בצורה היעילה ביותר עבור טבע הנתונים הללו. 1. פתחו את הקובץ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) בתיקייה זו. 1. ייבאו את חבילת `Seaborn` להדמיה טובה של נתונים. ```python !pip install seaborn ``` 1. הוסיפו את נתוני השירים מתוך [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). טענו מסגרת נתונים עם מידע על השירים. התכוננו לחקור את הנתונים הללו על ידי ייבוא הספריות והצגת הנתונים: ```python import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("../data/nigerian-songs.csv") df.head() ``` בדקו את השורות הראשונות של הנתונים: | | שם | אלבום | אמן | ז'אנר מוביל של האמן | תאריך יציאה | אורך | פופולריות | ריקודיות | אקוסטיות | אנרגיה | אינסטרומנטליות | חיות | עוצמה | דיבוריות | טמפו | חתימת זמן | | --- | ---------------------- | ---------------------------- | ------------------ | ------------------- | ------------ | ----- | ---------- | --------- | --------- | ------ | ---------------- | ------ | ------- | ---------- | ------- | ---------- | | 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 | | 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine)| afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 | | 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 | | 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 | | 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 | 1. קבל מידע על מסגרת הנתונים על ידי קריאה ל-`info()`: ```python df.info() ``` הפלט נראה כך: ```output RangeIndex: 530 entries, 0 to 529 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 530 non-null object 1 album 530 non-null object 2 artist 530 non-null object 3 artist_top_genre 530 non-null object 4 release_date 530 non-null int64 5 length 530 non-null int64 6 popularity 530 non-null int64 7 danceability 530 non-null float64 8 acousticness 530 non-null float64 9 energy 530 non-null float64 10 instrumentalness 530 non-null float64 11 liveness 530 non-null float64 12 loudness 530 non-null float64 13 speechiness 530 non-null float64 14 tempo 530 non-null float64 15 time_signature 530 non-null int64 dtypes: float64(8), int64(4), object(4) memory usage: 66.4+ KB ``` 1. בדוק שוב אם יש ערכים חסרים על ידי קריאה ל-`isnull()` ואימות שהסכום הוא 0: ```python df.isnull().sum() ``` נראה טוב: ```output name 0 album 0 artist 0 artist_top_genre 0 release_date 0 length 0 popularity 0 danceability 0 acousticness 0 energy 0 instrumentalness 0 liveness 0 loudness 0 speechiness 0 tempo 0 time_signature 0 dtype: int64 ``` 1. תאר את הנתונים: ```python df.describe() ``` | | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature | | ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- | | count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | | mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 | | std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 | | min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 | | 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 | | 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 | | 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 | | max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 | > 🤔 אם אנחנו עובדים עם קיבוץ, שיטה לא מפוקחת שאינה דורשת נתונים מתויגים, מדוע אנחנו מציגים את הנתונים עם תוויות? בשלב חקר הנתונים, הם שימושיים, אך הם אינם הכרחיים לפעולת האלגוריתמים של הקיבוץ. אפשר פשוט להסיר את כותרות העמודות ולהתייחס לנתונים לפי מספרי עמודות. הסתכל על הערכים הכלליים של הנתונים. שים לב שהפופולריות יכולה להיות '0', מה שמראה שירים שאין להם דירוג. בואו נסיר אותם בקרוב. 1. השתמש בגרף עמודות כדי לגלות את הז'אנרים הפופולריים ביותר: ```python import seaborn as sns top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top[:5].index,y=top[:5].values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') ``` ![most popular](../../../../5-Clustering/1-Visualize/images/popular.png) ✅ אם תרצה לראות יותר ערכים מובילים, שנה את `[:5]` לערך גדול יותר, או הסר אותו כדי לראות הכל. שים לב, כאשר הז'אנר המוביל מתואר כ'חסר', זה אומר ש-Spotify לא סיווג אותו, אז בואו נסיר אותו. 1. הסר נתונים חסרים על ידי סינונם החוצה ```python df = df[df['artist_top_genre'] != 'Missing'] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') ``` עכשיו בדוק שוב את הז'אנרים: ![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png) 1. שלושת הז'אנרים המובילים שולטים בבירור במאגר הנתונים הזה. בואו נתמקד ב-`afro dancehall`, `afropop`, ו-`nigerian pop`, בנוסף נסנן את מאגר הנתונים כדי להסיר כל דבר עם ערך פופולריות של 0 (כלומר הוא לא סווג עם פופולריות במאגר הנתונים וניתן להתייחס אליו כרעש למטרותינו): ```python df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] df = df[(df['popularity'] > 0)] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') ``` 1. בצע בדיקה מהירה כדי לראות אם הנתונים מתואמים בצורה חזקה במיוחד: ```python corrmat = df.corr(numeric_only=True) f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True) ``` ![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png) ההתאמה החזקה היחידה היא בין `energy` ל-`loudness`, מה שלא מפתיע במיוחד, בהתחשב בכך שמוזיקה רועשת היא בדרך כלל די אנרגטית. מלבד זאת, ההתאמות יחסית חלשות. יהיה מעניין לראות מה אלגוריתם קיבוץ יכול לעשות עם הנתונים האלה. > 🎓 שים לב שהתאמה אינה מעידה על סיבתיות! יש לנו הוכחה להתאמה אך אין הוכחה לסיבתיות. [אתר משעשע](https://tylervigen.com/spurious-correlations) מציג כמה חזותיות שמדגישות את הנקודה הזו. האם יש התכנסות במאגר הנתונים הזה סביב הפופולריות הנתפסת של שיר ורמת הריקודיות שלו? גריד פייסט מראה שיש מעגלים קונצנטריים שמתיישרים, ללא קשר לז'אנר. האם ייתכן שהטעם הניגרי מתכנס ברמת ריקודיות מסוימת עבור הז'אנר הזה? ✅ נסה נקודות נתונים שונות (אנרגיה, עוצמה, דיבוריות) ועוד או ז'אנרים מוזיקליים שונים. מה תוכל לגלות? הסתכל בטבלת `df.describe()` כדי לראות את ההתפלגות הכללית של נקודות הנתונים. ### תרגיל - התפלגות נתונים האם שלושת הז'אנרים האלה שונים באופן משמעותי בתפיסת הריקודיות שלהם, בהתבסס על הפופולריות שלהם? 1. בדוק את התפלגות הנתונים של שלושת הז'אנרים המובילים שלנו עבור פופולריות וריקודיות לאורך ציר x ו-y נתון. ```python sns.set_theme(style="ticks") g = sns.jointplot( data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde", ) ``` תוכל לגלות מעגלים קונצנטריים סביב נקודת התכנסות כללית, שמראים את התפלגות הנקודות. > 🎓 שים לב שהדוגמה הזו משתמשת בגרף KDE (Kernel Density Estimate) שמייצג את הנתונים באמצעות עקומת צפיפות הסתברות רציפה. זה מאפשר לנו לפרש נתונים כשעובדים עם התפלגויות מרובות. באופן כללי, שלושת הז'אנרים מתיישרים באופן רופף מבחינת הפופולריות והריקודיות שלהם. קביעת קבוצות בנתונים שמתיישרים באופן רופף תהיה אתגר: ![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png) 1. צור גרף פיזור: ```python sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend() ``` גרף פיזור של אותם צירים מראה דפוס דומה של התכנסות ![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png) באופן כללי, עבור קיבוץ, ניתן להשתמש בגרפי פיזור כדי להראות קבוצות של נתונים, כך שלשלוט בסוג זה של ויזואליזציה זה מאוד שימושי. בשיעור הבא, ניקח את הנתונים המסוננים האלה ונשתמש בקיבוץ k-means כדי לגלות קבוצות בנתונים האלה שנראה כי חופפות בדרכים מעניינות. --- ## 🚀אתגר בהכנה לשיעור הבא, צור תרשים על אלגוריתמי הקיבוץ השונים שתוכל לגלות ולהשתמש בהם בסביבת ייצור. אילו סוגי בעיות הקיבוץ מנסה לפתור? ## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/) ## סקירה ולימוד עצמי לפני שתיישם אלגוריתמי קיבוץ, כפי שלמדנו, זה רעיון טוב להבין את טבע מאגר הנתונים שלך. קרא עוד על הנושא [כאן](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html) [מאמר מועיל זה](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) עובר על הדרכים השונות שבהן אלגוריתמי קיבוץ שונים מתנהגים, בהתחשב בצורות נתונים שונות. ## משימה [חקר ויזואליזציות אחרות עבור קיבוץ](assignment.md) --- **כתב ויתור**: מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.