Support Vector Machine(s) - SVM

Anonim6

Yeni üye
29 Şub 2012
0
5
Support Vector Machines (SVMs)
Perspective is not a science but a hope.
~ John Berger
i. giriş::
Doğrusal sınıflandırıcılar (linear classifiers) ve çekirdek methodları (kernel methods), ve özellikle SVM (Support Vector Machine) teknolojisi sınıflandırma maksadıyla kullanılan en popüler standart araçlar arasındadırlar. Öyle ki, Google Scholar programının Ocak 2014 tarihinde yayımlamış bulunduğu istatistiklere göre, "Support Vector Machine(s)" terimini içeren ~300.000 adet yayın bulunmaktadır. Bütün bir kitleyi tesiri altına almış olan bu teknolojiye ilk kez Vapnik'in hazırladığı PhD. tezinde değinilmiş olup, istatistiksel öğrenme ve optimizasyon teorilerinin sağlam matematiksel ilkelerine dayandırıldıklarından; çoğu diğer "computational intelligence" (CI) metodolojilerine esasen performans bakımından daha elle tutulur sonuçlar vermişlerdir.

Günümüzde yaygın olarak kümeleme, sınıflandırma ve regression işlemlerinde kullanılan SVM, başta istatistiksel öğrenim teorisi adı altında geliştirilip; daha sonra makine öğrenimi, istatistik ve sinyal işleme muamelatlarında da benimsenmiştir. Tarihsel sürece bakacak olur isek, Vapnik'in çoğu kuruma yapmış bulunduğu (bkz: NIPS - Neural Information Processing Systems) bu teknolojiye ilişkin başvuruların tamamının reddine tanık olacağız. Nietzsche'nin de söylediği gibi,
İnsanoğlu, yabancısı olduğu şeyi, barbarca; kendi aklına uyduramadığını ise akıldışı olarak tanımlar.
Bu teknoloji harikasını mantık çerçevesinde ele almadan evvel; '60lı yılların başında, o günün şartlarında dahi günümüz makine öğreniminin en yaygın aracına rehberlik eden, "Basic Support Vector Idea" üzerine Moskova Üniversitesi'nde yazdığı PhD. teziyle bu fikri ortaya atmış, ve "Bell Labs" tarafından gelen teklifle beraber Amerika'ya sovyetlerden göç etmiş olan Vladimir Vapnik'i anmak boynumuzun borcudur. Kendileri, üstte de değindiğim üzere SVM teknolojisine ilişkin yazılarının reddine rağmen umudunu yitirmemiştir, ve AT&T Bell Labs'ın neural ağlar kullanarak gerçekleştirmek istediği el yazısı analizi projesi üzerine fikrini bir iş arkadaşına akşam yemeğinde dile getirmiştir. Ona göre nöral ağlara nazaran SVM bu iş için çok daha işlevsel bir tercih idi, bunun üzerine bahse bile girdi. Onun, küçük bir akşam yemeğinde ağzından çıkan bu sözler üzerine arkadaşı SVM teknolojisini belli bir kernel üzerinde denemeye karar verdi, ve beklenilen oldu: her şey tıkırında işliyordu. Kendilerine değinmeden evvel, bu makaleyi başlatmak istemedim.

Bugün sizlerle beraber, hala basit bir uygulamaya sahip olan oldukça sofistike bir fikir: Support Vector Machine(s) (SVMs) hakkında konuşacak, SVM'lerin altında yatan teoriyi genel bir anlayışla sunup bunların pratikte kullanımlarına odaklanacağız.

ii. düzlemde vektör::
Bu makaleyi okumadan evvel, düzlem üzerinde bulunan standart bir (x, y) kartezyen koordinat sistemine aşina olduğunuzu varsayıyorum. Düzlem üzerinde yer alan herhangi bir p noktası, kartezyen doğru üzerindeki x ve y bileşenleriyle ifade edilir: p = (x.i, y.i). Vektör, lise fizik müfredatından da bildiğimiz üzere skaler niceliğine ek olarak yöne (haliyle doğrultuya) sahip olan ve ok imiyle gösterilen doğru parçasına verilen isimdir. Doğru parçası olarak nitelendirilmesi, belli bir büyüklüğe sahip olduğunu belirtir.

nOMmMa.png

Şekil 1.1​

Bir vektörü x ve y doğrultularındaki bileşenlerine ayrıştırdığımızda; bu bileşenlerin uzunluklarının "başlangıç ve bitiş noktalarının apsis ve ordinatlarının farklarına" eşit olacağını söyleyebiliriz; misal bir A vektöründe, başlangıç (x.1, y.1) ve bitiş (x.2, y.2) olarak belirtilirse, x bileşeninin uzunluğu, |x.2-x.1|; y bileşeni ise, |y.2-y.1| değerini alır. Haliyle, x.1 ve y.1 değerlerini sıfırlayarak işlem kolaylığı yaratabiliriz, bu da vektörün başlangıç noktasının orijine taşınmasıyla mümkündür.

Vektörün bileşenlerinden yola çıkarak, kosinüs teoremi aracılığıyla vektörün büyüklüğü hesaplayabiliriz. Yukarıdaki gibi, başlangıç noktası orijinde yer alan bir A = (a, b) vektörünün bileşenleri dik kesiştiğinden, karşımıza hipotenüsü vektörün ta kendisi olan ve dik kesişen kenarlarının uzunlukları "a" ve "b" olan bir dik üçgen çıkıyor. O halde,

5D7m7A.png

Şekil 2.1​

misali bir eşitlik yazılabilir, bu denklem de bize pisagor teoremi yer aldığını göstermekte. Vardığımız sonuç, bileşen uzunluklarının kareleri toplamı bize vektör uzunluğunun karesini vermektedir. SVM teknolojisinin mantığında, vektör özelliklerinden yararlanacağız.

iii. dot product::
Türkçesi ile "nokta çarpımı" olarak tanımlanan dot product, bahsini ettiğimiz vektörel bir işlemdir. Terim anlamına baktığımız zaman, skalar çarpım yerine de kullanıldığını görürüz; zira işlem sonucu vektörel değil, skalar olacaktır. Elimizde ā ve ē olarak isimlendirilmiş vektörler bulunması durumunda, bu vektörlerin nokta çarpımları "ā . ē" olarak gösterilecektir. Gelelim nasıl hesaplanacağına. Her iki vektörün, birbirlerine dik ve birim boyutlu p-boyuttaki baz vektörlerinin gösterimi,

A176JQ.png

Şekil 3.1​

şeklinde olacaktır. O halde her iki vektörün nokta çarpımı (dot product değeri) karşılıklı bileşenlerin çarpımları toplamına eşit olacaktır. Bu da aşağıdaki gibi bir eşitlikte gözlemlenebilir.

0EnNDV.png

Şekil 3.2​

Bu işlemler kümesinden yola çıkarak; sonucun skaler olup vektörlerin bağımlı tutulması durumunda sabit kalacağını, bir vektörün kendisiyle nokta çarpımının ise büyüklüğünün (uzunluğunun) karesini vereceği sonuçlarına ulaşabiliriz. Dolayısıyla kendisiyle nokta çarpımının değeri sunulan vektörün büyüklüğü, verilen değerin ikinci dereceden (kare) kökü olacaktır. Aşağıda da ilgili malumatın ispatı yer almaktadır.

4arqlY.png

Şekil 3.3​

Verilen vektörlerin uzunluklarının bilinmesi durumunda, nokta çarpımının değer tanımlaması farklı bir biçimde de yapılabilir. Bu tanımlama, uç uca eklenmiş vektörlerin arasında kalan açının kosinüsü ile, vektör uzunluklarının çarpımı olarak yapılır. Yani,

OoA9M3.png

Şekil 3.4​

olarak da dot product hesabı yapılabilir, ve bu tanımdan yola çıkarak kosinüs fonksiyonunun tersi olan arc-kosinüs yardımıyla açı değerine ulaşılabilir. Aradaki açının pi/2=90'a eşit olması durumunda, yani vektörlerin dik kesişmesi halinde cos(90)=0 olacağından, |ā|.|ē|.cos(90)=0 değerini alacaktır. Hatta ve hatta, aradaki açının 0 derece olması durumunda, cos(0)=sin(90)=1 değeri biçileceğinden, dot product aynı zamanda vektörlerin uzunluklarının skaler çarpımlarına eşittir: |ā|.|ē|.cos(0)=|ā|.|ē|. Bu işlemde bilmemiz gereken yegane kavram, vektörlerin noktasal çarpımlarının; birinin diğeri doğrultusundaki projeksiyonunu vereceğidir. İşin mantığını kavramak için ihtiyacımız olan vektör bilgisini, şu noktada temin etmiş bulunuyoruz.

iv. svm(s)'a yukarıdan bakış::
Makine öğrenimi serimizin bu adımında, çoğunlukla kısaltımı olan SVM adıyla olarak bilinen, Support Vector Machine(s) olarak isimlendirilmiş bir "Machine Learning" sınıfına keşfe çıkacağımızdan daha önce söz etmiştik. SVM, hem regression hem de sınıflandırma için kullanılabilen "supervised machine learning" kapsamında yer alan bir algoritmadır kısaca. "Supervised machine learning" ne ola ki sorularını duyar gibiyim. Türkçesi ile denetimli öğrenim olarak da bilinen "supervised learning"; elinizde girdi değişkenleri (x) ve çıktı (y) yer alması durumunda bu girdi ve çıktılardan yola çıkarak haritalandırma fonksiyonunun öğrenimi maksadıyla herhangi bir algoritma kullanmıdır.
Kod:
[I] y = f( x )[/I]
Supervised learning olayında temel hedef en optimize haliyle yaklaşık olarak ana fonksiyona ulaşmak, öyle ki yeni bir girdinin sisteme dahil olması durumunda bu verinin çıktısı üzerinde doğru bir tahmin yapabilmektir. Bu öğrenimin denetimli olarak isimlendirilmesinin ardında yatan sebep, "training dataset" üzerinden tabi tutulan fonksiyona ulaşma işlemiyle bir öğretmenin herhangi birisinin öğrenim sürecini denetlemesi arasında ilişki kurulabileceği gerçeğidir. Doğru ve hatalı cevapları bilen, haliyle algoritmanın tekrarlayan bir biçimde "training dataset" üzerinde tahminler yürütmesinde gerekli kontrolleri gerçekleştiren bir öğretmen. SVM'ın kısa tanımındaki bilinmeyen ögeleri gün yüzüne çıkarttığımıza göre, bu fikrin mantığına giriş yapabiliriz.

v. svm(s) fikri::
"support vector" teknolojisinin temel kullanım alanlarına değinirken sınıflandırmadan bahsetmiş idik. Bunu anlaşılır kılmak için, bir "binary classification", yani ikili sınıflandırma problemi ele alalım; sonuçta fonksiyonun dönütü ya pozitif, ya da negatif olacaktır. En basit sınıflandırma probleminde, bir uzay üzerinde konumlanmış, birbirinden farklı iki sınıftan birine ait olan veri noktaları bulunur. Hedef ise "supervised learning"de değindiğimiz üzere, uzayda sonradan bir noktada konumlanmış olan herhangi bir verinin hangi sınıfa dahil olacağını en doğru biçimde kestirmektir. Probleme ilişkin basit bir doğrusal (linear) çözüm, veri noktalarının n-boyutlu vektörlerce tanımlandığı sistem üzerinde belirebilir, sonuç olarak verileri ayrıştırmak maksadıyla (n-1)-boyutlu bir hiper düzlemden yararlanabilme şansımıza göz atacağız. Şu durumda, iki boyutlu sistemimiz üzerindeki veri kümesini tek boyutlu bir düzlem, yani doğru kullanarak ayırmaya çalışacağız.

vj585D.png

Şekil 5.1​

Şekilden de anlaşılabileceği üzere, veri kümesini sınıflandırabilecek birçok (n-1)-boyutlu düzlem çizilebilmektedir (tam olarak, sonsuz miktarda). Bu noktada, optimizasyon sorunu patlak veriyor. Sınıflandırmayı gerçekleştirecek birçok (n-1)-boyutlu düzlem çizilebilmekte iken problem hangisinin bu ayrıştırmayı en makul şekilde gerçekleştireceğine karar kılmak. En yerinde seçim, elbet bize her iki sınıf kümesine de en geniş ayrımı veyahut mesafeyi sunan (n-1)-boyutlu düzlem olacaktır. Bu sebepten ötürü ayrıştırmayı gerçekleştiren düzlemi, her iki taraftan da düzlem ile veri noktası arasındaki mesafenin maksimum olabileceği durum olarak belirliyoruz. Böyle bir düzlemin var olması durumunda, hiper düzlem "maksimum-mesafe düzlemi" (maximum-margin hyperplane); düzlemin aracı olduğu doğrusal ayrıştırma methodu da "maksimum-mesafe sınıflandırıcısı" (maximum-margin classifier) ismini alır.

Yukarıda yer alan bilgiyi kısacık bir süreliğine gözden çıkartıp, tekrardan düzlem seçimi problemimize dönelim. Yukarıdaki sistemde alınabilecek herhangi bir doğrunun denklemindeki bilinmeyenler olan "a, b ve c",
  • kırmızı noktalar için ax + by ≥ c
  • mavi noktalar için ax + by ≤(veya <) c
durumlarını sağlamak zorunda olup, birçok sayıda "a, b ve c" kombinasyonu yazılabileceğinden bahsetmiştik. "machine learning" adı altında kullanılan methodların çoğu bir ayırıcı düzlem bulmasına rağmen söz konusu düzlem optimal özelliklere sahip olan değildir (örn. neural ağlar). Optimal düzlem faktörü baz alındığı an, farklı bir soru devreye giriyor: optimaliteyi belirleyen noktalar hangileridir? Bu soruya verilecek cevap, "linear regression" ve "neural ağlar" için tüm noktalar iken, SVM için cevap karar sınırına yakın, sadece yerleştirilmesi zor veri noktaları olacaktır. Uzaydaki konumlandırmaları belli bu noktalar, "support vector" adını alır.

1JvDvb.png

Şekil 5.2​

Şekil 5.1 üzerinde yer alan mor ve yeşil doğruların, y(i) = {+1 : mavi, -1 : kırmızı} olarak belirlenmiş veri kümesini doğrusal bir biçimde ayırabildiklerini görüyoruz; ancak, sarı olan doğrudan farklı olarak "support vector" olarak belirlediğimiz noktalara olan mesafelerinden biri diğerine göre çok daha kısa olduğundan SVM için kullanılamazlar. O halde bi' dolu matematiğe giriş yapmadan evvel, "support vector"ümüzün özelliklerini de sıralayalım;
  • Dataset üzerinde karar sınırına (veya düzlemine) en yakın konumlandırılmış veri noktalarıdır,
  • Sınıra yakın olduklarından, haliyle sınıflandırmaları en zor olan noktalardır,
  • Karar düzleminin optimum değerini doğrudan etkilemektedirler,
  • "training set"in çıkarılmaları durumunda, ayrıştırıcı yüzeyin konumunu değiştirebilecek parçalarıdır,
bu noktaların belirledikleri hiper düzlem, yukarıda çokça üstünde durduğumuz üzere bir optimizasyon problemi olup optimizasyon teknikleriyle çözülebilir (Lagrange çarpanlarını kullanarak, bu problemi analitik bir çözüme ulaştıracağız ilerleyen safhalarda.) O halde, başlayalım.

Elimizde, yukarıdaki şekillerde de değinip açıkladığımız üzere bir "decision boundary", yani karar sınırı olan doğrusal düzlemle ayrıştırılabilen veri kümeleri bulunmakta. Geometri derslerinde öğretilen temel prensiplerden birisi, doğruların esasında bir dizili noktalar kümesi olduğuydu. Bu sebepten ötürü, doğru üzerinde alacağımız herhangi bir noktanın denklemi, doğrunun denklemine eşit olacaktır. Bir doğrunun temel denklemi,

z05l4g.png

Şekil 5.3​

olarak ifade edilir. Ancak, okuduğunuz veyahut okuyacağınız SVM ile alakalı bilgi içeren yazıların çoğunda karşılaşacağınız doğru denklemi, ikincisindeki (w.x = 0) gibi düzlemsel eşitlikle tanımlanacaktır. Aynı düzlemin iki formu arasındaki ilişkiyi açıklamak gerekir başta. Düzlemin denkleminde yer alan değişkenler, elbet vektöreldir. Dahası, w.x vektörel olan iki birimin bileşenleri çarpımı aklınıza daha önce değindiğimiz bir işlemi getirmiş olmalı: dot product, noktasal çarpım!

G9R2zv.png

Şekil 5.4​

Aslında bakacak olur isek, her iki ifade de aynı kavramı bizlere sunmakta. O halde ne diye aynı düzlem için aynı kapıya çıkan, birbirinden farklı iki adet ifade yer almakta; ve SVM düzlem denklemini kullanmakta misali bir soru ortaya çıkıyor. Çünkü,
  • durum bu olunca, p-boyutlu uzayda barınan veriler ile çalışmak çok daha kolaylaşmakta,
  • w olarak nitelendirilen vektör her zaman için düzlemle dik kesişmekte. Yani anlayacağınız, support vector paralellerinin arasında kalan karar sınırını tam olarak 90 derecelik açıyla kesmekte.
İkinci madde, düzlem ile herhangi bir nokta arasındaki mesafenin hesaplanması sorunsalında oldukça kullanışlı olacaktır.

Buradan itibaren, SVM teknolojisinin dayanağı olan kural ve prensiplerden söz edeceğiz. SVM'de ana sorunumuz, gelecek olan herhangi bir bilinmeyen verinin konumlanacağı noktadan değerini kestirmek idi. An itibariyle yapmamız gereken, karar sınırı olarak nitelendirdiğimiz ayırıcı düzlemden yola çıkarak bir karar kuralı oluşturmak. Bunun için baştaki veri kümelerimizi düzlem denklemiyle ifade eden, support vector olarak kabul ettiğimiz noktaları baz alarak ayırıcı düzlem çizip; bu düzlemin medyanını dik kesen bir w vektörü ile işareti belirlenemeyen bir u veri noktası tanımlıyoruz.

3ELjAO.png

Şekil 5.5​

Orijinden bu "u" noktasında sonlanan bir doğru parçası, yani vektör çizmemizde ve "w" vektörünü orijine taşımamızda sakınca yoktur; hal böyle olunca, yeni elemanımız bir vektöre dönüşüyor. An itibariyle, düzlemimizi dik bir biçimde kesen "w" vektörünün uzunluğu hakkında bir yorum yapamamaktayız. Bundan böyle, support vector noktalarının oluşturduğu paraleller, ve bu paralellerin enine medyanı olan düzlemi Winston teminolojisi ile "street", yani "sokak" olarak isimlendireceğiz. Elimizde yer alan "w" vektörünün bilinmeyen noktanın vektörü ile noktasal çarpımı, "w"nin doğrultusunda "u" vektörünün projeksiyonunu verecektir bize. Haliyle, bu projeksiyonun konumunu yolun medyanına göre karşılaştırarak, verileri sınıflandırabiliriz. O halde, projeksiyonumuzun yolun medyanı ile kesişmesi durumunda rahatlıkla verinin pozitif olarak işaretlenmesi gerektiğini söyleyebiliriz.

p6z8EN.png

Şekil 5.6​

O halde, yukarıdaki eşitsizliğin sağlanması durumunda verimiz kesinlikle pozitiftir; ve eşitsizlik, bizim kuralımız olarak isim alır. Ama o da ne, elimizde bir "b", yani "-c" sabiti var, ve henüz "w" vektörünün uzunluğu hakkında hiçbir fikrimiz yok. "w" vektörü, yolun medyanını dik kesen bir vektör ancak bu hususu yerine getiren birçok ölçüde "w" vektörü bulumakta, ayrıyeten "b" sabitimiz hakkında da henüz bir fikir yürütemiyoruz. Anlayacağınız kuralımızı tam olarak kestiremeyiz şu noktada. O halde, hesaplama için gerekli olan "w" vektörü ve "b" sabitine ulaşana kadar, işin içerisine ipuçları sokmaya devam edeceğiz.

"support vector" olarak isimlendirdiğimiz noktaların üzerlerinden geçen paralellerin ötesi ve berisi hakkında kesin bir cevapta bulunabiliyoruz. Tekrardan dataset'imize dönelim; y(i) = {+1 : mavi, -1 : kırmızı}, tüm verilerimiz bu iki sınıftan birisine dahil. Herhangi bir negatif veyahut pozitif x değerinde, support vector'un oluşturduğu doğruların denklemlerinden yola çıkarak bu biçim bir eşitlikten bahsedebiliriz,

kOBLE7.png

Şekil 5.7​

baştaki nitelendirmemizde de y(i)'nin mavi olarak işaretlenmiş değerlerde +1, kırmızılarda ise -1; yani y(i) = {+1 : mavi, -1 : kırmızı} tablosunu oluşturmuştuk. İnanın, bu gibi iki adet eşitsizlik resmen acıdır, gereksizdir. Bu sebepten ötürü her iki değeri de y(i) ile çarpmak istiyorum, maksat fetiş. Sonuçta her iki eşitsizlik de x değerinin (+) veyahut (-) değerlikte bulunması durumlarında ayrı ayrı oluşmakta.

NZAgkN.png

Şekil 5.8​

Ah, eğer ki yanlış görmüyor isem birbirine eşit olan iki adet eşitsizlik elde ettik değil mi, bunlar aynılar. Tüm veriyi, eşitsizliğin sol kesimine attığımız vakit karşımıza iki adet eşitsizlik çıkmakta; ya işlemin sonucu sıfıra eşit, ya da büyük olmalı. İşlemin sonucunun sıfıra eşit olma durumu; sadece ve sadece support vector noktalarının oluşturduğu paralel doğrular üzerindeki noktalar, yani yolun kenarları için geçerlidir; diğer türlüsü ise, verinin doğrultu harici herhangi bir yerde konumlandığını gösterir.

az3MXR.png

Şekil 5.9​

Bu, kurala yönelik ulaştığımız ikinci kritik çıkarım idi, cepte. Bir optimizasyon problemi olan, "sokağın" genişliği hala varlığını sürdürüyor. Verilerimizin barındığı uzaya tekrardan gelelim, ve yolun kenarları olan support vector doğrularından herhangi iki adet noktaya orijinden vektör çizip, bunları x (+) ve x (-) olarak isimlendirelim. Elbet ki bu noktalar arasındaki mesafe, vektörel özellik gösterdiklerinden bileşke vektöre eşit olacaktır.

z05lnB.png

Şekil 5.10​

Eğer ki sisteme ek olarak, medyan doğrultusuna dik olan "normal"im olsaydı, bu dik vektör ile bileşke vektörün noktasal çarpımı bana sokağın genişliğini verirdi; sonuçta normal doğrultusunda bileşke vektörün projeksiyonunu almış olacaktım. Yahu biz sabahtan beri bahsettiğimiz üzere, w vektörünü zaten sokağın medyanına dik bir vektör olarak ele almıyor muyduk? Bu cümleyi, aşağıdaki gibi de ifade edebiliriz.

8YZ28r.png

Şekil 5.11​

Medyanı karar sınırımız olan sokağımızın genişliğini verecek olan denklemi de bulduk. Sonuçta noktasal çarpımın sonucu bize skalar bir değer vereceğinden bunu genişlik biriminde bir değer olarak inceleyebiliriz. SVM'de yer alan temel problemlerden birisi de, bu genişliğimizi maksimum tutma kaygısıydı. An itibariyle bu denklem yüksek ihtimalle pek bir şey ifade etmemekte, ve, ah! Tam olarak bu noktada, elde ettiğimiz ikinci çıkarım devreye giriyor; sonuçta biz bu noktaları, support vector'lerin oluşturduğu doğruların üzerinde belirledik ve haliyle işlemimizin sonucu 0 olacaktır. Bulduğumuz noktasal çarpımların eşitlerini, denklemde yerine koyduğumuz zaman,

D72631.png

Şekil 5.12

EP8639.png

Şekil 5.13​

sonucuna ulaşıyoruz, yaptığımız tek şey parçalar türetip elde edilenleri birleştirmek. Ulaştığımız sonuç; seçeceğimiz ve sokağın medyanına dik olan "w" vektörünün büyüklüğünün 2'ye oranı, bize sokağımızın genişliğini verecektir. Bu, kuralı şekillendirme esnasında kullanacağımız üçüncü temel denklem. SVM kullanmaktayız, ve bu sokak genişliğinin maksimum olmasını istiyoruz haliyle; ne de olsa veriler arasındaki farkı açarak sınıflandırmayı rahatlatmak yegane gayemiz. O halde, 2/||w|| değerinin maksimum olma durumunu belirlemek bir sonraki adımımız olacak.

"w" vektörümüzün büyüklüğünü oranladığımız sabit "2" değerini, "1"e düşürmekte bir problem göremiyorum; ve her iki durumda da, değeri maksimum tutmak için "w" vektörünün büyüklüğünü minimum almak gerekecek. Matematiksel olarak kabul edilesi bir mantık yürüterek, aşağıdaki gibi bir denklikten bahsedebiliriz; sonuçta birini sağlayan, diğerini de kuşkusuz sağlayacaktır.

jy31BG.png

Şekil 5.14​

Özetle, "m" sayıda öğrenilesi veri noktası teşkil eden bir dataset üzerinde, metni takip eden ikinci dereceden şu optimizasyon problemini çözüme kavuşturmalıyız. Maksimal mesafe sınıflandırıcısının (maximal margin classifier) kullanımı bu gibi ayrıştırıcı hiper düzlemin varlığı durumunuda oldukça doğal bir yöntemdir. Ancak birçok gerçek yaşam örneğinde veri kümeleri bir düzlem yardımıyla ayrıştırılamadığından bu sınıflandırma methodu bulunamaz. O halde bir sonraki aşamaya geçmeden evvel, şu ana kadar yaptığımız işlemleri yüzeysel bir biçimde istisnai noktalar barındıran ve linear olarak ayrıştırılamayan (veya daha doğru bir tanım ile neredeyse ayrıştırabilecek olan) bir veri kümesi üzerinde tekrardan deneyelim.

6JPqrN.png

Şekil 5.15​

Kanımca uzayda barınan veri kümelerini sınıflarına göre "neredeyse" ayrıştıran (p-1)-boyutlu düzlemin prensibinde birtakım hususlar için istisnai reaksiyonlar gösterebiliriz. Düzlemi sözde geçirgen sınır olarak isimlendirerek "maximal margin classifier"ı ayrıştırılamaz durumlara uyarlamaya "support vector" sınıflandırıcısı ismi de verilir. Veri sınıflarının, uzayda iki boyutlu düzlem üzerinde birbirlerine girdiklerini varsayalım; bu verileri sınıflandırmak için yapılması gereken önceki durumdan da farklı değil, sonuçta SVM kullandığımızdan "M" (support vector'lerin oluşturduğu doğruların arasındaki mesafe - sokağın genişliği) değerini maksimum kılmamız Tanrı'nın emri. Ancak support vector noktaları belirlenirken, o an orada bulunmaması gereken veri noktalarını hesaba katmadan işlem yapmalı - bu verileri gevşek tutmalı. Söz konusu veriler,

W7k9gq.png

Şekil 5.16

p6z8XN.png

Şekil 5.17​

olarak ifade edilebilir. Bir önceki seferde ulaştığımız optimizasyon sorunsalını konveks bir problem olarak baz alıp, sınırlayıcı etmenlerimizi bu duruma göre modifikasyona uğratabiliriz. Metni takip eden bağlamda yer alan bu sınırlayıcılardan ilkindeki istisnai değerler dizisi,

kOBLG7.png

Şekil 5.18

NZAglN.png

Şekil 5.19​

tahmini düzlem fonksiyonundaki sonuca göre düzlemin hatalı tarafında bulunan veri noktalarının oransal miktarını niteler. Dolayısıyla istisnai değerler toplamını ( ∑ S) sınırlayarak, düzlemin hatalı tarafına düşmüş olan toplam miktar oranını belirleyebiliriz. Sınıflandırmada hata S>1 olması durumunda meydana gelir. "maximum margin classifier"da söz konusu olan optimizasyon problemi birtakım değişiklikler vasıtasıyla bu durumda da geçerlidir.

az3MdR.png

Şekil 5.20​

Şu ana kadar yaptıklarımızı bir gözden geçirelim. Tüm bu kaosun tek sebebi, sınır düzlemimizin denkleminde barınan bilinmeyen ögelerin alabileceği değerler çemberini küçültmek maksatlı birtakım sınırlayıcı etmenler keşfinden ibaretti. Linear olarak ayrışabilen (veya istisnai veriler de barındıran) iki durum üzerinden; ayrıştırma kurallarımızın temelini oluşturacak birtakım optimizasyon problemlerine ulaştık. Artık yapılması gereken elbet de bu problemleri bir çözüme kavuşturmak. Doğrusal sınırlayıcılara sahip, ikinci dereceden konveks bir optimizasyon problemi... Sanırsam bu problemi, Lagrange çarpanları kullanarak ikinci dereceden bir tanımlamaya tabi tutup çözüme kavuşturabiliriz. Lagrange çarpanları! Gelin tanıyalım.

vi. Lagrange çarpanları::
Gelin tüm bu kaosu kısa bir süreliğine bir kenara bırakıp, Lagrange ikiliği hakkında konuşalım. Neredeyse her türlü kaynakta karşılaşacağınız yegane tanım, birden fazla değişkenli fonksiyonlarda maksimum ve minimum (ekstremum) problemlerinin çözümünde sıklıkla başvurulan yöntem olacaktır - lakin bu bir tanım değildir. İspatıyla beraber sayfalar süren bir mucizeyi bu kadar klişe ve tam olarak bir yanıt teşkil etmeyen biçimde betimlemek büyük bir hatadır. Aşağıdaki formda barınan bir problem tasvir edelim,

8YZ2Pr.png

Şekil 6.1​

Önceden bilenleriniz var ise, yüksek ihtimalle ilgili fonksiyonu Lagrange methoduna nasıl tabi tutup işlem yapacağını kestirebiliyor olmalı. Bilmeyenleriniz için, bu durumda tanımlayacağımız Lagrangian,

D726B1.png

Şekil 6.2​

olacaktır. İşlemde barınan her bir B(i), Lagrange çarpanı olarak isimlendirilecektir. Şu aşamada yapacağımız "L"nin yarım türevlerinin her birini bulup, bunları sıfıra eşitlemek olacaktır. Daha sonra bu denklemleri çözüme ulaştırmak kafidir. Bir optimizasyon problemi üzerinden eş zamanlı olarak çözüme ulaştırmak da ayrı bir zahmet gerektirdiğinden, makalemizde yer vermeyeceğiz. Merak edenler için,

m2674y.png

Şekil 6.3​

vii. svm(s) fikri (continued)::
En son, elde ettiğimiz ekstremum optimizasyon problemlerini çözüme ulaştırma safhasında Lagrange çarpanlarının kullanımında kalmıştık. Methodumuzu sınırlayıcıları baz alarak (ve ek olarak, linear olmayan bir durum söz konusu ise istisnaları da hesaba katarak) Lagrange'a (primal) uyarlamamız gerekirse ilgili Lagrangian'ı elde ederiz,

EP86r9.png

Şekil 7.1​

Langrangian ifadesinin ilgili türevlerini, çarpanın özelliklerinde de bahsettiğimiz üzere sıfırlayabiliriz.

bBDMrV.png

Şekil 7.2​

İlgili türevlerin değerlerini sıfıra eşitledikten sonra, bilinenler ve bilinmeyenleri bir tarafa attığımız - veya daha uygun bir deyimle bilmek istediklerimizi yalnız bıraktığımızda, her şeyin başında bahsettiğimiz "w" vektörünün ifadesine ulaşıyoruz; kendileri, ilgili toplam işaretinde (sigma) değinilen vektörlerin doğrusal denklem toplamlarına eşit, huh? Ayrıyeten artık elimizde, karşılaştığımız vakit rahatlıkla 0 kabul edeceğimiz bir de değer var. O halde, Lagrangian ifademizde "w" vektörü gördüğümüz yerlere, eşitini yazabiliriz. Minik birkaç algebra oyunuyla bu iş de hallolur.

dO3ZPL.png

Şekil 7.3​

Bu gerçekten, oldukça zahmetli. İfademizde "w" vektörünün yerine eşitini koyduğumuz vakit bizi karşılayan tablo tam olarak da bu. Türevden yola çıkarak bulduğumuz bazı ifadelerin değerlerinden, ve yapılabilecek birtakım sadeleştirme işlemlerini de uygulamaya koyarak ifadeyi biraz daha sadeleştirebiliriz. Ve sonuç olarak, elde ettiğimiz denklemde optimizasyonun vektör ikililerinin noktasal çarpımlarına bağlı olduğunu göreceğiz. Bu, kuralımızın oluşumunda rol üstlenecek olan dördüncü kritik denklem.

5D7mgq.png

Şekil 7.4​

Uh, Langrangian ifadesinin içerisinde kullanmış olduğumuz "w" vektörünün eşitini, şu ana değin hiç düzlemin denkleminde yerine koymamış idik. Bu eksikliği de giderdiğimiz zaman, tanımladığımız vakit kolay uygulanabilir lakin sofistike bir fikir olan SVM'in dayalı olduğu temeli ana hatlarıyla görmüş olacağız. Şu ana kadar tanık olmuş olduğumuz; ekstremum değerin arayışı ve düzlemin genel denkleminde barınan noktasal çarpımlardan aslında tüm sürecin arka planda dot product'a dayalı olduğunu gösteriyor.

A176LX.png

Şekil 7.5​

Peki biz şu ana kadar ne halt yedik yahu, gerçekten tüm bu zahmet gerekli miydi - cevabım evet. Şu ana kadar doğrusal bir sınıflandırıcı üzerinden SVM'ın işleyişi, ve sınıflandırma kuralının oluşumu esnasında baz alınan kısıtlayıcılar ile belli başlı optimizasyon problemlerine ulaştık; ki bu, "primal problem" olarak isimlendirilmekte. Ayrıyeten "Representer Theorem" bizlere "w" vektörünün öğrenim verilerinin linear kombinasyonları olduğunu gösterdi, ve elimizde "primal" ve "dual" isimleriyle dönüşüme uğratabileceğimiz iki adet optimizasyon problemi var,

4arqPQ.png

Şekil 7.6

JQAkaB.png

Şekil 7.7​

Optimizasyon problemimizin dual formu sadece dot product kapsamakta, ve birazdan kernel ve özelliklerine giriş yaptığımızda bunun neden bir avantaj olduğunu anlayacağız. Bu bölümde değinmemiz gereken son husus, sınıflandırıcı düzlemimizin primal ve dual formlarını karşılaştırmak olmalı. İlk bakışta, makale serimizin önceki konularında da değindiğimiz K-NN (K-Nearest Neighbor)'a kıyasla dual formunun dezavantajda olduğunu söyleyebiliyoruz; zira öğrenim esnasında x(i) veri noktalarını da gerektirmekte. Ancak elimizde yer alan alfa (i)'ların çoğu sıfır, ki zaten sıfır olmayanlar da support vector x(i)'i tanımlamaktalar.

Rnk90j.png

Şekil 7.8​

Sanırsam doğrusal bir düzlem yardımıyla ayrışabilen veri kümeleri için yapılması gerekenleri gayet hoş bir biçimde özetleyip; kısıtlayıcı etmenlerden yola çıkarak bir optimizasyon problemi ortaya çıkardık - geriye kalan sadece bu problemi en uygun biçimde çözüme kavuşturmakta, ki bu da şu anlık benden çok bir numerik analizatörün işi, ugh. Dediğimiz gibi, bu dakikaya kadar tümüyle doğrusallıktan bahsettik yahu, ve ta en başında da gerçek yaşam senaryolarında karşılaşacağımız tablonun bu olamayacağını da belirttik. Herhangi bir doğrusal ayrıştırmanın mümkün olmadığı durumlarda ne yapmalı - işte tam bu sırada, MIT üniversitesinin derslerinde tanık olduğum bir mucize olan cümlecik devreye giriyor;
"When stuck, switch to another perspective."

Takıldığın, hata verdiğin an olayı farklı bir bakış açısından gözlemle. Çok basit bir örnek üzerinden dersin hocasının ne demek istediğini anlatalım, aşağıdaki gibi iç içe girmiş sınıflardan oluşan bir veri kümesi tasvir edin; böyle bir durumda yapılması gerekeni biliyoruz, evvelinde çok daha karmaşık bir senaryo ile karşılaşmıştık, slack değişkenler tanımlayıp yolumuza devam ederiz elbet. Sonuçta bir şekilde veri sınıflarını ayrıştırabiliyoruz yahu.

p6z80L.png

Şekil 7.9

kOBLbm.png

Şekil 7.10​

peki ya, bunun gibi bir veri yığınımız da olsa aynı şeyi yapabilir miydik - cevabı vereyim, tabii ki de hayır. O halde yapmamız gereken (elbet birçok şey var, ancak başlıca), farklı bir perspektife geçmek, şu an verileri barındırdığımız uzay pbizim için yetersiz kalıyor ise boyut değiştirebiliriz anlayacağınız. p-boyutlu uzayda (p-1)-boyutlu ayrıştırıcı düzlem bulamadığımıza göre, (p+1)-boyutlu uzaydaki düzlemimiz p-boyutlu olacaktır.

NZAgpP.png

Şekil 7.11​

anlayacağınız elimizdeki erileri gerek koordinat düzlemine geçiş yaparak, gerekse de daha yüksek dikey düzlemlerden oluşan bir boyuta haritalandırarak linear olarak ayrıştırılabilir hale getirebilmekteyiz. Tek yapılması gereken, tüm verileri belli bir fonksiyon altında tekrardan değerlendirip farklı bir boyuta aktarmak. Bu fonksiyonu, fi (phi) sembolüyle göstereceğiz. Gelin hem primal hem de dual sınıflandırıcılarımız için, girdilerin phi'ye tabi tutulmuş; yani doğrusal olarak ayrıştırılamayan verilerin bu durumun sağlanabildiği bir uzaya aktarılmış versiyonlarını yazalım.

2J1N9v.png

Şekil 7.12​

Basitçe primal sınıflandırıcısının denklemini yazdık, ve bu denklemden yola çıkarak önceden de öğrendiğimiz yöntemlerle learning için bir kural, bir problem belirledik. Bu aşamadan sonra yapılması gereken de zaten bildiğiniz üzere "w" vektörünün yerine ona eş olan bir ifadeyi getirmek idi. Sıkıntı şu ki, aktarılan düzlemde "D >> d" olması durumunda, elbet "w" vektörü için öğrenilmesi gereken oldukça fazla parametre doğmakta. Bunun önlenip önlenemeyeceğini göreceğiz, sırada dual sınıflandırıcı var.

BLP6A9.png

Şekil 7.13​

Temel faktör, dot product! phi(x) ancak ve ancak phi(x.i).phi(x.j) durumunda kullanılabilir hale geliyor. Tüm skalar ürünler hesaplandıktan sonra, bilinmeyen tek kavram N-boyutlu alfa vektörü oluyor, ki onun da D boyutlu uzaydaki değeri pek de önemli değil. Tekrardan phi(x.i).phi(x.j) durumuna dönelim, öyle bir fonksiyon yazalım ki argümanlarını phi fonksiyonlarına yönlendirip yerine koysun, şunun gibi;

oO38k2.png

Şekil 7.14​

Ah, işte bu "Kernel" olarak da bilinir. Noktasal çarpımlarını aldığımız phi çiftlerinde gördüğümüz yerlere, "k (x.i, x.j)" olarak tanımladığımız kernel fonksiyonumuzu yazıp; final SVM problemimizi elde edebiliriz an itibariyle, bu noktadan sonra yapacak pek bir şeyimiz kalmıyor. Bir adet de kernel dönüşümüne örnek vererekten; ve de sıkça kullanılan birtakım kernel fonksiyonlarına değinerekten makalemizin bir sonraki kısmına geçiş yapabiliriz. Aşağıda yer alan özel dönüşüm, aslında ayrı ayrı phi fonksiyonlarını hesaplayıp noktasal çarpımlarını almak yerine işlemi sadeleştirerek tek seferde değeri elde etmemizi sağlayan özel bir durum, çoğu yerde bu duruma "kernel trick" ismiyle de karşılaşırsınız. Artık SVM'nin en azından çıkışını, mantığını ve birtakım istatistiksel mutlaklara dayandığını anlamış olmalıyız. İşin teorisini anlatmaksızın uygulamaya dökmek saçma gelir idi; an itibariyle birtakım örnekler aracılığıyla anlatımımızı zenginleştirebilir, mana katabiliriz.

lOjrWk.png

Şekil 7.15

vj58pR.png

Şekil 7.16​

Çok geniş ve aktif bir araştırma alanına sahip kernel sorunsalına birtakım ve çokça kullanılan çözümler aşağıdaki gibidir,

1JvDgD.png

Şekil 7.17​

viii. teorinin uygulamaya dökümü::
Machine Learning, oldukça kapsamlı ve aktif bir sektör. Tesiri altında bıraktığı bir diğer teknoloji olan SVM ile yapılası örnek sayısı, bir sınıflandırma problemi mevcut olduğu sürece sınırsız olarak nitelendirilebilir. Tabii ki sonsuz olarak nitelendirdiğimiz bir kapsamda tüm faktörleri ele alabilmemizin haliyle mümkünatı yoktur; ancak birtakım örnekler aracılığıyla bu teknolojiyi gerçek yaşama uyarlanabilir hale getirebiliriz. Bu süreçte kullanacağımız diller R ve CPython olacaktır. İlgili dillerin çalışma platformunuz üzerinde kurulu olduğunu varsayarak, dilerseniz kendimize birer çalışma ortamı hazırlayalım.
Kod:
PS> py -3.5 -m venv .svm                                    
PS> .\.svm\Scripts\activate     
(.svm) PS> pip3.6 install numpy scipy `
>> scikit-image scikit-learn ` 
>> jupyter ipython matplotlib `
>> mlxtend pandas
[...]
>> jupyter notebook
[...]

İzole edilmiş Python ortamımız üzerinden, ileriki aşamalarda gerekli olabilecek modüllerimizin kurulumunu gerçekleştirdiğimize göre çoğu başlangıç SVM örneği üzerinde karşılaşabileceğiniz "Iris dataset" üzerinden gerekli testlerimizi gerçekleştirelim. Kanımca "pattern recognition" literatüründe en bilindik veri kümelerinden birisi olan iris, her birinde ellişer örnek barındıran ve çiçeğin türünü belirten üç sınıftan oluşmakta; ah evet, çiçekten bahsediyoruz. Toplamda 150 adet veri barındıran bu dataset üzerinde (0, 1, 2) sınıfları [50, 50, 50] olmak üzere,
Kod:
{
	0 : setosa,
	1 : versicolor, 
	2 : virginica
}
olarak tanımlanmışlardır. Ayrıyeten, her bir veri satırı da kendi içerisinde,
  • sepal uzunluğu (cm)
  • sepal genişliği (cm)
  • petal uzunluğu (cm)
  • petal genişliği (cm)
olmak üzere 4 adet parametre barındırmaktalar. Biz, verilerimizi sepal ve petal uzunluklarını baz alarak bir uzaya aktarıp SVM ile ayrıştırıcı düzlem oluşturmaya çalışacağız. Ne var ki, veri sınıflarından birisi linear olarak ayrışabilirken diğer ikisi ayrışamamaktalar; yani anlayacağınız basit bir doğru çizerek işin üstesinden gelemeyiz. Haliyle kernel kullanmak durumundayız, RBF (radial basis function - Gaussian)! İsmen yukarıda değinmiş idik, lakin tekrardan hatırlayalım.

LbAgn1.png

Şekil 8.1​

Gerekli kütüphanelerimizi içe aktararaktan işe başlayalım. Bu örnekte; numpy, matplotlib, sklearn (scikit-learn) ve mlxtend isimli modüllerimizi kullanacağız. mlxtend harici çoğu modüle aşinasınızdır diye düşünüyorum, bunun ne olduğuna gelince... Sadece test safhamızda erişimi hızlandırmak maksadıyla kullanacağımız, yardımcı uzantı gibi düşünebilirsiniz.
Kod:
import itertools
import numpy as np
import matplotlib.pyplot as pyplot
import matplotlib.gridspec as gridspec

from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from mlxtend.data import iris_data
from mlxtend.plotting import plot_decision_regions
[...]

örnek üzerinde karşılaştırma maksadıyla verilerimizi "logistic regression" ve "support vector machines" için ayrı ayrı ele alıp tabloya dökeceğiz. Kullanacağımız methodlarımızın tanımlamasını yapıp, iris dataset'imizi uygulamada tanımlıyoruz.
Kod:
[...]
lrec = LogisticRegression(random_state=0)
svmc = SVC(
	random_state=0, 
	probability=True, 
	gamma="auto",
	kernel=rbf
)

X, y = iris_data()
X = X[:,[0, 2]]
[...]

Dikkat ederseniz, SVM için methodu SVC adlı bir sınıf tarafınca oluşturduk. Bu sınıfı "sklearn.svm" üzerinden uygulamaya atmış idik, o halde tanımlanış biçimine bakmakta bir sakınca göremiyorum. Ayrıyeten "X = X[:,[0, 2]]" satırında da, kabaca veri yığını içerisindeki 0 ve 2. sütunda yer alan verileri - yani sepal ve petal uzunluklarını veri kümesi olarak ele aldık.
  • sklearn/svm/classes.py
Kod:
[...]
class SVC(BaseSVC):
	def __init__(self, C=1.0, kernel='rbf', degree=3, gamma='auto',
					 coef0=0.0, shrinking=True, probability=False,
					 tol=1e-3, cache_size=200, class_weight=None,
					 verbose=False, max_iter=-1, decision_function_shape='ovr',
					 random_state=None):

		[...]

Bu parçacık aslında bize, "gamma" ve "kernel" argümanlarını ayrıyeten belirtmenin gerek olmadığını anlatıyor; zira zaten varsayılan argümanları bunlar imiş. Parametrelerin işlevleri hakkındaki detaylı bilgiyi dosya içerisinde yer alan yorum satırında bulabilirsiniz. Gerekli verilerimizi tanımladıktan sonra, sanırsam artık bu verileri grafiğe dökebiliriz.
Kod:
[...]
grid = gridspec.GridSpec(2, 2)
fig  = plt.figure(figsize=(10, 8))

methods = ['Logistic Regression',
          'Gaussian RBF Kernel SVM']

for clf, fnc, grd in zip([lrec, svmc],
                         methods,
                         itertools.product([0, 1],
                         repeat=2)):
    clf.fit(X, y)
    ax  = plt.subplot(grid[grd[0], grd[1]])
    fig = plot_decision_regions(X=X, y=y,
                                clf=clf, legend=2)
    plt.title(fnc)

plt.show()
[...]

bu kod parçacığında da, elde ettiğimiz verileri belirlediğimiz her iki methoda da tabi tutup; karar bölgelerini bir şema üzerinden gösterdik basitçe. Elde edeceğimiz çıktı ise şunun gibi olacaktır,

rOM82M.png

Şekil 8.2​

Şahsen ben üçüncü elden modül kullanımını pek tasvip etmem; şu "mlxtend" zımbırtısı olmaksızın aynı şemayı elde edebilir miydik ya - eh, tabii ki de. Bu örneğimizi sonlandırmadan evvel, SVM algoritmasının bize verdiği dönütü kendimiz işleyerek bölgelerin gösterildiği şemayı oluşturalım o halde. Modüllerimizi aktarıp, Iris dataset'imizi tanımlıyoruz. Ardından, "mlxtend" adlı modülde yer alan "plotting/decision_regions.py" dosyasında tanımlı plot_decision_regions ([...]) fonksiyonunun sadeleştirilmiş varyasyonunu barındıran bir "plotting" fonksiyonu oluşturuyoruz.
Kod:
import matplotlib.pyplot as plt
import numpy as np

from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn.svm import SVC

iris = datasets.load_iris()
X, y = iris.data[:,[0, 2]], iris.target

def plot_decision_regions(X, y, classifier, resolution=0.01):
	markers = ('s', 'o', '^', 'v')
	colors = ('red', 'lightgreen', 'blue', 'gray', 'cyan')
	cmap = ListedColormap(colors[:len(np.unique(y))])

	x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
	x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
	xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
	np.arange(x2_min, x2_max, resolution))
	Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
	Z = Z.reshape(xx1.shape)
	plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
	plt.xlim(xx1.min(), xx1.max())
	plt.ylim(xx2.min(), xx2.max())

	for id, cl in enumerate(np.unique(y)):
		plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
		alpha=0.8, c=cmap(id),
		marker=markers[id], label=cl)
[...]

Bu sefer doğrusal bir kernel kullanıp, şablonumu tekrardan yukarıdaki tanımlı fonksiyonu kullanarak çiziyorum. Böylelikle sınıflarımızın sınır bölgeleri çizilmiş oldu; karşımızda metni takip eden şema belirecektir.
Kod:
[...]
svmc = SVC(kernel='linear', C=1.0, random_state=0)
svmc.fit(X, y)
plot_decision_regions(X,y, classifier=svmc)
plt.xlabel('petal uzunlugu')
plt.ylabel('setal uzunlugu')
plt.legend(loc='upper right')
plt.show()

76gXNv.png

Şekil 8.3​

Iris sınıflandırmamızı sanırsam başarılı bir biçimde gerçekleştirdik. An itibariyle, biraz daha farklı bir örnek olan "digit recognition"a da değinip, Python örneklerimizi sonlandıracağız. Ele alacağımız verilerin bulunduğu dataset'i sklearn modülünden temin edip şablonu tekrardan matplotlib aracılığıyla oluşturacağız.
Kod:
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.svm import SVC

digits = load_digits ()
[...]

verilerimizin değerleri "digits.data", bu değerlerin ilgili fonksiyon tarafından işaretlendikleri sınıflar ise "digits.target" objelerinde yer almakta. Yapılması gereken verileri, sınıflarıyla beraber SVM motoruna aktarıp training verileri üzerinden öğrenimi gerçekleştirmek. Yalnız, ek olarak herhangi bir test verisi oluşturmak istemediğimden ötürü son birkaç veriyi hesaplamaya dahil etmiyorum. Testleri, dahil edilmeyenler üzerinden gerçekleştireceğiz.
Kod:
[...]
X,y = digits.data[:-5], digits.target[:-5]
svcm = SVC(kernel='rbf', C=1.0, random_state=0, gamma=0.001)
svcm.fit (X,y)
[...]

Artık elimizde öğrenimini tamamlamış bir SVM objesi bulunmakta. Hal böyle olunca, elimizde yer alan son 5 değer dizisini öğrenilmiş fonksiyona tabi tutup, değerlerin doğru olup olmayacağını gözden geçirebiliriz.

Plk6rQ.png

Şekil 8.4​

Kod:
[...]
for i in range (0, -5, -1):
    tahmin = svcm.predict ([digits.data[i]])[0]
    print( tahmin == digits.target[i] )
>>> True*5

Tüm tahminler doğrudur efendim. Zira sınıflandırmalarının taşıdığı değer ile, support vector sınıflandırıcısı ile training datanın öğrenimi ile ulaştığımız değerler birbirinin aynısıdır. Bu örneğimizin de sonuna gelmiş bulunuyoruz.

Sıradaki, ve son örneğimizi R programlama dili ile gerçekleştireceğiz. Kendileri, genel bir amaçtan öte bu sektöre ithafen hazırlanmış bir dildir. Bu dile çok fazla değinmeyeceğim, lakin işlemlerin kolaylığını göstermek maksadıyla tek örnek üzerinden özetleyeceğim. Öncelikle, sahte bir dataset oluşturuyoruz - ve oluşturacağımız bu veri kümesini, linear olarak ayrışabilir sınıflara yerleştiriyoruz. İhtiyacımız olan modüller: e1071 ve kernlab.
Kod:
> install.packages("kernlab")
> install.packages("e1071")
> library("kernlab")
> library("e1071")

bir üst sınır belirleyerek, bu sınıra değin çiftler halinde rastgele sayılar üretip, bu çiftleri 2-boyutlu kartezyen koordinat sistemindeki noktalar olarak kabul ediyor; ve verileri {1, -1} olmak üzere ayrıştırıyoruz. Sonuçta elde edeceğimiz grafik şekildeki gibi olacaktır:
Kod:
> n <- 150
> x <- cbind(runif(n),runif(n))
> y <- ifelse(x[,2] > x[,1]^2,1,-1)
>
> plot(x,col=ifelse(y=="1",2,4),pch=20)
> legend("topright",c("y=1","y=-1"),pch=20,col=c(2,4),inset=0.05,bg=gray(1),cex=1.5)

3ELjq4.png

Şekil 8.5​

Artık support vector noktalarımızı belirleyerek, sınıflandırmayı gerçekleştirebiliriz. Elimizde bir adet C değişkeni var, ve bu adı üstünde birçok değere sahip olabilir. Eğer ki bunun en iyi performansı gösterdiği değere yaklaşabilseydik, elbet değişkenimizi ona göre ayarlardık. İşte R, bizim için bunu yapacak.
Kod:
> dat<-data.frame(x=x, y=as.factor(y))
> cost<-tune(svm,y ~ .,data=dat,kernel="linear",ranges=list(cost=c(0.001, 0.01, 0.1, 1,10,100)))$best.model$cost
> svmfit=svm(y ~ ., data=dat, kernel='linear', scale=FALSE, cost=cost)
> plot(svmfit, data=dat)

W7k9QL.png

Şekil 8.5​

iv. son söz::
Bu makalede yer alan her türlü veri, ileriki safhalarda AR-GE ekibinin yürüteceği projelerde ekibe birinci dereceden referans olması maksadıyla hazırlanmıştır. Buraya kadar okuduğunuz için teşekkür ediyorum. Makale, istenilen ortamda istenilen şartlarda paylaşılabilir - zira bilgi paylaştıkça çoğalır.
 

nS4f3

Üye
3 Haz 2017
92
0
Büyük Emek var
Şu an birazını okudum ve hayran kaldım
Anlatım harika Hocam..
 

QwMRz

Katılımcı Üye
19 Ağu 2017
403
0
Rica Etsem Kaynak Belirterek Blog Hesabımda Paylaşabilirmiyim İsimini Felanda Yazarım ?
 

xxtra

Yeni üye
27 Haz 2022
47
43
Herkesin okuması gereken, üstün emek ve bilgiyle yazılmış bir konu. Konuların nasıl yazılması gerektiğinden, teknik olarak nelere değinmelisiniz ve konunun genel yapısı hangi şekilde olmalı gibi bilgileri içeren bir konu yazmaya hazırlanırken ilaç gibi geldi. Forumdaki herkesin bu konuyu okuması için hortlatıyorum. Ellerinize sağlık.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.