Menu
CoddyTech

לראות 64 ממדים

חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 29 מתוך 51.

בפרק הזה ניישם את PCA על ספרות בכתב יד. בסופו תצמצמו סריקה לכמה מספרים ותבנו אותה מחדש:

ספרה 9 אחת בכתב יד, שנבנתה מחדש חמש פעמים: מתוך 2 מספרים מתקבל טשטוש אפור, מתוך 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.

סריקות של ספרות כנקודות בשני רכיבים, כל ספרה מסומנת במרכז שלה: האפסים בתחתית, הספרות 4 בקצה הימני, הספרות 3 בקצה השמאלי, ושאר הספרות באזורים שביניהן, חלקן חופפות

PCA לא ראה את y; הוא רק צובע את הנקודות. ובכל זאת, כל ספרה מתקבצת באזור משלה: המבנה היה בפיקסלים.

challenge icon

אתגר

בינוני

אפליקציית כתב יד לילדים רוצה לדעת אילו ספרות ילדים עלולים לבלבל ביניהן. התוכנית קוראת כמה ספרות שהוקלדו יחד כמו 358 לתוך chosen.

  1. צמצמו את כל 1,797 הסריקות ל-2 מספרים לכל אחת באמצעות 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


# מתוך Measuring Similarity: מדפיס את שתי הספרות שנבחרו שמרכזיהן הקרובים ביותר זה לזה במפה
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 אונליין