Markov ile birtakım olaylar zinciri
Son zamanlarda üzerinde uğraşırken çok acayip eğlendiğim bir şeyden bahsetmek istiyorum. Daha önce wikipedia'da oradan buraya zaplarken defalarca kez denk geldiğim, açıklamasını okuyup "hmm güzelmiş" diyip devam ettiğim, ancak çılgın matematik formüllerini görünce "kaç kaç" diyip kapattığım bir olasılıksal süreç; markov zincirleri.
Adı Rus matematikçi Andrey Markov'dan geliyor. Markov zincirleri bize geçmişe bakmaksızın bir durum üzerinden bir başka bir duruma geçiş kurallarını olasılıksal olarak belirleyebildiğimiz bir model sunuyor. Bu sürecin en önemli özelliği hafızasız olması. Hafızasızlık
Tüm adımları saatlik olarak düşünelim. Hava güneşli, büyük olasılıkla (0.8) güneşli devam edecek.
Düşük bir ihtimalle (0.2) güneşliyken yağmura geçecek.
Yağmur büyük ihtimal (0.6) saatlerce devam edecek.
Yağmur yağarken küçük bir ihtimal (0.2) dolu yağabilir.
Dolu yağarken direkt güneş açamaz, ilk önce yağmura geri dönmeli.
Bu olasılıkları çoğaltabiliriz. Bu modelin sonlu durum makinesi ile aşağıdaki gibi gösterebiliriz.
Bir durumdayken başka bir duruma geçiş belirtilen olasılıklarla mümkün. Bir sonraki durumun ne olacağı sadece şu anki durum ile alakalı, daha önce kaç kez yağmur ya da dolu yağdığı hesaplanmıyor. Bu konsepte markov zincirlerinde hafızasızlık özelliği deniyor.
Markov zincirlerinin çok fazla kullanım alanı mevcut. Örneğin bir sesten sonra hangi sesin geleceği olasılığı üzerinden spech recognition (ses tanıma) sistemleri modellenebiliyor. Konuşma ardısal (yine kelime sıçtım) olarak gelişen bir konsept. Bir sonraki kelime şu anki kelimeye göre seçiliyor, ve kullandığınız kelime konuşmanın tüm geleceğini belirliyor.
Bir diğer örnek ise parodi üreteçleri. Markov zincirleri ile bir senaryo, şiir ya da hikaye üretebilirsiniz. Eğer bir kitaptaki tüm kelimeleri ardından gelen kelimeleri ile birlikte kaydedip, içinden bir kelime ile başlayarak X miktarda ardışık kelime üreterek yeni bir hikaye üretebiliriz.
Markovify ile bu modeli kullanarak kolay bir şekilde parodi üreteçlerinizi yapabilirsiniz. Basit bir örnek yapacak olursak;
text = open("./news.txt").read()
Ben news.txt'i bir haber sitesinden aldığım haberler ile doldurdum, ve çıktım aşağıdaki gibi oldu.
Bu adımı atmasını uzun zamandır bekliyordum.
İğrençliğine yetinmeyen kimliği belirsiz kişi geldi.
İğrençliğine ortak olacak insanlar aranıyor.
D3.js ile bir süreç yönetimi demosu yapmaya çalıştım. Demo aşağıdaki durumların birbiri arasındaki dönüşümünden oluşuyor.
Başlangıç durumumuz SLEEP. Bu durumdayken sadece iki duruma geçiş var, ilki tekrar SLEEP, ikincisi ise WAKE_UP. Hikayenin kahramanı uyandığında kahvaltı durumu var. Ardından evden çıkma, arabayı çalıştırma ya da çalıştıramama şeklinde devam ediyor.
Demoyu incelemek için: http://github.com/fatiherikli/markov-chain-demo
Son olarak Khan Academy üzerindeki Markov Chains bölümüne mutlaka gözatmanızı tavsiye ederim. Kutu ve bilye örnekleri çok başarılı. Kolay gelsin.