Bir olasılık yanılsaması

Bu deneyde şu duruma bakacağım:

Elimizde bir yalan makinesi var. Birisi yalan söylediğinde bu yalanı yüzde doksanbeş ihtimalle anlıyor. Birisinin doğru söyledğini de yüzde doksan ihtimalle anlıyor. Yani doğru söyleyen birinde yüzde on ihtimalle yalan söylediğini iddia ediyor. Yüz kişilik bir grubumuz var ve bu grupta bir kişi yalancı, geri kalan herkes doğruyu söylüyor. Gruptan rasgele seçilen birini bu yalan makinesine bağlıyoruz ve kendisine yalan söyleyip söylemediğini soruyoruz. Bu kişi hayır yalan söylemiyorum diyor ve yalan makinesi bu kişinin yalan söylediğini iddia ediyor. Yüzde kaç ihtimalle bu kişi yalancıdır?

Yukarıda da belirttiğim gibi bu soruyu bir deney olarak işleyeceğim. Yani soruyu matematiksel olarak çözmeyi denemeyeceğim. Deneyde 100 kişi alacağım. Rasgele birini yalancı diye işaretleyeceğim, geri kalan hepsi doğrucu olacak. Sonra her kişiyi tek tek yalan makinesine sokacağım ve yalan makinesini sorudaki olasılıklar dahilinde tahminlerde bulunacak. Bu tahminleri de her kişi için işaretleyeceğim. Sonra da gerçek yalancıların sayısının yalancı olarak tahmin edilen kişilerin sayısına oranına bakacağım.

Bu deneyi bir kaç kere yapıp çıkan grafiklere bakalım.

Aşağıdaki grafikler için önce biraz açıklama yapayım. Mavi noktalar, ürettiğim gerçek popülasyon olmaktadır. 1.0 değerine karşılık gelen noktalar, yani kişiler, o kişinin doğruyu söylediğini, 0.0 değerine karşılık gelen noktalar ise o kişinin yalancı olduğunu gösteriyor. Grafikler daha kolay görülsün diye yalan makinesinin çıktılarını kırmızı yaptım 2.0 ve 0.0 değerleriyle eşleştirdim. Yani 2.0 değerine karşılık gelen bireyler yalan makinesinin doğru söylediğine inandığı kişiler ve 0.0 değerine karşılık gelen kişiler ise yalan makinesi tarafından yalancı olduğu tespit edilen kişiler.

Bu deneyde görüldüğü gibi, 100 kişiden sadece 1 tanesi gerçekten yalancı ama yalan makinesi 14 kişiyi daha yalancı olarak tespit etmiş. Bu durumda bir yalancı olduğu tahmin edilen bir kişinin gerçekten yalancı olma ihtimali 1/15 olmakta.

Bu deneyde ise gerçek yalancı dışında 7 tane daha yalancı tespit edilmiş. O zaman yalancı olduğu iddia edilen rasgele birinin gerçekten yalancı olma şansı 1/8 olmakta.

Bu deneyleri yeterince tekrarlayıp ortalamalarını aldığımız zaman teorik sonuçlara oldukça yaklaşabiliriz. İsteyen yazının sonunda vereceğim programı biraz daha geliştirerek bu sonucu da elde edebilir.

Yalan makinesinin tahmin başarısı aslında tek tek bakıldığında yüksek oranlar gibi gözükse de eğer aradığımız özellik popülasyonda çok az bulunan bir özellik ise hiç beklemediğimiz kadar zayıf sonuçlar veriyor. Yani yüzde doksanlarda tahmin başarısı beklediğimiz bir testte başarı yüzde onun altına düşüyor. Bunun nedenlerinden biri tabii ki bir sürü yanlış pozitif tahmin olması. Gerçek pozitif sonuç çok nadir ise bu yalancı pozitifler başarı oranını çok düşürüyor. Popülasyondaki yalancı sayısını artırarak bir iki deney yapayım ve bunun etkilerine bakalım.

Aşağıdaki deneylerde yüz kişilik popülasyonumuzun 10 kişisi yalancıdır.

Yalan makinesi 16 kişinin yalancı olduğunu tespit etmiş. Gerçekte ise 10 yalancı vardı. Demek ki yalancı olduğu iddia edilen birisinin gerçekten yalancı olma şansı 10/16. Başarı oranı birden yüzde onlardan yüzde ellilere geldi.

Bu deneyde de yalan makinesi yanlış saymadıysam 19 kişinin yalancı olduğunu tahmin etmiş. Bu durumda tahminin doğru olma şansı 10/19 yani yine hemen hemen yüzde elli olmakta.

Peki yalancı pozitif ihtimalini düşürürsek nasıl bir başarı oranı bulabiliriz. Yalan makinemiz bu sefer doğrucu bir kişinin doğru söylediğini yüzde doksandokuz oranda tahmin etsin ve popülasyonumuzda yine sadece bir yalancı olsun. Bakalım başarı oranları nasıl değişecek.

Görüldüğü gibi yalancı pozitif sayısı çok daha azaldı ve böylece yalan makinesinin tahmin başarısı arttı ama yine de yüzde doksanlardan çok uzağız. Bu deneydeki başarı oranı 1/2 seviyesinde.

Buna benzer yanılsamalar popülasyonda çok ender görülen hastalıkların yüzde yüz olmayan testlerinde de meydana gelmektedir. Hastalar hastalığın yüzde doksandokuz oranında teşhis edildiğini bilip ve kendi testlerinin de pozitif olduğunu duyunca kesin hasta olduklarını düşünmekte ama gerçek ihtimal bu deneylerde de görüldüğü gibi çok daha düşük olabilmekte. Olasılıklar insan için sezgisel bir alan değil maalesef.

Deneylerde aşağıda verdiğim R kodunu kullandım.

generate_population istenilen popülasyonu yaratan fonksiyon. size parametresi popülasyonun büyüklüğünü, liars ise popülasyon içindeki yalancı bireylerin sayısını belirliyor.

detect_lie fonksiyonu ile yalan makinesini simüle ediyoruz. verilen person kişisi ile iltili tahmini doğru ve yalancı pozitif parametrelerine göre yapıyor.

do_the_experiment fonksiyonu ile bu deney bir popülasyon için yapılmakta ve sonuç grafik olarak gösterilmekte. İstenirse bu deney birçok kere tekrar edilir ve sonuçlar grafikte gösterilmeden sayılarak ortalama bulunabilir. Böylece terorik sonuca yakın bir sonuç elde edilebilir.

generate_population <- function(size, liars) {
  population <- rep(1, size)

  random_indices <- sample(1:size, liars)

  population[random_indices] <- 0

  return (population)
}

detect_lie <- function(person, true_positive, false_positive) {
  estimation <- runif(1)
  if(!is_liar(person) && estimation < false_positive) {
    return (0)
  } else if(is_liar(person) && estimation < true_positive) {
    return (0)
  }
  return (1)
}

is_liar <- function(person) {
  if(person == 1) {
    return (FALSE)
  } else {
    return (TRUE)
  }
}

do_the_experiment <- function() {
  matches <- 0
  detections = c()
  population <- generate_population(100, 1)
  print(population)
  for (person in population) {
    detection <- detect_lie(person, 0.95, 0.01)
    detections <- c(detections, detection)
    if(detection == is_liar(person)) {
      matches <- matches + 1
    }
  }
  x_axis <- 1:length(population)

  processed_detections <- lapply(detections, function(x) {
    # Check if the element is numeric before multiplying
    if (is.numeric(x)) {
      x * 2
    } else {
      # If not numeric, return the element unchanged
      x
    }
  })

  old_par <- par(mar = c(5, 4, 4, 8) + 0.1, xpd = TRUE)
  plot(x_axis, population,
       type = "l",        # Plot as a line
       col = "blue",      # Color the first line blue
       ylim = range(c(population, processed_detections)), # Set y-limits to cover the range of both datasets
       xlab = "Kişi",    # X-axis label
       ylab = "Yalancı / Doğrucu"
  )

  points(x_axis, processed_detections,
        type = "l",        # Add as a line
        col = "red")

  legend("top",       # Position of the legend
         legend = c("Gerçek nüfus (1 doğrucu, 0 yalancı)", "Yalan makinesi tahminleri (2 doğrucu, 0 yalancı)"), # Labels for the legend
         col = c("blue", "red"),    # Colors matching the lines/points
         lty = 1,
         inset = c(0, -0.3))

  par(old_par)
}

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)
}

Jagged Alliance 3 (Xbox One)

Çok çok eskiden bu serinin ilk iki oyununu oynamıştım. Reflekslerin önemsizleştiği, sırayla hamle yapılan strateji türü oyunları hep sevmişimdir.

Oyunu yükledim ve basit seviyede oynamaya başladım. İlk grubumu ucuz elemanlardan seçtim. Başlardaki görevler kolaydı. Bu sırada internette oyun hakkında bilgi toplarken başta para istemeyen bir eleman yaratabileceğimi öğrendim. Bunun üzerine oyuna yeniden başladım.

Patlayıcılar üzerine uzman bir keskin nişancı karakteri yarattım. Bu karakterin tek sorunu hareketlerinin çok az olmasıydı. Bazı görevlerde elemanı olay yerine getirene kadar görev bitiyordu.

Bir iki madeni ele geçirdikten sonra oyun iyice kolaylaşmaya başladı. Para derdi kalmamıştı artık. Ondan sonra bir ikinci grubu daha kiraladım ve daha hızlı yayılmak mümkün oldu böylece. Oyunun sonlarına doğru o kadar çok param vardı ki üçüncü bir grubu daha kiralayabildim.

Oyunda bir çok yan görev var ama onlara bir türlü konsantre olamadım. Daha çok silah ve zırhları geliştirme yoluna gittim. Bunun için düşmanlardan elde ettiğim silahları, zırhları çoğunlukla yedek parça olarak kullandım. Oyunda ihtiyacımız olandan çok daha fazla kaynak var.

Sık sık mermi sıkıntısı yaşadım. Uzun menzilli silahların mermileri öyle çok bulunan şeyler değil. Buna karşı da silah ve mermi siparişleri verebiliyoruz. Onları seçtiğimiz limanlara göndertip orada harita ekranından hemen alabiliyoruz.

Kiraladığım elemanları yine harita ekranında eğitebileceğimi oyunun sonlarında fark ettim. Bu sayede zayıf özellikleri iyice geliştirme şansı buldum. Ayrıca ilk başlarda hızla arazi kazanmaya çalışıyordum ama ilerde bu arazileri elde tutmak için milis güçler de yetiştirmeye başladım. Böylece arazi kaybetme oranım da epey düştü. Ondan sonra oyun zaten iyice kolaylaştı.

Bir bölgeye girince stratejik olarak kolay bir noktaya (yüksek bir yer mesela) gidip, düşmanı oradan kuşatmak genelde işe yarayan bir strateji oldu.

Oyunda beni rahatsız eden bir iki şey de oldu. Özellikle kontrol kısmında. Oyuncuları belli karelere doğru hareket ettirirken çoğunlukla yanlış bir yere bastığımdan eleman hiç istemediğim bir hareket yapıp değerli hareket puanlarını çabucak tüketebiliyor. Örneğin gereksiz bir şekilde kapı açıp kapamak ya da yerdeki ölüleri talan etmek gibi şeyler çarpıima ortasında çok gereksiz hareketler olabilir.

Büyük ihtimalle bilgisayarda fare ve klavye ile çok daha kolay oynanacaktır ama konsolda da çok kötü değildi. Tur bazlı basit strateji oyunları seviyorsanız deneyin derim.