18 Haziran 2014

Perceptron öğrenme algoritması (Perceptron Learning)

Yapay zekadaki makine öğrenmesi(machine learning) algoritmalarından önemli biri olan Perceptron öğrenme algoritmasından ve C# diliyle yazılmış kodlardan bahsedeğim

Öncelikle kodumuzu verelim :

https://github.com/muhammedtanriverdi/Perceptron_Learning_C_Sharp


Perceptron algoritması gözlenmiş verileri kullanarak yeni gelecek verilerin sonuçlarını tahmin etmede kullanılır. Algoritmanın temel prensibini 2 boyutlu düzlemde anlatmaya çalışayım.

X ve Y koordinatları giriş verilerimizi ifade etsin. Sonuç verimiz ise + ya da - olsun.

X = 1 ve Y = 2 olduğunda sonucumuz - olur gibi değerler vererek devam edelim.
Burada şöyle düşünülebilir;
X değeri kandaki X maddesinin değeri
Y değeri kandaki Y maddesinin değeri
+ ya da - değerleri ise;
+ Hasta
- Hasta değil


12-
15+
16+
25-
28+
312+
36-
311+
414+
43-
41-
516+
515-
517+

14 adet gözlenmiş veriyi perceptron algoritması ile makinaya öğreteceğiz. Daha sonra ise yeni gelen kandaki X maddesi ve Y maddesine göre kişinin hasta olup olmadığına makina karar verebilecek.

2 boyutlu düzlemde verilerimize göz atalım :


Grafikte görüldüğü gibi hasta olan ve hasta olmayan kişilerin değerlerine bağlı olarak bir vektör ile ayırılabiliyor. İşte perceptron algoritması bu tip veriler için çalışabilen bir algoritma.

Algoritma ilk başta uzayda herhangi bir vektör alıp bütün veriler için tamamen ayrılık sağlayıp sağlamadığına bakıyor.
Eğer sağlamıyorsa vektörü kaydırıp tekrar tekrar bütün veriler için sağlanana kadar devam eder. Eğer herhangi bir vektör ile sağlanamıyorsa sonsuza kadar devam eder. Bunu engellemek için koda maksimum döngü sayısı verilebilir.

Şimdi algoritmamızın detaylı olarak anlatalım :
Orijinal anlatım için  (Introduction to Neuro-Fuzzy Systems Yazar:Robert Fuller) kitabına başvurabilirsiniz.  

Kitaptaki örnek veriler üzerinden devam edelim.

Başlangıç vektörü rastgele seçilir.
W0 =
Veri seti aşağıdaki şekilde.

Adım 1 : n>0 seçelim (n = öğrenme katsayısı) n = 0.1 olsun.
Adım 2 : E = 0 ve k = 1 seçilir. (E = Error, k = iterasyon sayısı)
Adım 3 : Toplamda üç adet veri üçlülerimiz var, yani k = 3(üç adet) olduğunda bütün verileri test etmiş olacağız. Sırası ile test etmeye başlayalım.

İlk veri üçlümüz (1,0,1)T ve sonucu -1 olması gerekir. W0 ile X1 çarpılır.

Adım 4 : Çıkan sonucun sign(işaret fonksiyonu) değeri alınır. Sign(1) = 1; peki sonucumuzun ne olması gerekiyordu? -1 olması gerekirdi. Bu demek oluyor ki, başlangıçta seçtiğimiz vektöre göre bu veri yanlış sonuç veriyor. Yanlış olduğu için n(öğrenme katsayısı) değerine göre vektör kaydırılır.
W1 = W0 + n (gerçek sonuç - sign(çıkan sonuç)) * X1

Yeni vektörümüz (0.8, -1, -0.2)T

Adım 5 : Error değeri hesaplanır. 
E = 0 + 1/2 ||-1-1||^2
E = 2

Adım 6 : Eğer k < 3 (3 = tüm veri üçlülerimizin sayısı) ise k = k + 1 yap ve 3. adıma geri dön ve işlemlere devam et.

Adım 3: İkinci veri üçlümüz (0, -1, -1)T ve sonucu 1 olması gerekir. Değişen vektör ile işlemlere devam ediyoruz.

Adım 4 : Sign(1.2) = 1 ve sonucumuz da 1 olması gerektiğinden vektörü kaydırmamıza gerek yok. Formüle göre hareket edersek de kaydırma yapmayacaktır. Çünkü (1-1) = 0 olduğundan aynısı çıkacaktır.

Adım 5 : Error değeri değişmiyor. Çünkü (1-1) = 0 olduğundan aynısı çıkacaktır.

Adım 6 : k < 3 doğru mu? evet doğru. O zaman k = k + 1 yapılır ve 3. Adıma gidilir. Yeni k değerimiz 3 oldu.

Adım 3 : Üçüncü veri üçlümüz (-1, -0.5, -1)T ve sonucu -1 olması gerekir. 

Adım 4 : Sign(-0.1) = -1. Sonucumuz 1 olduğundan hata var. Yeni vektörümüzü hesaplarız.
W3 = W2 + n (olması gereken sonuc - sign(çıkan sonuç)) * X3

Adım 5 : Error değeri hesaplanır. Şu anki error değerimiz 2.

E = 2 + 1/2 ||1+1||^2
E = 4
Adım 6 : k < 3 mü? HAYIR. Bu işlemden sonra Adım 7'ye geçilir. 
Adım 7 : Error = 0 ise vektör son haline gelmiştir. Sonlandır. 
             Eğer error = 0 değilse, Error = 0 yap, k = 1 yap ve Adım 3'e dön.

İşlemler bu şekilde devam eder.

Bizim ilk baştaki 14 adet veri grubumuza dönersek, sonuç vektörünün kaç çıktığına bakalım.

NOT : Sonuç vektörü başlangıç vektörü ve n katsayısına göre farklılık gösterir.



Başlangıç vektörü ve n(teta) değerine göre sonuç vektörümüz (-7.60 ; 2.40) çıkmış. 

Peki bundan sonra yeni gelen verilerin hasta mı hasta değil mi olduklarını nasıl anlarız...

Mesela diyelim ki (1,1) yeni verisi geldi. İşlemimiz bu veri ile vektörümüzü çarpıp Sign() değerini almak.
(1,1) * (-7.60,2,40) = -5.20
Sign(-5.20) = -1 ; yani hasta değil ;)


Umarım yardımcı olabilmişimdir, kolay gelsin....



Bu Blogda Ara

İletişim

Ad

E-posta *

Mesaj *