如何在 python 函数中迭代方程,每次迭代使用先前的结果

How to iterate an equation in a python function, using the previous result for each iteration

我正在尝试创建一个函数来计算 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 个不同的概率,其中 'prior' 每次都被先前计算的 'probability' 或 'pdgp' ...

替换

关于我遗漏了什么的指导?

我不喜欢这句话 "Insanity is doing the same thing over and over again and expecting different results",但即使这不是疯狂,也是糟糕的编程。从 for 循环的一次迭代到另一次迭代没有任何变化,那么为什么您期望不同的输出?

using the previous result in the next calculation.

您认为您在哪里告诉 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 次迭代贝叶斯更新的闭式公式。

好吧,你想要的是 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)

这使用了一个叫做 "don't repeat yourself" 或 "DRY" 的原则——这样主公式只出现一次。

但还要注意,您的函数没有 return 任何内容。您可能希望在创建值时将它们存储在列表中,并且 return 那:

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

我确实同意答案,但我不确定 "variable" 因素是什么,可以根据我之前可能的 "prior" 不断获得新的概率。

有点模棱两可,但假设你的 "false_positive_rate" 和 "true_positive_rate" 是一致的,变量变化是 "prior",你可以这样做,顺便说一句,我认为其他答案做得很好,可能还有很多其他方法可以做到这一点:

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)