2016-01-07 2 views
0

Я пытаюсь вычислить вероятность исхода с иерархической структурой дерева enter image description hereВычислить Условная вероятность Python

Верх компьютер Компьютер А, следующий 2 являются Компьютер B & C и последний 4 являются компьютерными BD, BE и CD, CE. Я пытаюсь найти вероятность , что если компьютер A заражен вирусом, то есть вероятность того, что B или C заразится вирусом. А если B или C получает заражена, что вероятность того, что BD, BE, CD, CE заражается с вирусом

Я хочу пробежать 100 испытаний, чтобы найти ответ. Я новичок в выполнении вероятности на python. Однако здесь есть код, который я до сих пор:

import random, time 

#prob that computers will get virus 
CompA = 0.50 
CompB = .25 
CompC = .25 
CompBD = .125 
CompBE= .125 
CompCD= .125 
CompCE= .125 



def generate(): 
    x = random.random() 
    if x =< CompA: #Computer A has virus 
     prob_compa= sum(generate() for i in range(100)) #prob that Comp A has virus in a 100 rounds 
     print (prob_compa/100 + 'percent chance of getting virus') 

     try: 
      if CompB<.125: 
       prob_compa sum(generate() for i in range(100)) #prob that Comp B has virus in a 100 rounds 
       print (prob_compa/100 + 'percent chance of getting virus') 
       elif CompB<.125: 
       prob_compa= sum(generate() for i in range(100)) #prob that Comp C is sick in a 100 rounds 
     print (prob_compa/100 + 'percent chance of getting virus') 

     #I continue this method for the rest of the tree 

Есть ли лучший способ и простой способ для меня, чтобы получить результаты? random.uniform ???

+2

Я думаю, что вы не должны выполнить моделирование. Не можете ли вы получить это, используя * Марковское одеяло *? Это ведь хороший граф вероятности *. –

+0

Хм никогда не слышал об этом .. будет ли эта функция более простой способ рассчитать мой желаемый результат? – royalblue

+1

«Если A заражен, то какая вероятность заражения B» - на самом деле это простая простая [условная вероятность] (https://en.wikipedia.org/wiki/Conditional_probability), нет необходимости в более продвинутых инструментах –

ответ

0

Насколько я понял это то, что вы пытаетесь достичь:

#python_test2.py 
import random, time 

virus_probabilities= { "CompA" : 0.50, "CompB" : .25, "CompC" : .25, "CompBD" : .125, 
        "CompBE" : .125, "CompCD" : .125, "CompCE" : .125} 

def check_probability(computer_name, n_repetitions = 100): 
    prob_comp, repetitions = 0, 0 
    p_computer = virus_probabilities[computer_name] 
    while repetitions < n_repetitions: 
    x = random.random() 
    if x <= p_computer: 
      prob_comp += 1 
    repetitions += 1 
    print ("{0} % changes of getting virus on {1}".format(round(prob_comp/100.0, 2), computer_name)) 

for key in virus_probabilities: 
    check_probability(key, 1000) 

Когда я запускаю файл из консоли, я получаю:

[email protected]:~/Desktop $ python test_2.py 
2.49 % changes of getting virus on CompB 
2.6 % changes of getting virus on CompC 
5.07 % changes of getting virus on CompA 
1.38 % changes of getting virus on CompBE 
1.16 % changes of getting virus on CompBD 
1.18 % changes of getting virus on CompCD 
1.36 % changes of getting virus on CompCE 
0

Brilliant код из mabe02, возможно, стоит добавить незначительное улучшение к основной функции, избегая путаницы/будущих ошибок:

def check_probability(computer_name, n_repetitions): 
    prob_comp, repetitions = 0, 0 
    p_computer = virus_probabilities[computer_name] 
    while repetitions < n_repetitions: 
    x = random.random() 
    if x <= p_computer: 
      prob_comp += 1 
    repetitions += 1 
    print ("{0} % changes of getting virus on {1}".format(round(prob_comp/n_repetitions, 2), computer_name)) 

Это может привести к союзники приближают вероятности ближе к стартовой, которая ожидается, когда n_repetitions станет больше.

Хотя для более специфических по условной вероятности вы обязательно должны взглянуть на этот пост: A simple explanation of Naive Bayes Classification