יום חמישי, 21 ביולי 2016

טיפוס סימפטי

בגרסת R2013b נוסף לסביבת MATLAB טיפוס נתונים חדש, categorical. על אף שחלפו מאז קרוב לשלוש שנים, לא רבים עושים בו שימוש, כנראה מכיוון שלא נחשפו עדיין ליתרונות הרבים של השימוש בו (מסומנים בצהוב בהמשך הפוסט). אז הנה סקירה קצרה...

נניח שיש לנו אוסף של נתונים המכיל, בין היתר, נתונים שהערכים שלהם מגיעים מתוך סט סופי של אפשרויות (הערה – אוסף הנתונים יכול להיות מורכב כולו מכאלה נתונים).

למשל, נסתכל על הטבלה a (גם table הוא טיפוס נתונים שהתווסף בגרסת R2013b). הטבלה מכילה נתונים נומרים על מדידות שונות (שתי העמודות השמאליות), וכן החלטה על הצלחה או כישלון של ניסוי (עמודה ימנית).



ניתן להפעיל את פקודת whos על המשתנה a, ולהתרשם שגודלו הינו 2418 bytes.

הצלחה או כשלון של ניסוי – זה כמובן נתון שהערך שלו מגיע מתוך סט סופי של אפשרויות, ועל כן ניתן להמיר את העמודה הזו, אשר הינה מטיפוס נתונים מסוג cell, לטיפוס מידע מסוג categorical. הנ"ל מתבצע באמצעות הפקודה הבאה (נא לשים לב להבדל לעומת הטבלה אשר הובאה למעלה):



הפעלה של פקודת whos על המשתנה a כעת, מראה שגודלו נהיה קטן יותר בעקבות הפעולה, והוא כעת 2169 bytes. לכאורה זה נראה כרווח זניח, אך אם מסתכלים רק על העמודה הימנית – מגלים שגודלה כעת הינו 58% מגודלה המקורי, וכמובן שאם העמודה הימנית היתה מורכבת ממספר גדול יותר של איברים, החסכון ב-bytes היה גדול יותר, שכן משתנה מסוג categorical צריך לאחסן מספר מצומצם של ערכים אפשריים, ולכן צורך פחות זיכרון ממערכים נומריים או ממערכים של מחרוזות (strings).

למען הסר ספק, משתנה categorical יכול להכיל יותר משתי אפשרויות, לדוגמה:




במקרים בהם המידע רב, ורוצים לדעת במהירות מה אוסף האפשרויות של משתנה ה- categorical, כל מה שנדרש לעשות הוא להשתמש בפקודה categories:




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




ניתן לשלוט על שמות הקטגוריות על ידי הכנסתם בתור קלטים נוספים לפונקציה categorical, וניתן אפילו להגדיר היררכיה בנתונים. למשל, אם הערך "1" שקול למידה "small", הערך "2" למידה "medium", והערך "3" למידה "large", ניתן להגדיר משתנה שבו יהיה ל-MATLAB ברור ש"small" קטן מ-"medium", ו-"medium" קטן מ-"large". לדוגמה (אפשר ללחוץ על התמונה להגדלה):




ובדיקה האם האיבר השני אכן גדול מהאיבר הראשון, תניב (כצפוי) תוצאה שלילית:




יש לטיפוס הנתונים categorical יתרונות נוספים, למשל, ניתן בעזרתו להפעיל כל מיני פונקציות עזר דוגמת gscatter (הצגת scatter plot של השורות השונות במידע שלנו, תוך הבדלה ויזואלית בין נקודות מקטגוריות שונות).

למעוניינים במידע נוסף על טיפוס הנתונים הסימפטי הזה – לחצו פה.