SVM یا ماشین بردار پشتیبان، در یک صورت طبقهبندی خطی به دنبال مرزی با حاشیه جداسازی مناسب است. فقط جداکردن نمونههای آموزش کافی نیست: ممکن است چند مرز همه آنها را درست جدا کنند، اما فاصلهشان از نزدیکترین نمونهها متفاوت باشد. با یک مثال یکبعدی میتوان معنی حاشیه و بردار پشتیبان را بدون حلگر عددی دید.
دادهای که کاملاً جداشدنی است
کلاس منفی را نقاط منفی ۳ و منفی ۱، و کلاس مثبت را ۲ و۴ میگیریم. این برچسبها فقط برای آموزشاند. هر مرزی بین منفی ۱ و۲ میتواند چهار نقطه را جدا کند، اما مرز ۰٫۵ در وسط فاصله نزدیکترین دو کلاس قرار دارد و کمترین فاصله تا دو طرف را بیشینه میکند.
| مرز پیشنهادی | فاصله تا نزدیکترین نمونه منفی | فاصله تا نزدیکترین مثبت | کوچکترین فاصله |
|---|---|---|---|
| −۰٫۵ | ۰٫۵ | ۲٫۵ | ۰٫۵ |
| 0 | 1 | 2 | 1 |
| ۰٫۵ | ۱٫۵ | ۱٫۵ | ۱٫۵ |
| 1 | 2 | 1 | 1 |
| ۱٫۵ | ۲٫۵ | ۰٫۵ | ۰٫۵ |
در این داده مرتب و جداشدنی، بیشینهکردن فاصله نزدیکترین طرف، همان انتخاب وسط شکاف است. این راهحل تحلیلی یکبعدی است؛ کد زیر حلکننده SVM برای هر آرایش چندبعدی یا داده غیرجداشدنی نیست.
مرز را به امتیاز خطی بنویسیم
امتیاز f(x)=w×x+b را با w=۲÷۳ و b=−۱÷۳ انتخاب میکنیم. در x=۰٫۵ امتیاز صفر است. نقطه منفی ۱ امتیاز منفی ۱ و نقطه مثبت ۲ امتیاز مثبت ۱ میگیرد. این دو نقطه روی حاشیهاند و در همین مثال، بردارهای پشتیبان هستند. نقاط منفی ۳ و۴ دورتر قرار دارند.
با قرارداد برچسبهای −۱ و+۱، حاصل y×f(x) برای چهار نقطه بهترتیب ۷÷۳،۱،۱ و۷÷۳ است. این «حاشیه تابعی» با فاصله هندسی خام یکی نیست؛ برای فاصله تا مرز، امتیاز بر اندازه وزن تقسیم میشود. عرض کامل میان دو خط یا نقطه حاشیه برابر ۲÷|w|=۳ است، و فاصله مرز مرکزی تا هر طرف ۱٫۵ میشود.
کد محاسبه و کنترل قیدها
negative=[-3.0,-1.0]
positive=[2.0,4.0]
left,right=max(negative),min(positive)
if left>=right:
raise ValueError('this ordered hard-margin example is not separable')
boundary=(left+right)/2
w=2/(right-left)
b=-w*boundary
points=[(x,-1) for x in negative]+[(x,1) for x in positive]
functional=[label*(w*x+b) for x,label in points]
support=[x for (x,_),m in zip(points,functional) if abs(m-1)<1e-12]
print('boundary,w,b',boundary,w,b)
print('functional margins',functional)
print('support',support,'full geometric margin',2/abs(w))
for t in [-0.5,0.0,0.5,1.0,1.5]:
margin=min(t-left,right-t)
print('candidate boundary',t,'nearest distance',margin)
assert boundary==0.5 and support==[-1.0,2.0]
assert abs(2/abs(w)-3.0)<1e-12
assert min(functional)>=1-1e-12عدد امتیاز در این قطعه احتمال نیست؛ مثلاً امتیاز ۷÷۳ نباید به ۲۳۳ درصد احتمال تبدیل شود. کلاس از علامت امتیاز تعیین میشود و رفتار دقیق امتیاز صفر نیز باید در یک برنامه واقعی مشخص باشد.
وقتی داده همپوشان است چه؟
مثال بالا حاشیه سخت و جدایی کامل دارد. در صورت عمومیِ حاشیه نرم، نقض حاشیه با ضریب جریمهای مانند C وارد هدف میشود. انتخاب C و تبدیل ویژگیها به آزمون نیاز دارد. آن را از جدول چهار نقطه حدس نزنید. همچنین هسته یا Kernel، تابع مقایسهای دیگری وارد مدل میکند؛ وجود آن به معنی حل خودکار هر مسئله غیرخطی نیست.
برای حساسیت فاصله به واحد ویژگی، مثال مقیاس در KNN مکمل است؛ روش تصمیم SVM را با رأی همسایهها یکی نگیرید. رگرسیون لجستیک هم نمونهای است که امتیاز خطی را با تابع مشخص به احتمال مدل تبدیل میکند.
قدم بعد برای ارزیابی
تعریف برچسب، نمونههای مرزی و داده مستقل را نگه دارید. اگر مسئله شما ارجاع درخواست یا پاسخگویی مشتری است، نمونههای مجاز را برای بررسی مسیر مناسب با اپرا آماده کنید. این آموزش، SVM را فناوری تأییدشده محصول یا مرزی قابل استفاده مستقیم برای پروندههای واقعی معرفی نمیکند.
فایل تمرین و منابع
دریافت کد کامل این تمرین؛ این فایل فقط از کتابخانه استاندارد پایتون استفاده میکند. ورودیهای آن ساختگی و برای بازتولید محاسبهاند؛ اجرای آموزشی آن نتیجه یک محصول یا مشتری را نشان نمیدهد.
تاریخ بررسی منابع: ۳ نوامبر ۲۰۲۶. منابع، مرجع روشاند؛ دادهها، اعداد و کد مثال برای همین راهنما طراحی شدهاند.