Destek Vektör Makineleri (SVM)

  1. 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 Destek vektörleri (1)

Ş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.

Şekil 1.2

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 Eğitilmiş yeni bir model

Ş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

  1. https://www.saedsayad.com/
  2. Python Data Science Handbook Essential Tools Working With Data

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s