מכונות וקטור תמיכה (SVMs) הן מחלקה של מודלים של למידה בפיקוח המשמשת לסיווג וניתוח רגרסיה. הרעיון הבסיסי מאחורי SVMs הוא למצוא את המישור האופטימלי המפריד בצורה הטובה ביותר בין נקודות הנתונים של מחלקות שונות. וקטורי התמיכה הם מרכיבים חשובים בהגדרת גבול החלטה זה. תגובה זו תבהיר את תפקידם של וקטורי תמיכה ב-SVMs, את זיהוים במהלך תהליך ההכשרה, ותספק הבנה מקיפה של משמעותם.
תפקיד וקטורי תמיכה בהגדרת גבול ההחלטה
ב-SVM, גבול ההחלטה הוא היפר-מישור המפריד בין מחלקות נקודות הנתונים. המישור האופטימלי הוא זה שממקסם את המרווח בין המחלקות. השוליים מוגדרים כמרחק בין ההיפר-מישור לנקודות הנתונים הקרובות ביותר מכל אחת מהמחלקות. נקודות הנתונים הקרובות ביותר הללו ידועות בתור וקטורי תמיכה. הם מרכזיים מכיוון שהם משפיעים ישירות על המיקום והכיוון של המישור.
1. מקסימום שוליים: המטרה העיקרית של SVM היא למקסם את המרווח בין המחלקות. השוליים מוגדרים על ידי המרחק לוקטורי התמיכה הקרובים ביותר. על ידי מיקסום מרווח זה, ה-SVM שואף לשפר את יכולת ההכללה של המודל, ובכך להפחית את הסבירות להתאמת יתר.
2. הגדרת ה-Hyperplane: ניתן לכתוב את המשוואה של מישור ההיפר במרחב דו מימדי כ , שם
הוא וקטור המשקל,
הוא וקטור הקלט, ו
הוא מונח ההטיה. וקטורי התמיכה הם נקודות הנתונים שנמצאות הכי קרוב למישור ההיפר ומקיימות את התנאי
, שם
הוא תווית המחלקה של וקטור התמיכה
. נקודות אלו הן קריטיות כי הן מגדירות את הפרמטרים
ו
של המישור ההיפר.
3. השפעה על גבול ההחלטה: אם וקטורי התמיכה יוזזו, המיקום של היפר-מישור ישתנה. הסיבה לכך היא שווקטורי התמיכה הם הנקודות המשמשות לחישוב השוליים. נקודות נתונים אחרות שאינן וקטורים תומכים אינן משפיעות על גבול ההחלטה באופן ישיר.
זיהוי וקטורי תמיכה במהלך אימון
תהליך האימון של SVM כולל פתרון בעיית אופטימיזציה ריבועית עם אילוצים. המטרה היא למצוא את וקטור המשקל והטיה
שממקסמים את המרווח תוך סיווג נכון של נתוני האימון. ניתן לנסח זאת כך:
ניתן לפתור בעיית אופטימיזציה זו באמצעות טכניקות כגון אלגוריתם Sequential Minimal Optimization (SMO) או באמצעות פותרי תכנות ריבועיים. במהלך תהליך זה, וקטורי התמיכה מזוהים באופן הבא:
1. מכפילי לגראנז': בעיית האופטימיזציה נפתרת לרוב בשיטת מכפילי לגראנז'. הצורה הכפולה של בעיית האופטימיזציה מציגה מכפילי לגראנז' עבור כל אילוץ. הבעיה הכפולה ניתנת על ידי:
איפה הוא פרמטר רגוליזציה השולט בפשרה בין מקסום המרווח לבין מזעור טעות הסיווג.
2. תמיכה בזיהוי וקטור: וקטורי התמיכה הם נקודות הנתונים שעבורן מכפילי הלגרנז' המתאימים אינם אפס. נקודות אלו נמצאות בשוליים ומקיימות את התנאי
. וקטור המשקל
ניתן לבטא במונחים של וקטורי התמיכה כ:
3. חישוב מונח הטיה: מונח ההטיה מחושב באמצעות וקטורי התמיכה. לכל וקטור תמיכה
, ניתן לחשב את ההטיה כך:
זה מבטיח שהמישור היפר מסווג נכון את וקטורי התמיכה.
דוגמה
שקול מערך נתונים פשוט דו מימדי עם שתי מחלקות. ניתן לייצג את נקודות הנתונים באופן הבא:
כיתה 1:
כיתה 2:
מטרת ה-SVM היא למצוא את המישור האופטימלי המפריד בין שתי המחלקות הללו. במהלך תהליך האימון, ה-SVM מזהה את וקטורי התמיכה, שהם הנקודות הקרובות ביותר למישור ההיפר. במקרה זה, וקטורי התמיכה עשויים להיות מכיתה 1 ו
מכיתה 2. נקודות אלו ישמשו להגדרת המישור וחישוב השוליים.
ניסוח מתמטי
הצורה הראשונית של בעיית האופטימיזציה של SVM היא:
הצורה הכפולה היא:
וקטורי התמיכה מזוהים על ידי מכפילי לגראנז' שאינם אפס . וקטור המשקל
מחושב כך:
מונח ההטיה מחושב באמצעות וקטורי התמיכה:
יישום ב-Python
כדי ליישם SVM מאפס ב- Python, יש לבצע את השלבים הבאים:
1. הכנת נתונים: טען ועבד מראש את מערך הנתונים.
2. פונקציית ליבה: הגדר את פונקציית הליבה (למשל, ליניארי, פולינום, RBF).
3. אופטימיזציה: פתור את בעיית האופטימיזציה הכפולה באמצעות פותר תכנות ריבועי או אלגוריתם איטרטיבי כמו SMO.
4. תמיכה בזיהוי וקטור: זהה את וקטורי התמיכה בהתבסס על מכפילי לגראנז'.
5. חישוב היפר-מישור: חשב את וקטור המשקל ומונח הטיה
.
6. נבואה: השתמש במישור ההיפר כדי לסווג נקודות נתונים חדשות.
הנה יישום פשוט של SVM ליניארי מאפס:
python import numpy as np from cvxopt import matrix, solvers class SVM: def __init__(self, C=1.0): self.C = C self.w = None self.b = None self.support_vectors = None def fit(self, X, y): n_samples, n_features = X.shape # Calculate the Gram matrix K = np.dot(X, X.T) # Set up the parameters for the quadratic programming solver P = matrix(np.outer(y, y) * K) q = matrix(-np.ones(n_samples)) G = matrix(np.vstack((-np.eye(n_samples), np.eye(n_samples)))) h = matrix(np.hstack((np.zeros(n_samples), np.ones(n_samples) * self.C))) A = matrix(y, (1, n_samples), 'd') b = matrix(0.0) # Solve the quadratic programming problem solution = solvers.qp(P, q, G, h, A, b) alphas = np.ravel(solution['x']) # Identify the support vectors support_vector_indices = alphas > 1e-5 self.support_vectors = X[support_vector_indices] self.alphas = alphas[support_vector_indices] self.sv_y = y[support_vector_indices] # Calculate the weight vector self.w = np.sum(self.alphas[:, None] * self.sv_y[:, None] * self.support_vectors, axis=0) # Calculate the bias term self.b = np.mean(self.sv_y - np.dot(self.support_vectors, self.w)) def predict(self, X): return np.sign(np.dot(X, self.w) + self.b) # Example usage X = np.array([[1, 2], [2, 3], [3, 3], [6, 6], [7, 7], [8, 8]]) y = np.array([-1, -1, -1, 1, 1, 1]) svm = SVM(C=1.0) svm.fit(X, y) predictions = svm.predict(X) print(predictions)
בדוגמה זו, המחלקה 'SVM' מגדירה את מודל ה-SVM, ושיטת ה-'fit' מאמנת את המודל על ידי פתרון בעיית האופטימיזציה הכפולה. וקטורי התמיכה מזוהים על סמך מכפילי לגראנז', וקטור המשקל ומונח ההטיה מחושבים בהתאם. לאחר מכן נעשה שימוש בשיטת ה'ניבוי' לסיווג נקודות נתונים חדשות. וקטורי תמיכה ממלאים תפקיד קריטי בהגדרת גבול ההחלטה של SVM. הן נקודות הנתונים הקרובות ביותר למישור ההיפר ומשפיעות ישירות על מיקומו והכיוון שלו. במהלך תהליך האימון, וקטורי תמיכה מזוהים באמצעות אופטימיזציה של פונקציית המטרה של SVM, והם משמשים לחישוב וקטור המשקל ומונח ההטיה המגדירים את מישור ההיפר. הבנת המשמעות של וקטורי תמיכה חיונית כדי להבין כיצד SVM משיגים את מטרות הסיווג שלהם ולהטמעת SVM מאפס ב-Python.
שאלות ותשובות אחרונות אחרות בנושא השלמת SVM מאפס:
- בהקשר של אופטימיזציה של SVM, מהי המשמעות של וקטור המשקל `w` והטיה `b` וכיצד הם נקבעים?
- מהי המטרה של שיטת ה-'visualize' ביישום SVM, וכיצד היא עוזרת בהבנת ביצועי המודל?
- כיצד שיטת ה'ניבוי' ביישום SVM קובעת את הסיווג של נקודת נתונים חדשה?
- מהי המטרה העיקרית של Support Vector Machine (SVM) בהקשר של למידת מכונה?