fatiherikli

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

Memorylessness kelimesinin kelimesinin çevirisi, daha uygun bir kelime var mı bilmiyorum, bulamadım. Machine learning konseptlerinde en çok verilen örneklerde birisiyle açıklamaya çalışacağım. Hadi bir hava durumu simulasyonu modellemeye çalışalım.

Tüm adımları saatlik olarak düşünelim.

Bu olasılıkları çoğaltabiliriz. Bu modelin sonlu durum makinesi ile aşağıdaki gibi gösterebiliriz.

Senaryomuzda güneşli bir havadayken yağmur yağabilir, yağmur saatlerce sürebilir. Yağmur yağarken doluya dönüşebilir, dolu çok küçük bir ihtimal sonraki saatlerde de devam edebilir. Doludan güneşli duruma geçiş mümkün değil.

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.

Peki ne işimize yarayacak?

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;

import markovify

text = open("./news.txt").read()
text_model = markovify.Text(text)

for i in range(3):
    print (text_model.make_sentence())

Ben news.txt'i bir haber sitesinden aldığım haberler ile doldurdum, ve çıktım aşağıdaki gibi oldu.

Bitmeyen hikaye

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.

'DIE': [
  [0.5, 'GOD_EXISTS'],
  [0.25, 'REINCARNATE_AS_CABBAGE'],
  [0.25, 'REINCARNATE_AS_TRUCK']
],
'REINCARNATE_AS_TRUCK': [
  [1, 'SLEEP'],
],
'REINCARNATE_AS_CABBAGE': [
  [1, 'SLEEP'],
],
'GOD_EXISTS': [
  [0.5, 'GO_TO_HELL'],
  [0.5, 'GO_TO_HEAVEN'],
],

Durumları geçişlerini olasılıklarıyla birlikte bir javascript dosyasında bu şekilde tanımlı. Tüm demoyu kurcalamak isterseniz github reposunu inceleyebilirsiniz.

http://github.com/fatiherikli/markov-chain-demo

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.

comments powered by Disqus