Python İle Mini Bayesian Network Motoru Tasarımı

Herkese merhaba,

Bu yazıda Python ile mini bir bayesian network motoru nasıl tasarlanabilir bundan bahsedeceğim.

Varsayalım ki bir metnin robot üretimi mi veya insan üretimi mi olduğunu ölçmek istiyoruz. Elimizde bir metnin robot tarafından mı yoksa insan tarafından mı üretildiğini test eden üç araç olsun.

Bu araçlara metin yüklediğimizde bize + veya - sonuçlar veriyorlar.

Metinlerle ilgili şunlar biliniyor olsun:

  • P(R) = 0.25 : Robotlar tarafından üretilen metin oranı.

  • P(H) = 0.75 : İnsanlar tarafından üretilen metin oranı.

  • P(R) + P(H) = 1

Araçlarla ilgili olarak da aşağıdakiler bilinmektedir.

  • P(D_1^+|R) = 0.90 : Bir robot tarafından üretilmiş bir metni D_1 aracının + olarak işaretleme olasılığı.

  • P(D_1^-|H) = 0.85 : Bir insan tarafından üretilmiş bir metni D_1 aracının - olarak işaretleme olasılığı.

  • P(D_2^+|R) = 0.84 : Bir robot tarafından üretilmiş bir metni D_2 aracının + olarak işaretleme olasılığı.

  • P(D_2^-|H) = 0.78 : Bir insan tarafından üretilmiş bir metni D_2 aracının - olarak işaretleme olasılığı.

  • P(D_3^+|R) = 0.95 : Bir robot tarafından üretilmiş bir metni D_3 aracının + olarak işaretleme olasılığı.

  • P(D_3^-|H) = 0.93 : Bir insan tarafından üretilmiş bir metni D_3 aracının - olarak işaretleme olasılığı.

Bir metnin robot üretimi olup olmadığını test etmek için birden çok araç kullanabiliriz. Bu araçların birbirine bağımlı veya bağımsız olmasına göre farklı olasılık modellerini hesaplamamız gerekir.

Birazdan sırayla tek bir araç için, iki araç için ve üç araç için farklı senaryolara göre olasılık modelleri oluşturacağız. Ama ondan önce iki veya üç araç kullanarak modelleme yaptığımızda bilmemiz gereken koşullu bağımlılık ilişkilerini tanımlayalım:

  • D_2, D_1'e bağımlı ise:

    • P(D_2^+|R,D_1^+) = 0.95 : Bir robot tarafından üretilmiş bir metni D_1 aracı + olarak işaretlemiş ise D_2 aracının metni + olarak işaretleme olasılığı.

    • P(D_2^+|R,D_1^-) = 0.35 : Bir robot tarafından üretilmiş bir metni D_1 aracı - olarak işaretlemiş ise D_2 aracının metni + olarak işaretleme olasılığı.

    • P(D_2^+|H,D_1^+) = 0.56 : Bir insan tarafından üretilmiş bir metni D_1 aracı + olarak işaretlemiş ise D_2 aracının metni + olarak işaretleme olasılığı.

    • P(D_2^+|H,D_1^-) = 0.45 : Bir insan tarafından üretilmiş bir metni D_1 aracı - olarak işaretlemiş ise D_2 aracının metni + olarak işaretleme olasılığı.

  • D_3, D_1'e bağımlı ise:

    • P(D_3^+|R,D_1^+) = 0.92 : Bir robot tarafından üretilmiş bir metni D_1 aracı + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|R,D_1^-) = 0.13 : Bir robot tarafından üretilmiş bir metni D_1 aracı - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_1^+) = 0.16 : Bir insan tarafından üretilmiş bir metni D_1 aracı + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_1^-) = 0.23 : Bir insan tarafından üretilmiş bir metni D_1 aracı - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

  • D_3, D_2'ye bağımlı ise:

    • P(D_3^+|R,D_2^+) = 0.94 : Bir robot tarafından üretilmiş bir metni D_2 aracı + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|R,D_2^-) = 0.24 : Bir robot tarafından üretilmiş bir metni D_2 aracı - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_2^+) = 0.14 : Bir insan tarafından üretilmiş bir metni D_2 aracı + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_2^-) = 0.18 : Bir insan tarafından üretilmiş bir metni D_2 aracı - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

  • D_3, D_1 ve D_2'ye bağımlı ise:

    • P(D_3^+|R,D_1^+,D_2^+) = 0.98 : Bir robot tarafından üretilmiş bir metni D_1 aracı +, D_2 aracı da + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|R,D_1^+,D_2^-) = 0.67 : Bir robot tarafından üretilmiş bir metni D_1 aracı +, D_2 aracı da - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|R,D_1^-,D_2^+) = 0.53 : Bir robot tarafından üretilmiş bir metni D_1 aracı -, D_2 aracı da + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|R,D_1^-,D_2^-) = 0.49 : Bir robot tarafından üretilmiş bir metni D_1 aracı -, D_2 aracı da - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_1^+,D_2^+) = 0.65 : Bir insan tarafından üretilmiş bir metni D_1 aracı +, D_2 aracı da + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_1^+,D_2^-) = 0.54 : Bir insan tarafından üretilmiş bir metni D_1 aracı +, D_2 aracı da - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_1^-,D_2^+) = 0.41 : Bir insan tarafından üretilmiş bir metni D_1 aracı -, D_2 aracı da + olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.

    • P(D_3^+|H,D_1^-,D_2^-) = 0.03 : Bir insan tarafından üretilmiş bir metni D_1 aracı -, D_2 aracı da - olarak işaretlemiş ise D_3 aracının metni + olarak işaretleme olasılığı.
      Şimdi oluşturacağımız bütün modellerde geçerli olacak basit bir Python uygulaması oluşturalım.

from math import log2
from itertools import product
from functools import lru_cache

CPT = dict[tuple[bool, ...], dict[bool, float]]


class Node:
    def __init__(
        self, 
        cpt: CPT, 
        parents: list['Node', ...] = None,
        name: str = None
    ):      
        if not self.is_cpt(cpt):
            raise ValueError("Invalid CPT")
        self.__cpt = cpt
        self.__parents = tuple(parents) if parents else ()
        self.__name = name if name else str(id(self))
        
    @property
    def name(self):
        return self.__name

    @property
    def cpt(self):
        return self.__cpt
        
    @property
    def parents(self):
        return self.__parents

    def is_cpt(self, cpt: CPT) -> bool:
        if not isinstance(cpt, dict):
            return False
        repeat = int(log2(len(cpt)))
        keys = set(product((True, False), repeat=repeat))
        if set(cpt.keys()) != keys:
            return False
        for entry in cpt.values():
            if set(entry.keys()) != {True, False}:
                return False
            if not abs(sum(entry.values()) - 1) < 1e-9:
                return False
        return True


def posterior_probability(
    p_prior: dict[bool, float], 
    nodes: list[Node], 
    evidence: dict[str: bool]
) -> float:
    def marginalize(
        cpt: CPT, 
        parents: list[Node], 
        key: tuple[bool, ...]
    ) -> dict[bool, float]:
        if not parents:
            return cpt[key]
        parent, *rest = parents
        if parent.name in evidence:
            return marginalize(cpt, rest, key + (evidence[parent.name],))
        else:
            left = marginalize(cpt, rest, key + (True, ))
            right = marginalize(cpt, rest, key + (False, ))
            return {k: left[k] + right[k] for k in left}         
            
    @lru_cache(maxsize=None)
    def joint_probability(hypothesis: bool) -> float:
        p_joint = p_prior[hypothesis]
        for node in nodes:
            cpt_entry = marginalize(node.cpt, node.parents, (hypothesis, ))
            if node.name in evidence:
                p_joint *= cpt_entry[evidence[node.name]]
            else:
                p_joint *= sum(cpt_entry.values())
        return p_joint
    
    p_true, p_false = tuple(map(joint_probability, (True, False)))
    return p_true / (p_true + p_false)    

Node sınıfı, bağımlı veya bağımsız gözlemleri temsil etmek için kullanacağımız sınıftır. Bu sınıftan örnek oluştururken cpt adında sözlük tipinde geçerli bir argüman yazılmalı. parents argümanı ise list tipinde olup, aracın bağlı olduğu başka bir araç varsa kullanılır.

  • Geçerli bir cpt verisinin yapısı, dict[tuple[bool, ...], dict[bool, float]] veri yapısına uyar.

  • parents niteliği ise, bir aracın bağımlı olduğu diğer araçları içerir.

  • name niteliği ise, evidence sözlüğünde anahtar olarak kullanılır.

posterior_probability() fonksiyonu ise üç argüman alır:

  • p_prior: dict[bool: float] veri yapısında olan bir ön olasılık. Örneğin popülasyonda robotlar tarafından yazılmış metin oranı.

  • nodes: list[Node] tipinde, p_prior olasılığı güncellerken kullanacağımız diğer koşullu durumları tutan liste.

  • evidence: p_prior olasılığı güncellerken kullanacağımız gözlemlenmiş koşullu durumları ve bunların boolean sonuçlarını içeren dict[str: bool] yapısında bir sözlüktür.

posterior_probability() fonksiyonu ise kendi içinde iki başlıkta incelenebilir:

  • joint_probability() fonksiyonunda, p_prior olasılığının güncellenmesinde kullanılmak üzere her bir düğüm marginalize() fonksiyonuna gönderilir.

  • marginalize() fonksiyonuna gönderilen bir düğümün, başka düğümlere bağımlı olup olmadığı if parents satırı ile sorgulanır. Şayet düğümün parents niteliği boşsa cpt[key] fonksiyondan döndürülür. Eğer düğümün parents niteliği doluysa, listedeki ilk parent düğümün evidence içinde olup olmadığı kontrol edilir. Eğer parent düğümün name niteliği evidence sözlüğüne eklenmişse, (key, ) + (evidence[parent.name],) ifadesi yoluyla key güncellenir ve marginalize() fonksiyonu güncellenmiş key ile tekrar çağrılır. Her bir öz-yinelemeden önce parents listesinden sırası gelen parent düşürülür. parents listesi boşaldığında fonksiyondan cpt[key] döner. Eğer parent düğümün name niteliği, evidence sözlüğüne eklenmemişse; hem sol, hem de sağ dal ayrı ayrı marjinalize edilir ve son olarak da sol ve sağ dallardaki değerler toplanarak tek bir dict[bool, float] nesnesi döndürülür. Özetle her koşulda fonksiyondan dict[bool, float] yapısında bir veri döner.

1 Beğeni

Artık farklı sayıda araçlar kullandığımızda, bu araçların birbirleriyle bağımlı veya bağımsız olma durumlarını dikkate alarak olasılıkları hesaplayabiliriz.

Şimdi, önce tek bir araç kullanarak bu araca bağlı olarak bir metnin robot tarafından üretilme olasılıklarını inceleyelim. Sonra da yavaş yavaş ağımızı genişletelim.

  1. Bir araç kullanırsak:

    Grafiksel gösterim:

    R \to D_1

    Sadece D_1'i kullandığımızda 2^1 = 2 alt senaryoya göre robot gelme olasılığını güncelleyebiliriz.

    1. P(R|D_1^+) : Araç pozitif sonuç üretirse.

      \begin{align} p\_true =& P(R) P(D_1^+|R) \\ p\_false =& P(H) P(D_1^+|H) \\ P(R|D_1^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
    2. P(R|D_1^-) : Araç negatif sonuç üretirse.

      \begin{align} p\_true =& P(R) P(D_1^-|R) \\ p\_false =& P(H) P(D_1^-|H) \\ P(R|D_1^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

    Python ile yazalım:

    p_prior = {True: 0.25, False: 0.75}
    
    d1 = Node({
        (True,): {True: 0.9, False: 0.1},
        (False,): {True: 0.15, False: 0.85}
    })
    
    for p in product((True, False), repeat=1):
        prob = posterior_probability(p_prior, [d1], {d1.name: p[0]})
        print(p, prob)
    

    Yukarıdaki Python kodunun çıktısı:

    (True,) 0.6666666666666666
    (False,) 0.03773584905660378
    

    Olasılıklar:

    • P(R|D_1^+) = \% 66.67

    • P(R|D_1^-) = \% 3.77

  1. İki araç kullanırsak:

    D_1 ve D_2'yi birlikte kullandığımızda 2^2 = 4 alt senaryoya göre robot gelme olasılığını güncelleyebiliriz.

    • D_2, D_1'den bağımsız ise:

      Grafiksel gösterim:

      R \to D_1 ,\, R \to D_2
      1. P(R|D_1^+,D_2^+) : Her iki araç da pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) \\ P(R|D_1^+,D_2^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      2. P(R|D_1^+,D_2^-) : İlk araç pozitif, ikinci araç negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) \\ P(R|D_1^+,D_2^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      3. P(R|D_1^-,D_2^+) : İlk araç negatif, ikinci araç pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) \\ P(R|D_1^-,D_2^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      4. P(R|D_1^-,D_2^-) : Her iki araç da negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) \\ P(R|D_1^-,D_2^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

      Python ile yazalım:

      p_prior = {True: 0.25, False: 0.75}
      
      d1 = Node({
          (True,):  {True: 0.9, False: 0.1},
          (False,): {True: 0.15, False: 0.85}
      })
      
      d2 = Node({
          (True,): {True: 0.84, False: 0.16}, 
          (False,): {True: 0.22, False: 0.78}
      })
      
      for p in product((True, False), repeat=2):
          prob = posterior_probability(p_prior, [d1, d2], {d1.name: p[0], d2.name: p[1]})
          print(p, prob)
      

      Yukarıdaki Python kodunun çıktısı:

      (True, True) 0.8842105263157894
      (True, False) 0.29090909090909095
      (False, True) 0.1302325581395349
      (False, False) 0.007980049875311722
      

      Olasılıklar:

      • P(R|D_1^+,D_2^+) = \% 88.42

      • P(R|D_1^+,D_2^-) = \% 29.09

      • P(R|D_1^-,D_2^+) = \% 13.02

      • P(R|D_1^-,D_2^-) = \% 0.8

    • D_2, D_1'e bağımlı ise:

      Grafiksel gösterim:

      R \to D_1 ,\, R \to D_2 ,\, D_1 \to D_2
      1. P(R|D_1^+,D_2^+) : Her iki araç da pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) \\ P(R|D_1^+,D_2^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      2. P(R|D_1^+,D_2^-) : İlk araç pozitif, ikinci araç negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) \\ P(R|D_1^+,D_2^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      3. P(R|D_1^-,D_2^+) : İlk araç negatif, ikinci araç pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) \\ P(R|D_1^-,D_2^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      4. P(R|D_1^-,D_2^-) : Her iki araç da negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) \\ P(R|D_1^-,D_2^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

      Python ile yazalım:

      p_prior = {True: 0.25, False: 0.75}
      
      d1 = Node({
          (True,):  {True: 0.9, False: 0.1},
          (False,): {True: 0.15, False: 0.85}
      })
      
      d2 = Node({
          (True, True): {True: 0.95, False: 0.05},
          (True, False): {True: 0.56, False: 0.44},
          (False, True): {True: 0.35, False: 0.65},
          (False, False): {True: 0.45, False: 0.55}
      }, parents=[d1])
      
      for p in product((True, False), repeat=2):
          prob = posterior_probability(p_prior, [d1, d2], {d1.name: p[0], d2.name: p[1]})
          print(p, prob)
      

      Yukarıdaki Python kodunun çıktısı:

      (True, True) 0.8444444444444444
      (True, False) 0.13333333333333336
      (False, True) 0.046530951391773996
      (False, False) 0.030418250950570342
      

      Olasılıklar:

      • P(R|D_1^+,D_2^+) = \% 84.44

      • P(R|D_1^+,D_2^-) = \% 13.33

      • P(R|D_1^-,D_2^+) = \% 4.65

      • P(R|D_1^-,D_2^-) = \% 3.04

  1. Üç araç kullanırsak:

    D_1, D_2 ve D_3'ü birlikte kullandığımızda 2^3=8 alt senaryoya göre robot gelme olasılığını güncelleyebiliriz.

    • D_2, D_1'den bağımsız ise

      • D_3, D_1 ve D_2'den bağımsız ise

        Grafiksel gösterim:

        R \to D_1 ,\, R \to D_2 ,\, R \to D_3
        1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^+|H) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^-|H) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^+|H) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^-|H) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^+|H) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^-|H) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^+|H) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^-|H) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

        Python ile yazalım:

        p_prior = {True: 0.25, False: 0.75}
        
        d1 = Node({
            (True, ): {True: 0.9, False: 0.1}, 
            (False, ): {True: 0.15, False: 0.85}
        })
        
        d2 = Node({
            (True, ): {True: 0.84, False: 0.16}, 
            (False, ): {True: 0.22, False: 0.78}
        })
        
        d3 = Node({
            (True, ): {True: 0.95, False: 0.05}, 
            (False, ): {True: 0.07, False: 0.93}
        })
        
        for p in product((True, False), repeat=3):
            prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
            print(p, prob)
        

        Yukarıdaki Python kodunun çıktısı:

        (True, True, True) 0.9904430929626412
        (True, True, False) 0.2910602910602911
        (True, False, True) 0.8477412158393753
        (True, False, False) 0.021580793094146216
        (False, True, True) 0.6701940035273368
        (False, True, False) 0.007985853630711312
        (False, False, True) 0.0984264715405038
        (False, False, False) 0.0004322992375322199
        

        Olasılıklar:

        • P(R|D_1^+,D_2^+,D_3^+) = \% 99.04

        • P(R|D_1^+,D_2^+,D_3^-) = \% 29.11

        • P(R|D_1^+,D_2^-,D_3^+) = \% 84.77

        • P(R|D_1^+,D_2^-,D_3^-) = \% 2.16

        • P(R|D_1^-,D_2^+,D_3^+) = \% 67.02

        • P(R|D_1^-,D_2^+,D_3^-) = \% 0.79

        • P(R|D_1^-,D_2^-,D_3^+) = \% 9.84

        • P(R|D_1^-,D_2^-,D_3^-) = \% 0.04

      • D_3, D_1'e bağımlı ise

        Grafiksel gösterim:

        R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_1 \to D_3
        1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^+|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^+|H,D_1^+) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^-|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^-|H,D_1^+) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^+|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^+|H,D_1^+) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^-|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^-|H,D_1^+) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^+|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^+|H,D_1^-) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^-|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^-|H,D_1^-) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^+|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^+|H,D_1^-) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^-|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^-|H,D_1^-) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

        Python ile yazalım:

        p_prior = {True: 0.25, False: 0.75}
        
        d1 = Node({
            (True, ): {True: 0.9, False: 0.1}, 
            (False, ): {True: 0.15, False: 0.85}
        })
        
        d2 = Node({
            (True, ): {True: 0.84, False: 0.16}, 
            (False, ): {True: 0.22, False: 0.78}
        })
        
        d3 = Node({
            (True, True): {True: 0.92, False: 0.08},
            (True, False): {True: 0.16, False: 0.84},
            (False, True): {True: 0.13, False: 0.87},
            (False, False): {True: 0.23, False: 0.77}
        }, parents=[d1])
        
        for p in product((True, False), repeat=3):
            prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
            print(p, prob)
        

        Yukarıdaki Python kodunun çıktısı:

        (True, True, True) 0.9818320416719603
        (True, True, False) 0.4125230202578269
        (True, False, True) 0.743810005053057
        (True, False, False) 0.036353308719113894
        (False, True, True) 0.0943356496104443
        (False, True, False) 0.14040952778938573
        (False, False, True) 0.005564854466013087
        (False, False, False) 0.008699198042680443
        

        Olasılıklar:

        • P(R|D_1^+,D_2^+,D_3^+) = \% 98.18

        • P(R|D_1^+,D_2^+,D_3^-) = \% 41.25

        • P(R|D_1^+,D_2^-,D_3^+) = \% 74.38

        • P(R|D_1^+,D_2^-,D_3^-) = \% 3.64

        • P(R|D_1^-,D_2^+,D_3^+) = \% 9.43

        • P(R|D_1^-,D_2^+,D_3^-) = \% 14.04

        • P(R|D_1^-,D_2^-,D_3^+) = \% 0.56

        • P(R|D_1^-,D_2^-,D_3^-) = \% 0.87

      • D_3, D_2'ye bağımlı ise

        Grafiksel gösterim:

        R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_2 \to D_3
        1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^+|R,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^+|H,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^-|R,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^-|H,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^+|R,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^+|H,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^-|R,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^-|H,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^+|R,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^+|H,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^-|R,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^-|H,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^+|R,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^+|H,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^-|R,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^-|H,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

        Python ile yazalım:

        p_prior = {True: 0.25, False: 0.75}
        
        d1 = Node({
            (True, ): {True: 0.9, False: 0.1}, 
            (False, ): {True: 0.15, False: 0.85}
        })
        
        d2 = Node({
            (True, ): {True: 0.84, False: 0.16}, 
            (False, ): {True: 0.22, False: 0.78}
        })
        
        d3 = Node({
            (True, True): {True: 0.94, False: 0.06},
            (True, False): {True: 0.14, False: 0.86},
            (False, True): {True: 0.24, False: 0.76},
            (False, False): {True: 0.18, False: 0.82}
        }, parents=[d2])
        
        for p in product((True, False), repeat=3):
            prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
            print(p, prob)
        

        Yukarıdaki Python kodunun çıktısı:

        (True, True, True) 0.9676470588235294
        (True, True, False) 0.3761194029850747
        (True, False, True) 0.2419006479481642
        (True, False, False) 0.3008307826847399
        (False, True, True) 0.36966292134831463
        (False, True, False) 0.011682892906815023
        (False, False, True) 0.006217731638261257
        (False, False, False) 0.00836606393715724
        

        Olasılıklar:

        • P(R|D_1^+,D_2^+,D_3^+) = \% 96.76

        • P(R|D_1^+,D_2^+,D_3^-) = \% 37.61

        • P(R|D_1^+,D_2^-,D_3^+) = \% 24.19

        • P(R|D_1^+,D_2^-,D_3^-) = \% 30.08

        • P(R|D_1^-,D_2^+,D_3^+) = \% 36.97

        • P(R|D_1^-,D_2^+,D_3^-) = \% 1.17

        • P(R|D_1^-,D_2^-,D_3^+) = \% 0.62

        • P(R|D_1^-,D_2^-,D_3^-) = \% 0.84

      • D_3, hem D_1'e hem D_2'ye bağımlı ise

        Grafiksel gösterim:

        R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_1 \to D_3 ,\, D_2 \to D_3
        1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^+|R,D_1^+,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^+|H,D_1^+,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R) P(D_3^-|R,D_1^+,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H) P(D_3^-|H,D_1^+,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^+|R,D_1^+,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^+|H,D_1^+,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R) P(D_3^-|R,D_1^+,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H) P(D_3^-|H,D_1^+,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^+|R,D_1^-,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^+|H,D_1^-,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R) P(D_3^-|R,D_1^-,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H) P(D_3^-|H,D_1^-,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^+|R,D_1^-,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^+|H,D_1^-,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
        8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

          \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R) P(D_3^-|R,D_1^-,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H) P(D_3^-|H,D_1^-,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

        Python ile yazalım:

        p_prior = {True: 0.25, False: 0.75}
        
        d1 = Node({
            (True, ): {True: 0.9, False: 0.1}, 
            (False, ): {True: 0.15, False: 0.85}
        })
        
        d2 = Node({
            (True, ): {True: 0.84, False: 0.16}, 
            (False, ): {True: 0.22, False: 0.78}
        })
        
        d3 = Node({
            (True, True, True): {True: 0.98, False: 0.02},
            (True, True, False): {True: 0.67, False: 0.33},
            (True, False, True): {True: 0.53, False: 0.47},
            (True, False, False): {True: 0.49, False: 0.51},
            (False, True, True): {True: 0.65, False: 0.35},
            (False, True, False): {True: 0.54, False: 0.46},
            (False, False, True): {True: 0.41, False: 0.59},
            (False, False, False): {True: 0.03, False: 0.97}
        }, parents=[d1, d2])
        
        for p in product((True, False), repeat=3):
            prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
            print(p, prob)
        

        Yukarıdaki Python kodunun çıktısı:

        (True, True, True) 0.9200849446741924
        (True, True, False) 0.3037974683544304
        (True, False, True) 0.3373190685966016
        (True, False, False) 0.227390180878553
        (False, True, True) 0.16216806906349038
        (False, True, False) 0.10656733338731883
        (False, False, True) 0.11613094356391647
        (False, False, False) 0.00421163464069492
        

        Olasılıklar:

        • P(R|D_1^+,D_2^+,D_3^+) = \% 92.01

        • P(R|D_1^+,D_2^+,D_3^-) = \% 30.38

        • P(R|D_1^+,D_2^-,D_3^+) = \% 33.73

        • P(R|D_1^+,D_2^-,D_3^-) = \% 22.74

        • P(R|D_1^-,D_2^+,D_3^+) = \% 16.22

        • P(R|D_1^-,D_2^+,D_3^-) = \% 10.66

        • P(R|D_1^-,D_2^-,D_3^+) = \% 11.61

        • P(R|D_1^-,D_2^-,D_3^-) = \% 0.42

  • D_2, D_1'e bağımlı ise

    • D_3, D_1 ve D_2'den bağımsız ise

      Grafiksel gösterim:

      R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_1 \to D_2
      1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^+|H) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^-|H) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^+|H) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^-|H) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^+|H) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^-|H) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^+|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^+|H) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^-|R) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^-|H) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

      Python ile yazalım:

      p_prior = {True: 0.25, False: 0.75}
      
      d1 = Node({
          (True, ): {True: 0.9, False: 0.1}, 
          (False, ): {True: 0.15, False: 0.85}
      })
      
      d2 = Node({
          (True, True): {True: 0.95, False: 0.05},
          (True, False): {True: 0.56, False: 0.44},
          (False, True): {True: 0.35, False: 0.65},
          (False, False): {True: 0.45, False: 0.55}
      }, parents=[d1])
      
      d3 = Node({
          (True, ): {True: 0.95, False: 0.05}, 
          (False, ): {True: 0.07, False: 0.93}
      })
      
      for p in product((True, False), repeat=3):
          prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
          print(p, prob)
      

      Yukarıdaki Python kodunun çıktısı:

      (True, True, True) 0.9866083629406942
      (True, True, False) 0.2259215219976219
      (True, False, True) 0.6761565836298933
      (True, False, False) 0.008203445447087778
      (False, True, True) 0.39842726081258195
      (False, True, False) 0.0026168835720460763
      (False, False, True) 0.29862475442043224
      (False, False, False) 0.0016838560303094085
      

      Olasılıklar:

      • P(R|D_1^+,D_2^+,D_3^+) = \% 98.66

      • P(R|D_1^+,D_2^+,D_3^-) = \% 22.59

      • P(R|D_1^+,D_2^-,D_3^+) = \% 67.62

      • P(R|D_1^+,D_2^-,D_3^-) = \% 0.82

      • P(R|D_1^-,D_2^+,D_3^+) = \% 39.84

      • P(R|D_1^-,D_2^+,D_3^-) = \% 0.26

      • P(R|D_1^-,D_2^-,D_3^+) = \% 29.86

      • P(R|D_1^-,D_2^-,D_3^-) = \% 0.17

    • D_3, sadece D_1'e bağımlı ise

      Grafiksel gösterim:

      R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_1 \to D_2 ,\, D_1 \to D_3
      1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^+|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^+|H,D_1^+) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^-|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^-|H,D_1^+) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^+|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^+|H,D_1^+) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^-|R,D_1^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^-|H,D_1^+) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^+|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^+|H,D_1^-) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^-|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^-|H,D_1^-) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^+|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^+|H,D_1^-) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^-|R,D_1^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^-|H,D_1^-) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

      Python ile yazalım:

      p_prior = {True: 0.25, False: 0.75}
      
      d1 = Node({
          (True, ): {True: 0.9, False: 0.1}, 
          (False, ): {True: 0.15, False: 0.85}
      })
      
      d2 = Node({
          (True, True): {True: 0.95, False: 0.05},
          (True, False): {True: 0.56, False: 0.44},
          (False, True): {True: 0.35, False: 0.65},
          (False, False): {True: 0.45, False: 0.55}
      }, parents=[d1])
      
      d3 = Node({
          (True, True): {True: 0.92, False: 0.08},
          (True, False): {True: 0.16, False: 0.84},
          (False, True): {True: 0.13, False: 0.87},
          (False, False): {True: 0.23, False: 0.77}
      }, parents=[d1])
      
      for p in product((True, False), repeat=3):
          prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
          print(p, prob)
      

      Yukarıdaki Python kodunun çıktısı:

      (True, True, True) 0.9746306105380541
      (True, True, False) 0.3329682365826945
      (True, False, True) 0.5212464589235128
      (True, False, False) 0.013949433304272014
      (False, True, True) 0.032834344137640394
      (False, True, False) 0.05054721877468127
      (False, False, True) 0.02135825129317537
      (False, False, False) 0.03309203722854188
      

      Olasılıklar:

      • P(R|D_1^+,D_2^+,D_3^+) = \% 97.46

      • P(R|D_1^+,D_2^+,D_3^-) = \% 33.3

      • P(R|D_1^+,D_2^-,D_3^+) = \% 52.12

      • P(R|D_1^+,D_2^-,D_3^-) = \% 1.39

      • P(R|D_1^-,D_2^+,D_3^+) = \% 3.28

      • P(R|D_1^-,D_2^+,D_3^-) = \% 5.05

      • P(R|D_1^-,D_2^-,D_3^+) = \% 2.14

      • P(R|D_1^-,D_2^-,D_3^-) = \% 3.31

    • D_3, sadece D_2'ye bağımlı ise

      Grafiksel gösterim:

      R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_1 \to D_2 ,\, D_2 \to D_3
      1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^+|R,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^+|H,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^-|R,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^-|H,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^+|R,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^+|H,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^-|R,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^-|H,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^+|R,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^+|H,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^-|R,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^-|H,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^+|R,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^+|H,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^-|R,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^-|H,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

      Python ile yazalım:

      p_prior = {True: 0.25, False: 0.75}
      
      d1 = Node({
          (True, ): {True: 0.9, False: 0.1}, 
          (False, ): {True: 0.15, False: 0.85}
      })
      
      d2 = Node({
          (True, True): {True: 0.95, False: 0.05},
          (True, False): {True: 0.56, False: 0.44},
          (False, True): {True: 0.35, False: 0.65},
          (False, False): {True: 0.45, False: 0.55}
      }, parents=[d1])
      
      d3 = Node({
          (True, True): {True: 0.94, False: 0.06},
          (True, False): {True: 0.14, False: 0.86},
          (False, True): {True: 0.24, False: 0.76},
          (False, False): {True: 0.18, False: 0.82}
      }, parents=[d2])
      
      for p in product((True, False), repeat=3):
          prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
          print(p, prob)
      

      Yukarıdaki Python kodunun çıktısı:

      (True, True, True) 0.9550802139037434
      (True, True, False) 0.3
      (True, False, True) 0.10687022900763361
      (True, False, False) 0.13893376413570277
      (False, True, True) 0.1604682355810267
      (False, True, False) 0.003837982317867179
      (False, False, True) 0.02381965121225011
      (False, False, False) 0.03185480137049727
      

      Olasılıklar:

      • P(R|D_1^+,D_2^+,D_3^+) = \% 95.51

      • P(R|D_1^+,D_2^+,D_3^-) = \% 30

      • P(R|D_1^+,D_2^-,D_3^+) = \% 10.69

      • P(R|D_1^+,D_2^-,D_3^-) = \% 13.89

      • P(R|D_1^-,D_2^+,D_3^+) = \% 16.05

      • P(R|D_1^-,D_2^+,D_3^-) = \% 0.38

      • P(R|D_1^-,D_2^-,D_3^+) = \% 2.38

      • P(R|D_1^-,D_2^-,D_3^-) = \% 3.19

    • D_3, hem D_1'e hem D_2'ye bağımlı ise

      Grafiksel gösterim:

      R \to D_1 ,\, R \to D_2 ,\, R \to D_3 ,\, D_1 \to D_2 ,\, D_1 \to D_3 ,\, D_2 \to D_3
      1. P(R|D_1^+,D_2^+,D_3^+) : Her üç araç da pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^+|R,D_1^+,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^+|H,D_1^+,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      2. P(R|D_1^+,D_2^+,D_3^-) : Üçüncü araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^+|R,D_1^+) P(D_3^-|R,D_1^+,D_2^+) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^+|H,D_1^+) P(D_3^-|H,D_1^+,D_2^+) \\ P(R|D_1^+,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      3. P(R|D_1^+,D_2^-,D_3^+) : İkinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^+|R,D_1^+,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^+|H,D_1^+,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      4. P(R|D_1^+,D_2^-,D_3^-) : Birinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^+|R) P(D_2^-|R,D_1^+) P(D_3^-|R,D_1^+,D_2^-) \\ p\_false =& P(H) P(D_1^+|H) P(D_2^-|H,D_1^+) P(D_3^-|H,D_1^+,D_2^-) \\ P(R|D_1^+,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      5. P(R|D_1^-,D_2^+,D_3^+) : Birinci araç negatif diğerleri pozitif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^+|R,D_1^-,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^+|H,D_1^-,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      6. P(R|D_1^-,D_2^+,D_3^-) : İkinci araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^+|R,D_1^-) P(D_3^-|R,D_1^-,D_2^+) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^+|H,D_1^-) P(D_3^-|H,D_1^-,D_2^+) \\ P(R|D_1^-,D_2^+,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      7. P(R|D_1^-,D_2^-,D_3^+) : Üçüncü araç pozitif diğerleri negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^+|R,D_1^-,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^+|H,D_1^-,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^+) =& \frac{p\_true}{p\_true + p\_false} \end{align}
      8. P(R|D_1^-,D_2^-,D_3^-) : Her üç araç da negatif sonuç üretirse.

        \begin{align} p\_true =& P(R) P(D_1^-|R) P(D_2^-|R,D_1^-) P(D_3^-|R,D_1^-,D_2^-) \\ p\_false =& P(H) P(D_1^-|H) P(D_2^-|H,D_1^-) P(D_3^-|H,D_1^-,D_2^-) \\ P(R|D_1^-,D_2^-,D_3^-) =& \frac{p\_true}{p\_true + p\_false} \end{align}

      Python ile yazalım:

      p_prior = {True: 0.25, False: 0.75}
      
      d1 = Node({
          (True, ): {True: 0.9, False: 0.1}, 
          (False, ): {True: 0.15, False: 0.85}
      })
      
      d2 = Node({
          (True, True): {True: 0.95, False: 0.05},
          (True, False): {True: 0.56, False: 0.44},
          (False, True): {True: 0.35, False: 0.65},
          (False, False): {True: 0.45, False: 0.55}
      }, parents=[d1])
      
      d3 = Node({
          (True, True, True): {True: 0.98, False: 0.02},
          (True, True, False): {True: 0.67, False: 0.33},
          (True, False, True): {True: 0.53, False: 0.47},
          (True, False, False): {True: 0.49, False: 0.51},
          (False, True, True): {True: 0.65, False: 0.35},
          (False, True, False): {True: 0.54, False: 0.46},
          (False, False, True): {True: 0.41, False: 0.59},
          (False, False, False): {True: 0.03, False: 0.97}
      }, parents=[d1, d2])
      
      for p in product((True, False), repeat=3):
          prob = posterior_probability(p_prior, [d1, d2, d3], {d1.name: p[0], d2.name: p[1], d3.name: p[2]})
          print(p, prob)
      

      Yukarıdaki Python kodunun çıktısı:

      (True, True, True) 0.8911222780569514
      (True, True, False) 0.23676012461059195
      (True, False, True) 0.16028708133971295
      (True, False, False) 0.0993975903614458
      (False, True, True) 0.059341604102728165
      (False, True, False) 0.037421180217389764
      (False, False, True) 0.33880726015557483
      (False, False, False) 0.016227180527383367
      

      Olasılıklar:

      • P(R|D_1^+,D_2^+,D_3^+) = \% 89.11

      • P(R|D_1^+,D_2^+,D_3^-) = \% 23.68

      • P(R|D_1^+,D_2^-,D_3^+) = \% 16.03

      • P(R|D_1^+,D_2^-,D_3^-) = \% 9.94

      • P(R|D_1^-,D_2^+,D_3^+) = \% 5.93

      • P(R|D_1^-,D_2^+,D_3^-) = \% 3.74

      • P(R|D_1^-,D_2^-,D_3^+) = \% 33.88

      • P(R|D_1^-,D_2^-,D_3^-) = \% 1.62

Yukarıda, farklı sayıda araçları kullanarak, bu araçların bağımlılık ve bağımsızlık durumlarına göre bir metnin robot tarafından üretilme olasılıklarının nasıl değiştiğini gördük.

Araçların hepsinin pozitif sonuç verdiği senaryoları tekrar yazalım:

Araç sayısı Bağımlılık Durumu Olasılık Değer
1 Yok P(R|D_1^+) \% 66.67
2 Yok P(R|D_1^+,D_2^+) \% 88.42
2 D_1 \to D_2 P(R|D_1^+,D_2^+) \% 84.44
3 Yok P(R|D_1^+,D_2^+,D_3^+) \% 99.04
3 D_1 \to D_3 P(R|D_1^+,D_2^+,D_3^+) \% 98.18
3 D_2 \to D_3 P(R|D_1^+,D_2^+,D_3^+) \% 96.76
3 D_1 \to D_3 ve D_2 \to D_3 P(R|D_1^+,D_2^+,D_3^+) \% 92.01
3 D_1 \to D_2 P(R|D_1^+,D_2^+,D_3^+) \% 98.66
3 D_1 \to D_2 ve D_1 \to D_3 P(R|D_1^+,D_2^+,D_3^+) \% 97.46
3 D_1 \to D_2 ve D_2 \to D_3 P(R|D_1^+,D_2^+,D_3^+) \% 95.51
3 D_1 \to D_2 ve D_1 \to D_3 ve D_2 \to D_3 P(R|D_1^+,D_2^+,D_3^+) \% 89.11

Bu durumda, elimizdeki değerlere göre D_1, D_2 ve D_3 arasında bağımlılık olmadığı durumda her üç testten pozitif sonuç aldığımız bir metnin robot olma ihtimali daha fazladır.

Tek bir araç yerine çok sayıda aracı birikte kullanmanın metnin bir robot tarafından üretilme olasılığını artırdığını söyleyebiliriz.

Çok sayıda araç kullandığımız senaryolarda, araçların bağımsız olmasının metnin bir robot tarafından üretilme olasılığını artırdığını söyleyebiliriz. Çünkü araçların birbirine bağımlı olduğu durumda, bağımlı olan araç, bağlı olduğu aracın gözlemini kullanmaya ve hataları tekrar etmeye eğilimlidir. Bu yüzden bağımlı aracın bilgi katkısı azalır.

Peki araçların hepsinin negatif sonuç verdiği senaryoları tekrar yazalım:

Araç sayısı Bağımlılık Durumu Olasılık Değer
1 Yok P(R|D_1^-) \% 3.77
2 Yok P(R|D_1^-,D_2^-) \% 0.08
2 D_1 \to D_2 P(R|D_1^-,D_2^-) \% 3.04
3 Yok P(R|D_1^-,D_2^-,D_3^-) \% 0.04
3 D_1 \to D_3 P(R|D_1^-,D_2^-,D_3^-) \% 0.87
3 D_2 \to D_3 P(R|D_1^-,D_2^-,D_3^-) \% 0.84
3 D_1 \to D_3 ve D_2 \to D_3 P(R|D_1^-,D_2^-,D_3^-) \% 0.42
3 D_1 \to D_2 P(R|D_1^-,D_2^-,D_3^-) \% 0.17
3 D_1 \to D_2 ve D_1 \to D_3 P(R|D_1^-,D_2^-,D_3^-) \% 3.31
3 D_1 \to D_2 ve D_2 \to D_3 P(R|D_1^-,D_2^-,D_3^-) \% 3.19
3 D_1 \to D_2 ve D_1 \to D_3 ve D_2 \to D_3 P(R|D_1^-,D_2^-,D_3^-) \% 1.62

Burada ise, araçların negatif sonuç vermesi durumunda, tek bir araç kullandığımız senaryoda en yüksek değeri elde etmişiz.

Araçların birbirine bağımlı olduğu senaryolarda bir metnin bir robot tarafından yazılma olasılığı, araçların bağımsız olduğu senaryolara göre artış göstermiş. Çünkü bağlı olunan araç negatif sonuç verdiğinde, bağlı olan aracın insan tarafından yazılan metinler için yanlış pozitif üretmesi, negatif gözlemin ayırt ediciliğini azaltır.

O halde genel bir değerlendirme yapmamız gerekirse; bir metnin robot tarafından üretilme olasılığı hakkında bilgi edinmek için çeşitli senaryolar oluşturabiliriz. Araç sayısını artırmak, araçlar tarafından pozitif olarak işaretlenmiş bir metnin robot tarafından üretilme ihtimalini genellikle artırır. Öte yandan araçlar arasında bağımlılık ilişkileri varsa; bağlı olan araçlar, bağlandıkları araçlardan elde ettikleri bilgilere uymaya eğilimlidirler, modele bağımsız durumlara göre daha az bilgi katkısında bulunurlar.