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/ar/5-Clustering/1-Visualize/README.md

28 KiB

مقدمة إلى التجميع

التجميع هو نوع من التعلم غير الموجه الذي يفترض أن مجموعة البيانات غير معنونة أو أن مدخلاتها غير مرتبطة بمخرجات محددة مسبقًا. يستخدم التجميع خوارزميات مختلفة لفرز البيانات غير المعنونة وتوفير مجموعات بناءً على الأنماط التي يكتشفها في البيانات.

No One Like You by PSquare

🎥 انقر على الصورة أعلاه لمشاهدة الفيديو. أثناء دراستك لتعلم الآلة باستخدام التجميع، استمتع ببعض أغاني الرقص النيجيرية - هذه أغنية مشهورة من عام 2014 لفرقة PSquare.

اختبار ما قبل المحاضرة

مقدمة

التجميع مفيد جدًا لاستكشاف البيانات. دعونا نرى ما إذا كان يمكنه المساعدة في اكتشاف الاتجاهات والأنماط في طريقة استهلاك الجمهور النيجيري للموسيقى.

خذ دقيقة للتفكير في استخدامات التجميع. في الحياة الواقعية، يحدث التجميع عندما يكون لديك كومة من الغسيل وتحتاج إلى فرز ملابس أفراد عائلتك 🧦👕👖🩲. في علم البيانات، يحدث التجميع عند محاولة تحليل تفضيلات المستخدم أو تحديد خصائص أي مجموعة بيانات غير معنونة. يساعد التجميع، بطريقة ما، في فهم الفوضى، مثل درج الجوارب.

Introduction to ML

🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: جون غوتاغ من MIT يقدم التجميع.

في بيئة مهنية، يمكن استخدام التجميع لتحديد أشياء مثل تقسيم السوق، أو تحديد الفئات العمرية التي تشتري منتجات معينة، على سبيل المثال. استخدام آخر يمكن أن يكون اكتشاف الشذوذ، ربما لاكتشاف الاحتيال من مجموعة بيانات معاملات بطاقات الائتمان. أو قد تستخدم التجميع لتحديد الأورام في مجموعة من الفحوصات الطبية.

فكر لدقيقة في كيفية مواجهتك للتجميع "في الحياة الواقعية"، سواء في البنوك أو التجارة الإلكترونية أو بيئة الأعمال.

🎓 من المثير للاهتمام أن تحليل التجميع نشأ في مجالات الأنثروبولوجيا وعلم النفس في ثلاثينيات القرن الماضي. هل يمكنك تخيل كيف كان يمكن استخدامه؟

بدلاً من ذلك، يمكنك استخدامه لتجميع نتائج البحث - مثل الروابط التسويقية أو الصور أو المراجعات، على سبيل المثال. يكون التجميع مفيدًا عندما يكون لديك مجموعة بيانات كبيرة تريد تقليلها وتريد إجراء تحليل أكثر تفصيلاً عليها، لذا يمكن استخدام هذه التقنية لفهم البيانات قبل بناء نماذج أخرى.

بمجرد تنظيم بياناتك في مجموعات، يمكنك تعيين معرف مجموعة لها، ويمكن أن تكون هذه التقنية مفيدة عند الحفاظ على خصوصية مجموعة البيانات؛ يمكنك بدلاً من ذلك الإشارة إلى نقطة بيانات بمعرف المجموعة الخاص بها، بدلاً من بيانات تعريفية أكثر كشفًا. هل يمكنك التفكير في أسباب أخرى قد تجعلك تشير إلى معرف مجموعة بدلاً من عناصر أخرى من المجموعة لتحديدها؟

تعرف على المزيد حول تقنيات التجميع في هذا الوحدة التعليمية.

البدء مع التجميع

يوفر Scikit-learn مجموعة كبيرة من الطرق لتنفيذ التجميع. يعتمد النوع الذي تختاره على حالتك. وفقًا للتوثيق، لكل طريقة فوائد مختلفة. إليك جدول مبسط للطرق المدعومة من Scikit-learn وحالات الاستخدام المناسبة لها:

اسم الطريقة حالة الاستخدام
K-Means غرض عام، استقرائي
Affinity propagation العديد من المجموعات غير المتساوية، استقرائي
Mean-shift العديد من المجموعات غير المتساوية، استقرائي
Spectral clustering مجموعات قليلة ومتساوية، استنتاجي
Ward hierarchical clustering العديد من المجموعات المقيدة، استنتاجي
Agglomerative clustering العديد من المجموعات المقيدة، مسافات غير إقليدية، استنتاجي
DBSCAN هندسة غير مسطحة، مجموعات غير متساوية، استنتاجي
OPTICS هندسة غير مسطحة، مجموعات غير متساوية بكثافة متغيرة، استنتاجي
Gaussian mixtures هندسة مسطحة، استقرائي
BIRCH مجموعة بيانات كبيرة مع نقاط شاذة، استقرائي

🎓 كيف ننشئ المجموعات يعتمد بشكل كبير على كيفية جمع نقاط البيانات في مجموعات. دعونا نوضح بعض المصطلحات:

🎓 'استنتاجي' مقابل 'استقرائي'

الاستنتاج الاستقرائي يعتمد على حالات تدريب ملاحظة تُطبق على قواعد عامة، بينما الاستنتاج الاستنتاجي يعتمد على حالات تدريب ملاحظة تُطبق على حالات اختبار محددة.

مثال: تخيل أن لديك مجموعة بيانات معنونة جزئيًا. بعض العناصر "أسطوانات"، وبعضها "أقراص مدمجة"، وبعضها فارغ. إذا اخترت نهجًا استقرائيًا، ستدرب نموذجًا يبحث عن "أسطوانات" و"أقراص مدمجة"، وتطبق هذه التصنيفات على البيانات غير المعنونة. هذا النهج سيواجه صعوبة في تصنيف الأشياء التي هي في الواقع "كاسيتات". أما النهج الاستنتاجي، فيتعامل مع هذه البيانات غير المعروفة بشكل أكثر فعالية حيث يعمل على تجميع العناصر المتشابهة معًا ثم يطبق تصنيفًا على المجموعة.

🎓 'هندسة غير مسطحة' مقابل 'مسطحة'

مشتقة من المصطلحات الرياضية، تشير الهندسة المسطحة إلى قياس المسافات بين النقاط باستخدام الطرق الإقليدية، بينما تشير الهندسة غير المسطحة إلى استخدام الطرق غير الإقليدية.

Flat vs Nonflat Geometry Infographic

إنفوجرافيك بواسطة Dasani Madipalli

🎓 'المسافات'

تُعرف المجموعات بمصفوفة المسافات الخاصة بها، أي المسافات بين النقاط. يمكن قياس هذه المسافة بطرق مختلفة. المجموعات الإقليدية تُعرف بمتوسط قيم النقاط، وتحتوي على "مركز" أو نقطة مركزية. تُقاس المسافات بناءً على المسافة إلى هذا المركز. المسافات غير الإقليدية تشير إلى "clustroids"، النقطة الأقرب إلى النقاط الأخرى.

🎓 'مقيدة'

التجميع المقيد يقدم التعلم "شبه الموجه" إلى هذه الطريقة غير الموجهة. يتم وضع قواعد على العلاقات بين النقاط مثل "لا يمكن الربط" أو "يجب الربط".

مثال: إذا تُركت خوارزمية حرة على مجموعة بيانات غير معنونة أو معنونة جزئيًا، قد تكون المجموعات الناتجة ذات جودة ضعيفة. إذا أُعطيت بعض القيود، مثل "يجب أن يكون العنصر مصنوعًا من البلاستيك"، يمكن أن يساعد ذلك في تحسين جودة المجموعات.

خوارزميات التجميع

هناك أكثر من 100 خوارزمية للتجميع، ويعتمد استخدامها على طبيعة البيانات المتاحة. دعونا نناقش بعض الخوارزميات الرئيسية:

  • التجميع الهرمي. إذا تم تصنيف كائن بناءً على قربه من كائن قريب بدلاً من كائن بعيد، يتم تشكيل المجموعات بناءً على المسافات بين أعضائها. التجميع التكتلي في Scikit-learn هو تجميع هرمي.

    Hierarchical clustering Infographic

    إنفوجرافيك بواسطة Dasani Madipalli

  • التجميع المركزي. يتطلب هذا الخوارزمية الشائعة اختيار "k"، أو عدد المجموعات المراد تشكيلها، وبعد ذلك تحدد الخوارزمية النقطة المركزية للمجموعة وتجمع البيانات حول تلك النقطة. التجميع باستخدام K-means هو نسخة شائعة من هذا النوع.

    Centroid clustering Infographic

    إنفوجرافيك بواسطة Dasani Madipalli

  • التجميع القائم على التوزيع. يعتمد على النمذجة الإحصائية، حيث يركز على تحديد احتمال انتماء نقطة بيانات إلى مجموعة معينة.

  • التجميع القائم على الكثافة. يتم تعيين نقاط البيانات إلى مجموعات بناءً على كثافتها، أو تجمعها حول بعضها البعض. النقاط البعيدة عن المجموعة تُعتبر شذوذًا أو ضوضاء.

  • التجميع القائم على الشبكة. بالنسبة لمجموعات البيانات متعددة الأبعاد، يتم إنشاء شبكة وتقسيم البيانات بين خلايا الشبكة، مما يؤدي إلى إنشاء مجموعات.

تمرين - تجميع بياناتك

التجميع كطريقة يعتمد بشكل كبير على التصور الصحيح، لذا دعونا نبدأ بتصور بيانات الموسيقى الخاصة بنا. سيساعدنا هذا التمرين في تحديد الطريقة الأكثر فعالية للتجميع التي يمكننا استخدامها لطبيعة هذه البيانات.

  1. افتح ملف notebook.ipynb في هذا المجلد.

  2. استورد حزمة Seaborn للحصول على تصور جيد للبيانات.

    !pip install seaborn
    
  3. أضف بيانات الأغاني من nigerian-songs.csv. قم بتحميل إطار بيانات يحتوي على بعض البيانات حول الأغاني. استعد لاستكشاف هذه البيانات عن طريق استيراد المكتبات وعرض البيانات:

    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
  4. احصل على بعض المعلومات حول إطار البيانات باستخدام الأمر info():

    df.info()
    

    الناتج يبدو كالتالي:

    <class 'pandas.core.frame.DataFrame'>
    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
    
  5. تحقق مرة أخرى من القيم الفارغة باستخدام الأمر isnull() وتأكد من أن المجموع يساوي 0:

    df.isnull().sum()
    

    يبدو جيدًا:

    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
    
  6. وصف البيانات:

    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. استخدم مخطط الأعمدة لمعرفة الأنواع الموسيقية الأكثر شعبية:

    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')
    

    الأكثر شعبية

إذا كنت ترغب في رؤية المزيد من القيم العليا، قم بتغيير [:5] إلى قيمة أكبر، أو قم بإزالتها لرؤية الكل.

لاحظ أنه عندما يتم وصف النوع الموسيقي الأعلى بأنه "Missing"، فهذا يعني أن Spotify لم يصنفه، لذا دعنا نتخلص منه.

  1. تخلص من البيانات المفقودة عن طريق تصفيتها:

    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')
    

    الآن تحقق مرة أخرى من الأنواع الموسيقية:

    الأكثر شعبية

  2. بشكل عام، الأنواع الموسيقية الثلاثة الأولى تهيمن على هذا الإطار. دعنا نركز على afro dancehall، afropop، و nigerian pop، بالإضافة إلى تصفية الإطار لإزالة أي قيمة شعبية تساوي 0 (مما يعني أنها لم تصنف بشعبية في الإطار ويمكن اعتبارها ضوضاء لأغراضنا):

    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')
    
  3. قم باختبار سريع لمعرفة ما إذا كانت البيانات ترتبط بطريقة قوية بشكل خاص:

    corrmat = df.corr(numeric_only=True)
    f, ax = plt.subplots(figsize=(12, 9))
    sns.heatmap(corrmat, vmax=.8, square=True)
    

    الارتباطات

    الارتباط القوي الوحيد هو بين energy و loudness، وهو ليس مفاجئًا جدًا، نظرًا لأن الموسيقى الصاخبة عادة ما تكون مليئة بالطاقة. بخلاف ذلك، الارتباطات ضعيفة نسبيًا. سيكون من المثير للاهتمام معرفة ما يمكن أن تفعله خوارزمية التجميع بهذه البيانات.

    🎓 لاحظ أن الارتباط لا يعني السببية! لدينا دليل على الارتباط ولكن ليس لدينا دليل على السببية. موقع ويب ممتع يحتوي على بعض الرسوم التي تؤكد هذه النقطة.

هل هناك أي تقارب في هذه البيانات حول شعبية الأغنية المتصورة وقابليتها للرقص؟ يظهر مخطط FacetGrid أن هناك دوائر متحدة المركز تتماشى، بغض النظر عن النوع الموسيقي. هل يمكن أن تكون الأذواق النيجيرية تتقارب عند مستوى معين من القابلية للرقص لهذا النوع الموسيقي؟

جرب نقاط بيانات مختلفة (مثل الطاقة، الصخب، الكلامية) والمزيد من الأنواع الموسيقية أو أنواع مختلفة. ماذا يمكنك أن تكتشف؟ ألق نظرة على جدول df.describe() لرؤية الانتشار العام لنقاط البيانات.

تمرين - توزيع البيانات

هل هذه الأنواع الثلاثة مختلفة بشكل كبير في تصور قابليتها للرقص بناءً على شعبيتها؟

  1. قم بفحص توزيع بيانات الأنواع الثلاثة العليا للشعبية وقابليتها للرقص على محور x و y معين.

    sns.set_theme(style="ticks")
    
    g = sns.jointplot(
        data=df,
        x="popularity", y="danceability", hue="artist_top_genre",
        kind="kde",
    )
    

    يمكنك اكتشاف دوائر متحدة المركز حول نقطة تقارب عامة، تظهر توزيع النقاط.

    🎓 لاحظ أن هذا المثال يستخدم مخطط KDE (تقدير كثافة النواة) الذي يمثل البيانات باستخدام منحنى كثافة احتمالية مستمر. هذا يسمح لنا بتفسير البيانات عند العمل مع توزيعات متعددة.

    بشكل عام، الأنواع الثلاثة تتماشى بشكل فضفاض من حيث شعبيتها وقابليتها للرقص. تحديد التجمعات في هذه البيانات المتراصة سيكون تحديًا:

    التوزيع

  2. قم بإنشاء مخطط مبعثر:

    sns.FacetGrid(df, hue="artist_top_genre", height=5) \
       .map(plt.scatter, "popularity", "danceability") \
       .add_legend()
    

    يظهر مخطط مبعثر لنفس المحاور نمطًا مشابهًا للتقارب.

    Facetgrid

بشكل عام، للتجميع، يمكنك استخدام المخططات المبعثرة لإظهار تجمعات البيانات، لذا فإن إتقان هذا النوع من التصور مفيد جدًا. في الدرس التالي، سنأخذ هذه البيانات المصفاة ونستخدم التجميع باستخدام k-means لاكتشاف مجموعات في هذه البيانات التي تبدو متداخلة بطرق مثيرة للاهتمام.


🚀تحدي

استعدادًا للدرس التالي، قم بإنشاء مخطط حول خوارزميات التجميع المختلفة التي قد تكتشفها وتستخدمها في بيئة الإنتاج. ما هي أنواع المشاكل التي تحاول خوارزميات التجميع معالجتها؟

اختبار ما بعد المحاضرة

المراجعة والدراسة الذاتية

قبل تطبيق خوارزميات التجميع، كما تعلمنا، من الجيد فهم طبيعة إطار البيانات الخاص بك. اقرأ المزيد عن هذا الموضوع هنا

هذه المقالة المفيدة تشرح لك الطرق المختلفة التي تتصرف بها خوارزميات التجميع المختلفة، بالنظر إلى أشكال البيانات المختلفة.

الواجب

ابحث عن تصورات أخرى للتجميع


إخلاء المسؤولية:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي Co-op Translator. بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.