Kumarbazlık deneyi (Rasgele yürüyüş)

Stokastik prosesleri öğrenmek için yeni bir kitaba başladım. Bir hafta olmadı daha. Üniversite’de de stokastik dersleri almıştım ama o zamanlarda bilgisayarlarla ilgim yoktu ve sadece teorik kısmını anlamaya çalışmıştım. Bu prosesleri asla somutlaştırmayı, bir şekilde simüle etmeyi denememiştim. Artık matematiksel kısmından çok deneysel kısmına odaklanmak istiyorum. Belki bu konuyu biraz daha sezgisel anlamayı başarabilirim.

İlk deneyde bir kumarbaz var. Bu kumarbazınbaşlangıçta k (bir tamsayı) doları var. Kumarbazımız basit bir yazı tura oyunu oynamayı düşünüyor. Eğer yazı gelirse 1 dolar kazanacak, tura gelirse 1 dolar kaybedecek. Oyun iki şekilde bitebiliyor. Ya kumarbazın hiç parası kalmadığında ya da kumarbazın n doları olduğunda. Burada n de k sayısından daha büyük bir tamsayı.

Bu deneyde bulmak istediğim şey, kumarbazın hangi ihtimalle parasını kaybedeceği. Yazının sonunda simülasyonda kullandığım kodu da (R dilinde) vereceğim.

Bu sorunun cevabının matematiksel olarak nasıl bulunacağını bu yazıda göstermeyeceğim.

Önce, kumarbazımızın olası oyunlarının nasıl görünebileceğini bir iki grafikle görelim. Bütün simülasyonlarda hilesiz para kullandım, yani yazı veya tura gelme ihtimalleri yüzde elli.

Bu grafikte kumarbaz oyunu kazanıyor. Başlangıçta 20 dolar ile başlıyor ve 350 kez civarında yazı tura attıktan sonra 40 dolara ulaşıyor ve oyun bitiyor.

Bu simülasyonda ise kumarbazımız 400 kez yazı tura oynadıktan sonra bütün parasını kaybediyor.

Kumarbazın bu oyunu kazanma ihtimalini deneysel olarak bulmak içinse oyunu birçok defa oynayıp kaçını kazandığını ve kaçını da kaybettiğini saymamız yeterli olacaktır. Aşağıdaki simülasyonları kumarbazın oyunu 1000 kere oynadığı durumlar için yaptım. Paramız hala hilesiz.

Başlangıç parası 20$ ve hedef kazanç 40$ olduğunda yukarıdaki histogramı elde ettim. Soldaki mavi sütun kumarbazın kaç oyunu kaybettiğini, sağdaki mavi sütun da kaç oyunu kazandığını gösteriyor. Kırmızı çizgi de kayıpların toplam oyun sayısına oranını veriyor. Yani kumarbazımız bu oyunun sadece yüzde ellisine yakınını kaybetmiş.

Bu simülasyonda başlangıç parası 20 dolar ama hedef para 60 dolar. Kumarbaz bu oyunların yüzde 64’ünü kaybetmiş.

Başlangıç parasını 20$, hedefi de 80$ yaptığımda da yukarıdaki histogramı elde ettim. Kaybetme oranı bu sefer yüzde 74 oldu.

Bu üç simülasyona bakınca kaybetme oranı sanki (hedef parası – başlangıç parası) / hedef parası gibi gözüküyor. O zaman hedef parasını 100 $’a çıkarırsak kaybetme oranı da yüzde seksene yaklaşmalı. Bunu da denedim.

Sonuç gerçekten beklediğimiz sonuçla uyum içinde. Problemin matematiksel çözümü de aynı sonucu vermekte.

Simülasyonlar ve grafikler için kullandığım R kodu aşağıdadır.

gamble fonksiyonu, kumarbazın bir oyunu için kullanılmaktadır.

k = kumarbazın başlangıçtaki parası

n = kumarbazın ulaşmak istediği para miktarı

p = yazı gelme olasılığı

simulate_gamble fonksiyonu bir oyun sırasında her adımdaki para miktarını simüle edip sonuçları bir grafik olarak gösterir.

do_the_experiment fonksiyonu da bu oyunu bin kere oynatıp sonuçları bir histogram şeklinde gösterir.

gamble <- function(k, n, p) {

  coin_sides <- c("Heads", "Tails")
  probabilities_heads_bias <- c(p, 1 - p)
  state <- k

  while (state > 0 && state < n) {
    single_toss <- sample(x = coin_sides, size = 1, replace = TRUE, prob = probabilities_heads_bias)
    if (single_toss == "Heads") {
      state <- state + 1
    } else {
      state <- state - 1
    }
  }
  if (state == 0) {
    return (1)
  }
  return (0)
}

simulate_gamble <- function(k, n, p) {
  if (k <= 0 || k >= n || p < 0 || p > 1) {
    stop("Invalid input: Ensure 0 < k < n and 0 <= p <= 1")
  }

  coin_sides <- c("Heads", "Tails")
  probabilities_heads_bias <- c(p, 1 - p)
  state <- k

  random_walk <- c(k)

  while (state > 0 && state < n) {
    single_toss <- sample(x = coin_sides, size = 1, replace = TRUE, prob = probabilities_heads_bias)
    if (single_toss == "Heads") {
      state <- state + 1
    } else {
      state <- state - 1
    }
    random_walk <- c(random_walk, state)


  }
  plot(random_walk,
       type = "l",         # "l" for lines is often better for walks, or "b" for both
       lwd = 1.5,          # Line width
       col = "blue",       # Line color
       main = "Kumarbazın rasgele yürüyüşü", # Corrected title
       xlab = "Adım sayısı",                    # Corrected label
       ylab = "Kazanç durumu",               # Corrected label
       ylim = c(0, n)
  )
  # Add horizontal lines for boundaries (optional)
  abline(h = 0, col = "red", lty = 2)
  abline(h = n, col = "red", lty = 2)
}

do_the_experiment <- function(k, n, p) {
  if (k <= 0 || k >= n || p < 0 || p > 1) {
    stop("Invalid input: Ensure 0 < k < n and 0 <= p <= 1")
  }

  trials <- 1000
  simlist <- replicate(trials, gamble(k,n,p))
  mean_value <- mean(simlist)

  hist(simlist,
       main = paste("Kazançların ve kayıpların histogramı"),
       xlab = "Kazançlar/Kayıplar",
       col = "lightblue")

  abline(v = mean_value,
         col = "red",
         lwd = 3)

  legend("topright", legend = paste("Ortalama =", round(mean_value, 2)),
         col = "red", lty = 1, lwd = 3)
}

Monte Carlo yanılgısı (Kumarbaz yanılgısı)

Üniversitede elektronik okumak istiyordum, çünkü aklıma gelen her şey için elektronik devre yapabileceğimi hayal ediyordum. İlk yıllarda bölümün düşündüğüm gibi olmadığını anlayınca bir boşluğa düşmüş oldum. Ne yapabilirim diye düşünürken dördüncü sınıfta aldığım bir dersten sonra istediğim devrelerin çoğunu yazılımla yapabileceğimi farkettim. O andan itibaren tamamen yazılıma kaydım.

Zaman geçtikçe deneyler de ilgimi çekmeye başladı. İlginç bir şekilde okulda deneylere yatkındım ama tembeldim. Deney yapmayı okul hayatım bittikten sonra daha çok sevmeye başladım. Kimya, elektronik deneyleri için bodrumda laboratuvar bile kurdum.

Çok daha sonraları deneylere bilgisayarı da ekledim. Genelde veri toplama ve işleme için kullandım. Son zamanlarda simülasyonlar ve olasılık deneyleri için de programlar yazmaya başladım.

Bugün kumarbaz yanılgısını denemek istedim. Simülasyonda bir kumarbazımız var. Bu kumarbaz yazı tura oyunu oynuyor. Parayı attıktan sonra tahminde bulunuyor ve eski tahminleri de not alıyor. Merak ettiğim şey şuydu: Eğer kumarbaz kararını eski sonuçlara göre verirse rastgele bir karara göre nasıl bir ortalama tutturabilir? Daha iyi mi daha kötü mü?

Bunun için çeşitli stratejileri karşılaştırdım:

  1. Kumarbaz daha önce gelen sonuçları not alır ve eğer daha fazla tura gelmişse yazı, daha fazla yazı gelmişse tura der. Eğer eşit sayıda yazı ve tura gelmişse rastgele karar verir. Bunun da değişik türleri olabilir. Örneğin toplamlar arasındaki fark belli bir sayıdan büyükse bu şekilde davranır, fark küçükse rastgele cevap verebilir.
  2. Kumarbaz her yazı tura atışı için aynı cevabı verir. Hep yazı ya da hep tura.
  3. Kumarbaz her yazı tura atışı için rastgele bir cevap verir (Örneğin başka bir parayla yazı tura atar ve onun sonucunu söyler).

Çok daha farklı stratejiler de bulunabilir elbette ama hedeflerim sadece basit durumları denemek ve kolayca deney tasarlayabileceğim bir sistem kurmak olduğundan burada bıraktım. Şimdi kısaca deneyden ve sonuçlarından bahsedeyim.

Deney programını R dilinde yazdım. Her deney adımında 10000 yazı tura atıldı ve stratejiler doğru tahmin sayılarına göre birbirleriyle karşılaştırıldı. Kazanan strateji o tur için bir puan aldı, diğerleri ise sıfır. Eşitlik durumunda eşit skor alan stratejiler birer puan aldı. 1000 deney sonucunda her stratejinin puanı listelendi.

convert <- function(v) {
  if(v == 'T') {
    1
  } else {
    -1
  }
}

call <- function(v, offset) {
  if(v < -offset) {
    'T'
  } else if(v > offset) {
    'H'
  } else {
    if(sample(c(1, -1), size=1) == 1) {
      'T'
    } else {
      'H'
    }
  }
}

filter_max <- function(l) {
  which(sapply(l, function(x) l[1] %in% x));
}

experiment <- function() {
  number_of_experiments <- 1000;
  constants_H <- "constants_H";
  constants_T <- "constants_T";
  gambler <- "gambler";
  gambler_with_offset_1 <- "gambler_with_offset_1";
  gambler_with_offset_2 <- "gambler_with_offset_2";
  gambler_with_offset_3 <- "gambler_with_offset_3";
  random <- "random";
  counter_gambler <- 0;
  counter_random <- 0;
  counter_constant <- 0;
  counters <- c(constants_H = 0, constants_T = 0, gambler = 0, gambler_with_offset_1 = 0, gambler_with_offset_2 = 0,
                gambler_with_offset_3 = 0, random = 0);
  scores <- c(constants_H = 0, constants_T = 0, gambler = 0, gambler_with_offset_1 = 0, gambler_with_offset_2 = 0,
              gambler_with_offset_3 = 0, random = 0);
  for(i in 1:number_of_experiments) {
    number_of_trials <- 10000;
    coin <- c('T', 'H')
    coins <- sample(coin, size = number_of_trials, replace = TRUE);
    converted_coins = lapply(coins, convert);
    sums = cumsum(converted_coins);

    gambler_guesses = lapply(sums, call, offset = 0);
    gambler_guesses_1 = lapply(sums, call, offset = 1);
    gambler_guesses_2 = lapply(sums, call, offset = 2);
    gambler_guesses_3 = lapply(sums, call, offset = 3);
    random_guesses <- sample(coin, size = number_of_trials, replace = TRUE);
    constant_guesses_H <-sample(c('H'), size = number_of_trials, replace = TRUE)
    constant_guesses_T <-sample(c('T'), size = number_of_trials, replace = TRUE)

    scores[constants_T] = sum(constant_guesses_T == coins);
    scores[constants_H] = sum(constant_guesses_H == coins);
    scores[gambler] = sum(gambler_guesses == coins);
    scores[random] = sum(random_guesses == coins);
    scores[gambler_with_offset_1] = sum(gambler_guesses_1 == coins);
    scores[gambler_with_offset_2] = sum(gambler_guesses_2 == coins);
    scores[gambler_with_offset_3] = sum(gambler_guesses_3 == coins);
    sorted <- scores[order(unlist(scores), decreasing = TRUE)];
    maximum_values <- filter_max(sorted);
    for(x in maximum_values) {
      counters[names(maximum_values[x])] = counters[names(maximum_values[x])] + 1;
    }
  }
  print(counters);
}


Programın son hali bu ama ilk denememde sadece kumarbazın en basit stratejisiyle (daha fazla tura gelmişse yazı, daha fazla yazı gelmişse tura demek) rastgele karar verme stratejisini karşılaştırmıştım. Onun sonuçları ilk bakışta bir sürpriz olmuştu.

1000 deney sonucunda
Kumarbaz = 85
Rastgele = 916

Toplam 1000 deney yaptım ve kazanma toplamları 1000’den fazla olduğuna göre bir deneyde ikisi de eşit skor tutturmuş olmalı. Kumarbaz yanılgısı durumu bildiğim bir olaydı ama durumun ciddiyetinin bu derece olduğunu beklemiyordum. Bu arada küçük bir not da ekleyeyim, bu kavramı biliyordum dedim ama bunun hesaplarını daha önce hiç yapmadım. Bu deneylerin amacı da hesap yapmak değil sadece bu konu hakkında basitçe fikir sahibi olmaktı.

Sonra deneye bir de kumarbazın her zaman yazı dediği stratejiyi ekleyeyim dedim. Beklentim bu stratejini en az rastgele karar verme kadar iyi olması yönündeydi.

1000 deney sonucunda
Kumarbaz = 0
Rastgele = 504
Hep yazı= 502

Üç stratejinin yarıştığı durumda rastgele karar stratejisi kendisine gerçek bir rakip bulmuş gibiydi. Bu ortamda kumarbazın basit stratejisinin artık bir şansı yok gibi görünüyordu.

Sonra programda da yaptığım gibi bütün stratejilerin aynı anda yarıştığı bir deneme yaptım. Bu da sonuçları:

1000 deney sonucunda
Kumarbaz türevleri = 0
Rastgele = 271
Hep yazı = 385
Hep tura = 351

Görüldüğü gibi hep yazı ve hep tura oyunu eşit derecede domine etmeye başladılar. İkisinin de tek başına yaklaşık yüzde elli doğru tahminde bulunacağını beklemek normal bir durum. Diğer stratejiler bundan daha iyi skorlar elde edemeyecektir. Peki kumarbazın stratejisine yardım edilebilir mi? Eğer kumarbazın verdiği kararları biraz daha rastgeleleştirirsek daha iyi sonuçlar almasını beklemek çok da yanlış olmaz. Eğer hep rastgele karar verirse rastgele stratejiye yaklaşacaktır. O zaman rastgele karar verdiği aralığı (toplamlar arasındaki fark) büyüttüm ve bir iyileşme gördüm ama beklediğim hızda bir iyileşme olmadı bu.

1000 deney sonucunda
Kumarbaz (toplamlar arasındaki fark 50 ise rastgele) = 99
Rastgele = 223
Hep yazı = 351
Hep tura = 339

Bu kadar basit bir problem üzerine bu kadar çok deney tasarlanabilmesi hoşuma gitti. Bence deneyler de teoriler kadar önemli bir alan, bence deneyin sonucu teorinin sonucundan daha etkileyici ve şaşırtıcı.