Menu
CoddyTech
flag Ar iconالعربيةdown icon

رؤية 64 بُعدًا

جزء من قسم التعلّم غير الخاضع للإشراف في رحلة Machine Learning على Coddy. الدرس 29 من 51.

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

رقم 9 واحد مكتوب بخط اليد، أُعيد بناؤه خمس مرات: من رقمين يظهر كتمويه رمادي، ومن 5 و10 يظهر رقم 9 تقريبي، ومن 20 يظهر رقم 9 واضح، وفي النهاية صورة المسح الحقيقية ذات 64 بكسل

أولًا، ألقِ نظرة. يتكوّن المسح من 64 بكسلًا، ولا يحتوي أي مخطط على 64 محورًا، لذا يختزلها PCA إلى 2:

digits = load_digits()
X = digits.data
y = digits.target
points = PCA(n_components=2).fit_transform(X)
for d in range(10):
    ax.scatter(points[y == d, 0], points[y == d, 1], label=str(d))

لا يوجد مُقيِّس هنا: تشترك كل بكسلة في وحدة واحدة، وتتراوح قيمة الحبر من 0 إلى 16.

مسوح للأرقام تظهر كنقاط على مكوّنين، مع تسمية كل رقم عند مركزه: الأصفار في الأسفل، والأربعات في أقصى اليمين، والثلاثات في أقصى اليسار، والأرقام الأخرى في مناطق بينهما، مع بعض التداخل

لم يطّلع PCA على y قط؛ فهو يلوّن النقاط فحسب. ومع ذلك، تتجمع كلّ خانة في رقعتها الخاصة: كان هذا التنظيم موجودًا في وحدات البكسل.

challenge icon

التحدي

متوسط

يريد تطبيق للكتابة اليدوية للأطفال معرفة الأرقام التي قد يخلط الأطفال بينها. يقرأ البرنامج بعض الأرقام المكتوبة متتالية، مثل 358، في chosen.

  1. اختزل جميع الصور الـ1,797 إلى رقمين لكل صورة باستخدام PCA، وضعها في points.
  2. ارسم صور كل رقم مختار كنقاط متناثرة، مع تسمية النقاط بالرقم. أضف وسيلة إيضاح ثم اعرض الرسم.
  3. استدعِ report_closest(points, y, chosen).

بالنسبة إلى 046، يطبع البرنامج:

Closest on the map: 4 and 6 (13.6 apart)

ويرسم هذا. ثم يصف Coddy مخططك:

مخطط مبعثر بعنوان أرقام متشابهة، مع وسيلة إيضاح: الأصفار في الأسفل إلى اليسار، والستات في الأسفل في المنتصف، والأربعات في الأعلى إلى اليمين، والستات تلامس الأربعات

جرّب بنفسك

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA


# من قياس التشابه: تطبع الرقمين المختارين اللذين يقع مركزاهما على أقرب مسافة في الخريطة
def report_closest(points, y, chosen):
    best = -1
    for i in range(len(chosen)):
        for j in range(i + 1, len(chosen)):
            a = points[y == chosen[i]].mean(axis=0)
            b = points[y == chosen[j]].mean(axis=0)
            dist = np.sqrt(((a - b) ** 2).sum())
            if best == -1 or dist < best:
                best = dist
                pair = (chosen[i], chosen[j])
    print(f"Closest on the map: {pair[0]} and {pair[1]} ({best:.1f} apart)")


# 1,797 صورة ممسوحة ضوئيًا: تحتوي كل منها على 64 بكسل في X، والرقم المرسوم في y
digits = load_digits()
X = digits.data
y = digits.target

# الأرقام المطلوب مقارنتها، تُكتب متتاليةً مثل 358
chosen = []
for ch in input():
    chosen.append(int(ch))

# لا تغيّر الأسطر أدناه
fig, ax = plt.subplots()
ax.set_title("Digits that look alike")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

# اكتب شيفرتك أدناه
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس التعلّم غير الخاضع للإشراف

تدرّب بنفسك: مترجم Python عبر الإنترنت