DR. IGOR DATA SCIENCEAI, Data & Creativity · From Data to Impact
גרסת מרצה — הכול פתוח
תרגיל בית · שיעור 1

וקטורים עם פתרונות מוסתרים

נסו לבד, פתחו רמז בהדרגה, ורק לאחר ניסיון אמיתי פתחו את הפתרון.

לתרגילים
שאלה
ניסיון
רמז
פתרון
Python
Take-home
01

איך לעבוד נכון

לא לפתוח מיד את הפתרון.

1. הגדירו את העצמים

מהו כל וקטור ומה מייצג כל רכיב?

2. בדקו ממדים

לפני חיבור, חיסור או מכפלה פנימית.

3. בדקו את התוצאה

האם היא וקטור או סקלר? האם היחידות מתאימות?

02

תרגילי הבית

1.4, 1.6, 1.9, 1.16.

Boyd 1.4

צריכת אנרגיה מחזורית

וקטור \(w\in\mathbb{R}^{168}\) מתאר צריכת חשמל שעתית של מפעל במשך שבוע, החל מיום ראשון בחצות. דפוס הצריכה חוזר בכל יום, כלומר:

\[w_{t+24}=w_t,\qquad t=1,\ldots,144\]

הווקטור \(d\in\mathbb{R}^{24}\) מתאר יום אחד, החל מחצות.

  1. הביעו את \(w\) באמצעות \(d\).
  2. הביעו את \(d\) באמצעות \(w\).
עצרו וחשבו: כמה בלוקים של 24 שעות יש ב-168 שעות? ואיזה slice של \(w\) מכיל יום מלא אחד?
רמז 1
168 = 7·24.
רמז 2
הווקטור השבועי מתקבל מ-stacking של אותו וקטור יום שבע פעמים.
פתרון מלא
\[ w=(d,d,d,d,d,d,d) \] \[ d=w_{1:24} \]

אפשר לבחור גם כל יום אחר, למשל \(d=w_{25:48}\), מפני שהדפוס זהה בכל יום.

בדיקה ב-Python
NumPyperiodic weekly vector
import numpy as np

d = np.arange(24)
w = np.tile(d, 7)

print(w.shape)      # (168,)
print(np.array_equal(d, w[:24]))  # True
טעות נפוצה
לכתוב \(w=7d\). זה מכפיל את הערכים ב-7 במקום לחבר שבעה בלוקים.
Take-home message
חזרה מחזורית מיוצגת באמצעות stacking; חילוץ מחזור אחד נעשה באמצעות slicing.
הערת הוראה
בקשו מהסטודנטים להבדיל במילים בין \(7d\) לבין \((d,d,\ldots,d)\).
Boyd 1.6

וקטור הפרשים

עבור \(x\in\mathbb{R}^n\), נגדיר את וקטור ההפרשים \(d\in\mathbb{R}^{n-1}\):

\[ d=(x_2-x_1,\ x_3-x_2,\ldots,x_n-x_{n-1}) \]

הביעו את \(d\) באמצעות פעולות וקטוריות ו-slicing.

עצרו וחשבו: בנו שני תת-וקטורים באותו אורך: אחד מתחיל ב-\(x_2\), והשני מתחיל ב-\(x_1\).
רמז 1
שני הווקטורים צריכים להיות באורך \(n-1\).
רמז 2
חסרו \(x_{1:n-1}\) מן הווקטור \(x_{2:n}\).
פתרון מלא
\[ d=x_{2:n}-x_{1:n-1} \]

האיבר הראשון הוא \(x_2-x_1\), השני הוא \(x_3-x_2\), וכן הלאה.

בדיקה ב-Python
NumPylag-1 differences
import numpy as np

x = np.array([10, 13, 12, 20, 25])
d = x[1:] - x[:-1]

print(d)  # [ 3 -1  8  5]
טעות נפוצה
לכתוב x[1:] - x[1:], שמחזיר אפסים, או להשתמש ב-slices באורכים שונים.
Take-home message
הפרשים עוקבים מתקבלים מחיסור שני slices מוזזים באורך זהה.
הערת הוראה
בקשו לכתוב את שני ה-slices במפורש לפני החיסור.
Boyd 1.9

וקטור סימפטומים

וקטור בינארי \(s\in\mathbb{R}^{20}\) מתאר נוכחות של 20 סימפטומים. \(s_i=1\) אם הסימפטום קיים, ו-\(s_i=0\) אחרת.

  1. הביעו את מספר הסימפטומים הכולל.
  2. הביעו את הטענה: למטופל יש בדיוק חמישה מתוך עשרת הסימפטומים הראשונים.
עצרו וחשבו: איזה וקטור משקל סופר את כל האיברים? ואיזה וקטור משקל בוחר רק את עשרת המקומות הראשונים?
רמז 1
וקטור אחדים סוכם את כל האיברים.
רמז 2
השתמשו במסכה \(a=(\mathbf1_{10},\mathbf0_{10})\).
פתרון מלא
\[ \text{מספר הסימפטומים}=\mathbf1^Ts \] \[ a^Ts=5,\qquad a=(\mathbf1_{10},\mathbf0_{10}) \]
בדיקה ב-Python
NumPybinary mask
import numpy as np

s = np.array([1,0,1,1,0,1,0,1,0,0, 1,0,0,0,0,0,0,0,0,0])
total = s.sum()
first_ten = s[:10].sum()

print(total)
print(first_ten)
טעות נפוצה
לבדוק רק אם \(s_1+\cdots+s_{10}\ge5\). המילה 'בדיוק' דורשת שוויון ל-5.
Take-home message
וקטור אחדים סוכם; מסכה בינארית בוחרת תת-קבוצה.
הערת הוראה
שאלו מה ההבדל בין 'לפחות חמישה' לבין 'בדיוק חמישה'.
Boyd 1.16

מכפלה פנימית של וקטורים אי-שליליים

וקטור נקרא אי-שלילי אם כל איבריו אינם שליליים.

  1. הסבירו מדוע המכפלה הפנימית של שני וקטורים אי-שליליים אינה שלילית.
  2. אם המכפלה הפנימית שווה לאפס, מה ניתן להסיק על דפוסי האפסים והאיברים החיוביים?
עצרו וחשבו: פרקו את המכפלה הפנימית לסכום של איברים. מה הסימן של כל מכפלה \(x_ky_k\)?
רמז 1
אם \(x_k\ge0\) ו-\(y_k\ge0\), אז \(x_ky_k\ge0\).
רמז 2
סכום של מספרים אי-שליליים שווה לאפס רק אם כל אחד מהם שווה לאפס.
פתרון מלא

לכל \(k\), מתקיים \(x_ky_k\ge0\), ולכן:

\[ x^Ty=\sum_{k=1}^{n}x_ky_k\ge0 \]

אם \(x^Ty=0\), כל איבר בסכום חייב להיות אפס:

\[ x_ky_k=0\qquad\forall k \]

כלומר, בכל מקום לפחות אחד משני הערכים הוא אפס. לא ייתכן שבאותו אינדקס שני הווקטורים חיוביים. במונחי תמיכות:

\[ \operatorname{supp}(x)\cap\operatorname{supp}(y)=\varnothing \]
בדיקה ב-Python
NumPydisjoint support
import numpy as np

x = np.array([2, 0, 3, 0])
y = np.array([0, 5, 0, 7])

print(x @ y)  # 0
print((x > 0) & (y > 0))  # [False False False False]
טעות נפוצה
להסיק שאחד הווקטורים כולו אפס. ייתכן ששניהם אינם אפס, אך האיברים החיוביים נמצאים במקומות שונים.
Take-home message
עבור וקטורים אי-שליליים, מכפלה פנימית אפסית פירושה תמיכות זרות.
הערת הוראה
ציירו שתי שורות של אינדקסים וסמנו באילו מקומות כל וקטור חיובי.