如何在python函数中迭代方程式,每次迭代都使用前面的结果
我试图在python中创建一个函数来计算贝叶斯概率,而不使用scipy,虽然我可以让函数打印一个结果,但我很难让它重复多次,在下一次计算中使用上一个结果 以下是我目前掌握的情况:如何在python函数中迭代方程式,每次迭代都使用前面的结果,python,function,for-loop,range,bayesian,Python,Function,For Loop,Range,Bayesian,我试图在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):
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”替换“先前的”
关于我缺少什么的指导?我不喜欢说“疯狂就是一遍又一遍地做同样的事情,期待不同的结果”,但即使不是疯狂,也是糟糕的编程。从for循环的一次迭代到另一次迭代没有任何变化,那么为什么期望不同的输出呢 在下一次计算中使用上一个结果 您认为您在哪里告诉Python您在下一次计算中使用的是上一个结果 如果您希望将迭代的输出作为下一次的输入,那么您需要将输出分配给某个对象。例如(不保证这是您想要的正确代码,只是一个示例,其中一个迭代的输出被用作下一个迭代的输入):
您还可以查看是否存在第n次迭代贝叶斯更新的封闭式公式。好吧,您想要的是
概率的前一个值
成为概率的下一个值
,因此最简单的事情就是完全去掉该变量,只需始终使用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
与右侧的不同,这就是为什么它可以工作的原因。带有=
的表达式的右侧是对计算机的指令,用于生成新值,然后分配给左侧
实际上,它可以进一步简化——第二行中的长方程与loo中的方程基本相同——只是前者被后者所取代。因此,您可以改为:
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)
这使用了一个叫做“不要重复你自己”或“干燥”的原则——这样主公式只出现一次
但还要注意,函数不会返回任何内容。您可能希望在创建值时将其存储在列表中,并返回:
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))
我确实同意这些答案,但我不确定基于可能的先前“先验”不断获得新概率的“变量”因素是什么 这有点模棱两可,但假设你的“假阳性率”和“真阳性率”是一致的,变量变化是“优先的”,你可以这样做,顺便说一句,我认为其他答案做得很好,可能还有很多其他方法可以做到这一点:
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)
您在for循环中声明了一个变量i,但从未在主体中使用它。在迭代过程中,其他变量实际上都没有修改,因此输出保持不变
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)