Python ile Bulanık Mantık Modellemesi
Bu yazıda Scikit-Fuzzy’yi kullanarak örnek bir bulanık sistem tasarımını Python üzerinde gerçekleştirmeye çalışacağız.
Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz.
Bulanık mantık veya bulanık sistem kavramlarını ilk kez duyuyorsanız, daha önce yazdığım bu yazıya göz atabilirsiniz.
Scikit-Fuzzy Nedir?
Scikit-Fuzzy, bilimsel ve mühendislik temelli hesaplamalar için kullanışlı araçlar üreten SciPy topluluğu tarafından geliştirilen, Python’da yazılmış açık kaynak bir bulanık mantık kütüphanesidir. Bulanık mantıkla ilgili temel seviyedeki çoğu özelliği barındırmasının yanı sıra; bulanık kümeleme gibi ileri seviye makine öğrenmesi konuları için de kullanışlı araçlara sahiptir. Tamamen ücretsiz ve açık kaynak olmasından dolayı, MATLAB/Fuzzy Logic Toolbox gibi ücretli yazılımlar için iyi bir alternatiftir.
Scikit-Fuzzy’nin web sayfasına buradan ulaşabilirsiniz.
Scikit-Fuzzy Kurulumu
Scikit-Fuzzy’nin çalışabilmesi için, aşağıdaki modüllerin ilgili versiyonlarını veya daha güncel olanlarını yüklemiş olmanız gerekir:
- NumPy >= 1.6
- SciPy >= 0.9
- NetworkX >= 1.9
Pip (PIP install packages) üzerinden kurulum için: İşletim sisteminizin komut satırı/terminal arayüzünü açın ve aşağıdaki komutu çalıştırın:
pip install -U scikit-fuzzy
Kaynak dosyası üzerinden kurulum için: Buradaki bağlantıyı kullanarak, kaynak dosyalarını GitHub üzerinden bilgisayarınıza indirin. İndirilen dosyayı arşivden çıkarın. Komut satırı/terminal arayüzü üzerinden, çıkardığınız dosyanın dizinine geçiş yapın. Aşağıdaki komutu çalıştırın:
python setup.py install
Kurulumları gerçekleştirdikten sonra, herhangi bir Python editörü üzerinden aşağıdaki gibi Scikit-Fuzzy’yi çağırmayı deneyin:
import skfuzzy
Eğer hata almadıysanız, yükleme işlemi başarıyla tamamlanmış demektir.
Örnek: Fren Tasarımı
Bu tasarım probleminde; belirlenen giriş değerlerine karşılık, aracın uygun bir basınç kuvveti ile fren yapabilmesi için basit bir bulanık sistem tasarlanması isteniyor.
Araçların fren sistemi basitçe; aracın hızından kaynaklanan kinetik enerjinin sönümlenerek, ısı enerjisine dönüştürülmesi prensibine göre çalışır. Fren pedalına basıldığı anda, aracın hidrolik mekanizmasında bulunan yağ, yüksek bir basınçla balataları fren diskine doğru sıkıştırır (Şekil 1). Sıkışma sonucu oluşan sürtünme kuvvetinin etkisiyle araç yavaşlamaya başlar ve belirli bir süre sonra durur. Fren pedalına ne kadar güçlü basılırsa, hidrolik basınçtan kaynaklanan sıkıştırma etkisi de o kadar büyük olacaktır.
Bu bilgiler ışığında, fren sistemini bulanık mantıkla kontrol edebilecek tasarımı gerçekleştirelim. Giriş ve çıkış değerleri aşağıdaki gibi tanımlanmış olsun:
- Girişler: Pedal Basıncı (%), Araç Hızı (mph)
- Çıkış: Fren (%)
Giriş çıkışlar için dilsel değerler de şu şekildedir:
- Pedal Basıncı: Düşük, Orta, Yüksek
- Araç Hızı: Düşük, Orta, Yüksek
- Fren: Zayıf, Güçlü
Belirlenen kurallar ise:
- KURAL 1: EĞER Pedal Basıncı Orta İSE, O HALDE Fren Güçlüdür.
- KURAL 2: EĞER Pedal Basıncı Yüksek VE Araç Hızı Yüksek İSE, O HALDE Fren Güçlüdür.
- KURAL 3: EĞER Pedal Basıncı Düşük VEYA Araç Hızı Düşük İSE, O HALDE Fren Zayıftır.
- KURAL 4: Eğer Pedal Basıncı Düşük İSE, O HALDE Fren Zayıftır.
şeklindedir. Bu aşamadan sonra, bulanık sistemimizi simüle etmek için Python ortamına geçebiliriz.
Öncelikle kullanacağımız kütüphaneleri ekleyelim:
- NumPy, Scikit-Fuzzy ve (görselleştirme için) Matplotlib kütüphanelerini ekliyoruz. ‘membership’, birazdan değineceğimiz üyelik fonksiyonlarını oluşturmaya yarayan bir Scikit-Fuzzy sınıfıdır.
- Pedal basıncı, araç hızı ve fren değişkenlerinin her biri için birer değişken üretiyoruz. NumPy kütüphanesinden ‘arange’ metodu ile her bir değişken için [0, 100] aralığını tanımlıyoruz.
- Yukarıda belirlediğimiz dilsel değerlerin her biri için, üyelik fonksiyonlarını oluşturuyoruz. ‘trimf’ metodu, triangular membership function yani üçgen üyelik fonksiyonu anlamına gelmektedir. İlk parametresi oluşturulacak değişken için tanım aralığını; ikinci parametresi ise üçgenin başlangıç, orta ve bitiş noktalarını (tanım aralığı üzerinde) belirten birer listeden oluşur. Üçgen üyelik fonksiyonlarını bu şekilde oluşturduk. Hatırladığınız gibi, çok sayıda üyelik fonksiyonu tipi bulunuyordu (gausyen, üstel, sigmoid vb.). Scikit-Fuzzy ile bu üyelik fonksiyonları da oluşturulabilir. Detaylar için, buradaki dokümana göz atabilirsiniz.
- Oluşturduğumuz fonksiyonları, Matplotlib kütüphanesini kullanarak grafiğe dökelim:
Buraya kadar elde edilen görsel çıktımız şu şekilde olacaktır:
- Giriş değerlerimizi aşağıdaki gibi tanımlayalım:
- Belirlediğimiz giriş değerleri için, yukarıda üyelik fonksiyonlarıyla oluşturduğumuz bulanık kümelere olan üyelik derecelerini hesaplayalım:
- ‘interp_membership’ metodu, üyelik değerlerinin hesaplanmasında kullanılan bir metottur. İlk parametesi ilgili değişken için tanım aralığını, ikinci parametresi ilgili bulanık kümenin tanım aralığını, üçüncü parametesi ise giriş değerini almaktadır.
- Giriş değerlerini bulanıklaştırdık. Artık kurallarımızın sahneye çıkma vakti geldi:
- NumPy kütüphanesine ait ‘fmax’ ve ‘fmin’ metotları, elemanter düzeyde karşılaştırma yaparak, listelerin minimum ve maksimum elemanlarını bulan metotlardır. Örneğin; [1, 2, 5] ve [2, 0, 3] listeleri fmin metoduna verilirse, bu metodun döndürdüğü yeni liste [1, 0, 3] şeklinde olur. Yani; her bir elemanı, eş sıralı diğer elemanla karşılaştırıp min yada max olanı hesaplıyorlar. Burada ise, bulanık mantık kullanımında anlamlı olması açısından; fmax metodunu veya bağlacı yerine, fmin metodunu da ve bağlacı yerine kullanıyoruz. En dışarıda fmin metodunu kullanmamızın nedeni ise: hesaplanan üyelik değerinin üstündeki değerleri almamak içindir.
- İlgili girişlere göre hesaplanan kural çıkışlarını, aşağıdaki gibi fmax metoduna veriyoruz. Burada amaçladığımız şey, aynı çıkışı veren bulanık kümelerin birleşim kümesini hesaplamaktır (Hatırlayın, MAX operatörü bulanık kümelerde birleşimi ifade ediyordu).
- Girişlerin çıkış kümeleri üzerinde kestiği bölgeleri, yine Matplotlib kütüphanesini kullanarak görselleştirelim:
- Görsel çıktımız aşağıdaki gibidir:
- Son aşama olarak durulaştırma işlemine geçiyoruz. Öncelikle, çıkış kümeleri üzerinde gösterilen alanların yine fmax metodunu ile birleşimini hesaplayalım ve bir tek çıkış kümesi şeklinde durulaştırma fonksiyonuna devredelim.
- ‘out_brake’, çıkış kümemizin son halidir. ‘defuzz’ metodu ise, durulaştırma fonksiyonudur. Birinci parametre çıkış değişkeninin tanım aralığını, ikinci parametre giriş değerleriyle elde edilen alanı, üçüncü parametre ise durulaştırma yöntemini belirtir. ‘centroid’ yöntemi, önceki yazıda da bahsettiğimiz, ağırlık merkezi yöntemidir. Diğer yöntemlere yine Scikit-Fuzzy’nin dökümanı üzerinden ulaşabilirsiniz. ‘defuzzified’ değişeni, artık bulanık sistemden son çıkan durulaşmış değeri tutmaktadır. ‘result’ değişkeni ise, hesaplanan ağırlık merkezinin tam olarak hangi üyelik derecesine denk geldiğini tutmaktadır.
- Çıkış değeri ve grafik üzerinde gösterimi ise aşağıdaki gibidir:
- Buna göre, Fren değişkeni için hesaplanan çıkış değeri %63.2'dir.
Sonuç
Tasarladığımız bulanık sistem; %40 pedal basıncına ve 75 mph araç hızına karşın, frenleme için yaklaşık %63’lük bir oran ile hidrolik sistemi tahrik edecek bir çıkış değeri önermiştir.
Tasarımımızın ne kadar iyi çalıştığı başka bir tartışmanın konusudur. :) Sistemin gelişimi, titizlikle oluşturulmuş kurallar ve bulanık küme tanımlamalarıyla sağlanabilir.
Bu yazıda basit bir bulanık sistemi, Python üzerinde Scikit-Fuzzy kütüphanesi ile simüle etmeyi denedik. Sonraki yazılarda görüşmek dileğiyle. Okuduğunuz için teşekkür ederim.