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



我正试图在不使用scipy的情况下在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):
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"取代。。。

我缺少什么指导?

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

我不喜欢"疯狂就是一遍又一遍地做同样的事情,期待不同的结果"这句话,但即使这不是疯狂,也是糟糕的编程。从for循环的一次迭代到另一次迭代,没有任何变化,那么为什么期望不同的输出呢?

在下一次计算中使用上一个结果。

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

我确实同意这些答案,但我不确定这里的"变量"因素是什么,可以根据以前可能的"先验"不断获得新的概率。

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

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)

最新更新