如何在 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)
我正在尝试创建一个函数来计算 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)