Как выполнить итерацию уравнения в функции python, используя предыдущий результат для каждой итерации - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать функцию для вычисления байесовских вероятностей в python без использования scipy, и хотя я могу заставить функцию печатать один результат, у меня возникают проблемы с ее повторением несколько раз, используя предыдущий результат в следующем расчете.

Вот что у меня есть:

def prob_given_positive (prior, false_positive_rate, true_positive_rate):
  pdgp = (true_positive_rate * prior) / (false_positive_rate)
  for i in range(10):
    probability = (true_positive_rate * pdgp) / (false_positive_rate)
    print (probability)

prob_given_positive(.001,.08,1)

Это распечатка, которую я получаю

0.15625
0.15625
0.15625
0.15625
0.15625
0.15625
0.15625
0.15625
0.15625
0.15625

Что бы я хотел вместо этого есть 10 различных вероятностей, где «предыдущий» каждый раз заменяется «вероятностью» или «pdgp» предыдущего расчета ...

Руководство по тому, что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 19 марта 2020

Итак, вам нужно, чтобы предыдущее значение probability стало следующим значением probability, поэтому проще всего просто полностью избавиться от этой переменной и просто использовать pdgp, как в:

def prob_given_positive (prior, false_positive_rate, true_positive_rate):
  pdgp = (true_positive_rate * prior) / (false_positive_rate)
  for i in range(10):
    pdgp = (true_positive_rate * pdgp) / (false_positive_rate)
    print (pdgp)

prob_given_positive(.001,.08,1)

(Предполагается, что указанная вами формула действительно верна!)

Обратите внимание, что pdgp в левой части уравнения отличается с правой стороны - вот почему это работает. Правая часть выражения с = является инструкцией для компьютера для создания нового значения, которое оно затем присваивает левой стороне.

На самом деле, оно может немного упростим - длинное уравнение во второй строке в основном совпадает с уравнением внутри уборной - за исключением того, что предшествующее заменяется задним. Вместо этого вы можете сделать следующее:

def prob_given_positive (prior, false_positive_rate, true_positive_rate):
  pdgp = prior
  for i in range(10+1):
    pdgp = (true_positive_rate * pdgp) / (false_positive_rate)
    print (pdgp)

При этом используется принцип, который называется «не повторяйся» или «DRY» - таким образом основная формула появляется только один раз.

Но также обратите внимание, что ваша функция ничего не возвращает . Возможно, вы захотите сохранить значения в списке по мере их создания и вернуть это:

def prob_given_positive (prior, false_positive_rate, true_positive_rate):
  result = [] ## empty list
  pdgp = prior
  for i in range(10+1):
    pdgp = (true_positive_rate * pdgp) / (false_positive_rate)
    result.append(pdgp)
  return(result)

print(prob_given_positive(0.001, 0.08, 1))
0 голосов
/ 19 марта 2020

Я согласен с ответами, но я не уверен, что здесь есть «переменный» фактор для постоянного получения новых вероятностей, основанных на возможном предыдущем «априоре».

Это немного двусмысленно, но допустим, что ваши "false_positive_rate" и "true_positive_rate" согласованы, а изменение переменной - "предыдущее", вы могли бы сделать что-то вроде этого, кстати, я думаю, что другие ответы делают большую работу и вероятно, есть много других способов сделать это:

def prob_given(pdgp=None, false_positive_rate=None, true_positive_rate=None):
  getallprobs = []
  for newpdgp in pdgp:
    probability = (true_positive_rate * newpdgp) / (false_positive_rate)
    getallprobs.append(probability)

  return getallprobs

def usePrevPdgp(prior,false_positive_rate, true_positive_rate):
  storePdgps = []
  while True:
   for i in range(10):
     prior += prior
     pdgp = (true_positive_rate * prior) / (false_positive_rate)
     storePdgps.append(pdgp)

   latestpdgp = [i for i in storePdgps]
   return latestpdgp

if __name__ == "__main__":
   newPdgp = usePrevPdgp(.001,.08,1)
   getNewProb = prob_given(newPdgp, .08, 1)
   print(getNewProb)
0 голосов
/ 19 марта 2020

Я не фанат высказывания "Безумие делает одно и то же снова и снова и ожидает разных результатов", но даже если это не безумие, это плохое программирование. Ничего не меняется от одной итерации вашего for-l oop к другой, так почему вы ожидаете разные результаты?

, используя предыдущий результат в следующем вычислении.

Где, по вашему мнению, вы говорите Python вы используете предыдущий результат в следующем расчете?

Если вы хотите, чтобы выходные данные из итерации вводились для следующей, вам нужно иметь что-то, что назначает выходные данные чему-либо. Например (нет гарантий, что это правильный код для того, что вы хотите, просто пример вывода одной итерации, используемого в качестве ввода в следующей):

def prob_given_positive (prior, false_positive_rate, 
  true_positive_rate):
  pdgp = (true_positive_rate * prior) / (false_positive_rate)
  for i in range(10):
    posterior = (true_positive_rate * pdgp) / 
      (false_positive_rate)
    prior = posterior
    pdgp = (true_positive_rate * prior) / (false_positive_rate)
  print (probability)

Вы также можете посмотреть, есть ли формула закрытой формы для n-го повторного байесовского обновления.

...