יום חמישי, 28 ביוני 2012

תחרות אלגוריתמים ל-Big Data


מרכז המצוינות של EMC ישראל מכריז היום על פתיחת תחרות ה- Big Data הראשונה מסוגה בארץ ל-Data Scientists (מדעני נתונים) . התחרות, הנושאת פרס כספי בסך עשרת אלפים דולר, פתוחה לכל קהיליית מדעני הנתונים באמצעות אתר האינטרנט Kaggle.com עד הראשון באוגוסט 2012.

מטרת התחרות, הפתוחה ליחידים, קבוצות (עד חמישה איש) וסטארטאפים, אשר יזם ומוביל מרכז המצוינות, היא להגדיל את המודעות בתעשייה המקומית לתחום ה- Big Data בכלל ולתחום העיסוק של מדעני הנתונים בפרט, וכן לתרום לתעשייה עם פרסומם של אלגוריתמים חדשניים.  EMC ישראל קוראת לכל בעל רקע וניסיון ב-machine learning , מדעי המתמטיקה, הסטטיסטיקה והמחשב, כלכלה ופיסיקה, וכל אחד אחר, לנסות מזלו בפתרון האתגר שיחכה לו באתר.

המתחרים יקבלו בסיס נתונים אמתי מתוך קוד מקור פתוח של מאות אלפי קבצים , ויוצג להם אתגר המבוסס על זיהוי אוטומטי של תכנים, במטרה לפצח את האלגוריתם האידיאלי. ועדת השיפוט אשר תפקח על התחרות ותבחר בזוכה על פי קריטריונים קבועים מראש, כוללת שלושה מומחים בתחום מדע הנתונים ממרכז המצוינות של EMC בישראל ונציג מהאקדמיה בתחום machine learning.

יום רביעי, 6 ביוני 2012

ספירת הזמנות במחיר מינימום לפריט

בפוסט באתר dwh.co.il הועלתה השאלה הבאה:
כיצד להציג טבלה ובה עבור כל מוצר, ספירה של ההזמנות שבהן אותו מוצר נמכר במחיר הנמוך ביותר?
למשל: מוצר "כובע מצחיה" נמכר ב-92 הזמנות במחיר 12 ש"ח, ב-36 הזמנות במחיר 14 ש"ח, ואילו ב-45 הזמנות במחיר 13 ש"ח. הטבלה צריכה להציג עבור מוצר זה את הערך 92, כי זוהי כמות ההזמנות שבהן נמכר המוצר במחיר הנמוך ביותר (12 ש"ח).
הצורך הוא שהחישוב יהיה דינמי, ולכן חישוב בסקריפט איננו מתאים.
הנטייה הטבעית היא לנסות להשתמש בפונקציית Aggr אשר יודעת להתחשב גם באגרגציה של הפריט הנוכחי וגם באגרגציה של פריטים מקבילים. ואולם במקרה זה פונקציה זו לא תועיל, כיוון שאנו לא מחפשים את המחיר אלא את מספר ההזמנות של מחיר זה.
ניסיון לחשוב "מחוץ לקופסה" הביא אותי להפוך את הערכים המרובים למחרוזת טקסט, ובמישור זה להתמודד עם הבעיה.
כמובן, קבעתי את Product בתור מימד, ולאחר מכן הרכבתי את הביטוי אשר יתייחס אל Product.
ראשית, הביטוי צריך להכיר את כלל המחירים שבהם נמכר המוצר בכל ההזמנות (כולל מופעים כפולים בהזמנות שונות). זאת ניתן לבצע בעזרת הפונקציה Concat, אשר יודעת לשרשר ערכים מרובים למחרוזת טקסט בודדת. ולכן, הגדרתי תחילה בתור ביטוי:
Concat(PriceInOrder,'_')
השימוש בקו התחתון הוא כדי שתהיה הפרדה בין כל מחיר ומחיר.
מול המחרוזת הארוכה שהיא תוצאת הביטוי הנ"ל, יש להעמיד את מחיר המינימום שבו נמכר פריט זה, כלומר הביטוי
Min(PriceInOrder)
כעת, מה שנשאר הוא לספור כמה פעמים מופיע הביטוי השני (מחיר המינימום) בתוך הביטוי הראשון (כלל המחירים)!
אם-כן הביטוי המלא הוא:
SubstringCount(Concat(PriceInOrder,'_') & '_', min(PriceInOrder) & '_')
יש לשים לב שבחלק של מחיר המינימום הוספנו קו תחתון, כיוון שאנו רוצים לוודא שישנה התאמה מלאה של המספרים (ולא שתימצא התאמה בין 12 ל-122, למשל). גם לחלק של ה-Concat הוספנו בסופו קו תחתון, וזאת מכיוון שאנו רוצים שהחיפוש יתבצע גם על האבר האחרון ששורשר ב-Concat (והפונקציה עצמה אינה מוסיפה את ה-Delimiter בסוף האיברים אלא רק ביניהם).

זה עובד! הטבלה מציגה עבור כל פריט, את כמות ההזמנות שבהן נמכר הפריט במחיר המינימום.