Markov Zinciri : Torbadaki Bilyelerin Simülasyonu

in #tr6 years ago (edited)

Markov
Kaynak

@steinhammer'ın Markov Zincirleri Part #2 - Düşmanlığın Bilim Dünyasına Hediyesi yazısı geldi önüme gecenin bir vakti. Aslında başka bir konuda araştırma yapıyordum ki birden Markov Zincirleri'nin içinde buldum kendimi. İyi de oldu, biraz kafamı dağıttım doğrusu.

Bu tür konularda simulasyon yapmak gerçekten çok eğlenceli oluyor. Matematiği pratik ile doğrulama imkanı veriyor bilgisayarlar bizlere.

Kurallar

  • İki torbamız var.
  • Birinde 50 siyah, 50 beyaz bilye var.
  • Diğerinde 65 siyah, 35 beyaz bilye var.
  • Rastlantısal olarak herhangi birinden bir bilye çekiyoruz:
    • Durum 0: Kaptan çektiğimiz son misketin beyaz renk çıkması durumu
    • Durum 1: Kaptan çektiğimiz son misketin siyah renk çıkması durumu
  • Durum 0'ken beyaz misket çekersek Durum 0'da kalırız.
  • Durum 0'ken siyah misket çekersek diğer torbaya geçeriz böylece durumumuz 1 olur.
  • Durum 1'ken siyah misket çekersek Durum 1'de kalırız.
  • Durum 1'ken beyaz misket çekersek diğer torbaya geçeriz böylece durumumuz 0 olur.

Kolları sıvayıp python ile şöyle küçük bir program yazdım:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random

# Durum 0 torbasına 50 beyaz ve 50 siyah bilye koyalım
durum_torbasi_0 = []
for i in range(0, 50):
    durum_torbasi_0.append("Beyaz")
    durum_torbasi_0.append("Siyah")

# Durum 0 torbasını karıştırıp bilyeleri rastgele sırayalım.
random.shuffle(durum_torbasi_0)

# Durum 1 torbasına 65 siyah, 35 beyaz bilye koyalım
durum_torbasi_1 = []
for i in range(0,65):
    durum_torbasi_1.append("Siyah")
for i in range(0,35):
    durum_torbasi_1.append("Beyaz")

# Durum 1 torbasını karıştırıp bilyeleri rastgele sırayalım.
random.shuffle(durum_torbasi_1)


# Durum 0 torbasından bilye çek
def durum_torbasi_0_bilye_cek():
    if len(durum_torbasi_0) == 0: # Torbada bilye kalmadı ise sonlandır.
        sonuc()
        exit()
    global dt_0_cekilen_bilye
    # Torbadan bilye çek.
    # Torba rastlantısal sıralandığı için listenin ilk öğesi çekilir.
    dt_0_cekilen_bilye = durum_torbasi_0[0]
    del durum_torbasi_0[0] # Çekilen bilyeyi torbadan çıkar.
    toplam_cekilen_bilye_0.append(dt_0_cekilen_bilye) # çekilen bilyeleri bir yerde topla

# Durum 1 torbasından bilye çek
def durum_torbasi_1_bilye_cek():
    if len(durum_torbasi_1) == 0: # Torbada bilye kalmadı ise sonlandır.
        sonuc()
        exit()
    global dt_1_cekilen_bilye
    # Torbadan bilye çek.
    # Torba rastlantısal sıralandığı için listenin ilk öğesi çekilir.
    dt_1_cekilen_bilye = durum_torbasi_1[0]
    del durum_torbasi_1[0] # Çekilen bilyeyi torbadan çıkar.
    toplam_cekilen_bilye_1.append(dt_1_cekilen_bilye) # çekilen bilyeleri bir yerde topla

def sonuc():
    # Durum 0 torbasından çekilenler
    bilye_sayisi_0 = len(toplam_cekilen_bilye_0)
    beyaz_bilye_sayisi_0 = toplam_cekilen_bilye_0.count("Beyaz")
    siyah_bilye_sayisi_0 = toplam_cekilen_bilye_0.count("Siyah")
    beyaz_bilye_orani_0 = float(beyaz_bilye_sayisi_0 / bilye_sayisi_0) * 100
    siyah_bilye_orani_0 = float(siyah_bilye_sayisi_0 / bilye_sayisi_0) * 100

    # Durum 1 torbasından çekilenler
    bilye_sayisi_1 = len(toplam_cekilen_bilye_1)
    beyaz_bilye_sayisi_1 = toplam_cekilen_bilye_1.count("Beyaz")
    siyah_bilye_sayisi_1 = toplam_cekilen_bilye_1.count("Siyah")
    beyaz_bilye_orani_1 = float(beyaz_bilye_sayisi_1 / bilye_sayisi_1) * 100
    siyah_bilye_orani_1 = float(siyah_bilye_sayisi_1 / bilye_sayisi_1) * 100

    # Sonuçları ekrana yaz.
    print("Durum 0 Torbası Çekilen Bilye =", bilye_sayisi_0)
    print("Durum 0 Torbası Çekilen Beyaz Bilye Oranı = ", format(beyaz_bilye_orani_0, '.2f'))
    print("Durum 0 Torbası Çekilen Siyah Bilye Oranı = ", format(siyah_bilye_orani_0, '.2f'))
    print()
    print("Durum 1 Torbası Çekilen Bilye =", bilye_sayisi_1)
    print("Durum 1 Torbası Çekilen Beyaz Bilye Oranı = ", format(beyaz_bilye_orani_1, '.2f'))
    print("Durum 1 Torbası Çekilen Siyah Bilye Oranı = ", format(siyah_bilye_orani_1, '.2f'))


# Torbadan bilye cekme sayısı
sayi = 200

toplam_cekilen_bilye_0 = []
toplam_cekilen_bilye_1 = []

# Hangi torbadan başlanacak? Rastlantısal torba seçimi
durum = random.randint(0,1)

for x in range(0, sayi):
    if durum == 0:
        durum_torbasi_0_bilye_cek()
        cekilen_bilye = dt_0_cekilen_bilye
    elif durum == 1:
        durum_torbasi_1_bilye_cek()
        cekilen_bilye = dt_1_cekilen_bilye

    if cekilen_bilye == "Beyaz":
        durum = 0
    elif cekilen_bilye == "Siyah":
        durum = 1

sonuc()

exit()

Kodları markov-zinciri.py dosyasına kayıt edelim. Programı çalıştıralım.

$ python3 markov-zinciri.py

Genel olarak aşağıdaki gibi sonuçlar çıkıyor:

Durum 0 Torbası Çekilen Bilye = 68
Durum 0 Torbası Çekilen Beyaz Bilye Oranı =  48.53
Durum 0 Torbası Çekilen Siyah Bilye Oranı =  51.47

Durum 1 Torbası Çekilen Bilye = 100
Durum 1 Torbası Çekilen Beyaz Bilye Oranı =  35.00
Durum 1 Torbası Çekilen Siyah Bilye Oranı =  65.00

Peki her iki torbada da 50 siyah, 50 beyaz bilye olur ise sonuç nasıl oluyor?

Durum 0 Torbası Çekilen Bilye = 100
Durum 0 Torbası Çekilen Beyaz Bilye Oranı =  50.00
Durum 0 Torbası Çekilen Siyah Bilye Oranı =  50.00

Durum 1 Torbası Çekilen Bilye = 100
Durum 1 Torbası Çekilen Beyaz Bilye Oranı =  50.00
Durum 1 Torbası Çekilen Siyah Bilye Oranı =  50.00

Şaşırtıcı değil mi?

Sonuç genelde yukarıdaki gibi çıkıyor. Çok nadir de olsa torbalardan birinde 3-5 bilye kaldığı oluyor.

► GitHub : https://github.com/aytekinaygun/Markov-Zinciri-Simulasyon

Sort:  

Congratulations @aytekinaygun! You have completed the following achievement on Steemit and have been rewarded with new badge(s) :

Award for the number of comments

Click on the badge to view your Board of Honor.
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do not miss the last post from @steemitboard:
SteemitBoard World Cup Contest - Let's go for the Quarter-Finals


Participate in the SteemitBoard World Cup Contest!
Collect World Cup badges and win free SBD
Support the Gold Sponsors of the contest: @good-karma and @lukestokes


Do you like SteemitBoard's project? Then Vote for its witness and get one more award!

Hoş bir yazı olmuş, tebrikler. -resteemed

Teşekkürler...