- Giriş
SVM’ de sınıflandırma 2 sınıf arasında hiperdüzlem oluşturarak bu düzlemler arası marjini en büyük olan seçilerek sınıflandırma yapılır. En büyük hiperdüzlemi çizebilmek için her iki sınıfa da yakın farklı 2 paralel doğru çizilebilir. Bu doğrulara destek vektörleri adı verilir. İki doğru arasındaki uzaklık ise marjin genişliği olarak adlandırılır.

Şekil 1.1′ de görüleceği gibi wx+b destek vektörünün -1’e eşit veya küçük olması durumunda bir sınıfa, wx+b vektörünün 1’e eşit veya büyük olması durumunda da bir diğer sınıfa ayrılmıştır.
Python’da sklearn kütüphanesini kullanarak SVM’yi şu şekilde kodlayabiliriz:
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from sklearn.datasets.samples_generator import make_blobs
X,y=make_blobs(n_samples=50,centers=2,random_state=0,cluster_std=0.6)
x=np.linspace(-1,5)
plt.scatter(X[:,0],X[:,1],c=y,s=30,cmap="Accent")
plt.plot([0.6],[1.95],"x",color="red",markeredgewidth=2,markersize=8)
for w,b in [(0.6,0.75),(0.6,1.375),(0.6,2)]:
plt.plot(x,w*x+b,"-k")
plt.xlim(-1,5)
plt.show()
çıktı olarak Şekil 1.2’yi elde ederiz.

1.1 SVM Eğitme
Python makine öğrenmesi için hazır modüller sunuyor. Direkt bunları kullanarak bir modeli eğitelim ve eğitilen model için yeni veriler girerek verileri sınıflandıralım.
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
X,y=make_blobs(centers=2,random_state=0,cluster_std=0.7)
model = SVC(kernel='linear', C=1050)
model.fit(X, y)
def svc(model,ax=None):
xlim=ax.get_xlim()
ylim=ax.get_ylim()
x=np.linspace(xlim[0],xlim[1])
y=np.linspace(ylim[0],ylim[1])
Y,X= np.meshgrid(y,x)
xy=np.vstack([X.ravel(),Y.ravel()]).T
P=model.decision_function(xy).reshape(X.shape)
ax.contour(X,Y,P,colors="r",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
def svm(N=20, ax=None):
X, y = make_blobs( centers=2,
random_state=0, cluster_std=0.70)
X = X[:N]
y = y[:N]
model = SVC(kernel='linear', C=18)
model.fit(X, y)
ax = ax or plt.gca()
ax.scatter(X[:, 0], X[:, 1], c=y, s=80, cmap='Accent')
ax.set_xlim(-1, 4)
ax.set_ylim(-1, 7)
svc(model, ax)
fig, ax = plt.subplots(2, 1, figsize=(8, 6))
for axi, N in zip(ax, [40, 55]):
svm(N, axi)
axi.set_title('Veri = {0}'.format(N))
plt.show()

Şekil 1.3’te görüldüğü gibi 40 tane veri başta 2 sınıfa ayrılmıştır. Noktalı çizgiler svm , tek çizgi ise w yi göstermektedir. En altta ise yeni girilen veri sayısı eğitilen verileri kullanarak doğru bir şekilde sınıflandırılmıştır.
referanslar
- https://www.saedsayad.com/
- Python Data Science Handbook Essential Tools Working With Data