无循环的迭代二项式更新
Iterative Binomial Update without Loop
这可以不用循环完成吗?
import numpy as np
n = 10
x = np.random.random(n+1)
a, b = 0.45, 0.55
for i in range(n):
x = a*x[:-1] + b*x[1:]
我在 . There it was a covered by a little obscure nomenclature. I guess it is related to Binomial options pricing model 中遇到过这个设置,但老实说,我不太理解这个主题。我只是对公式和 x
的这种迭代更新/收缩很感兴趣,想知道它是否可以在没有循环的情况下完成。但我不能全神贯注,我不确定这是否可能。
让我觉得它可能有用的是这个 vatiaton
n = 10
a, b = 0.301201, 0.59692
x0 = 123
x = x0
for i in range(n):
x = a*x + b*x
# ~42
其实就是x0*(a + b)**n
print(np.allclose(x, x0*(a + b)**n))
# True
您正在计算:
sum( a ** (n - i) * b ** i * x[i] * choose(n, i) for 0 <= i <= n)
[那是伪代码,而不是 Python。]我不确定将其转换为 Numpy 的最佳方法。
choose(n, i)
是 n!/ (i! (n-i)!)
,不是 numpy 选择函数。
利用@mathfux
的评论,可以做到
import numpy as np
from scipy.stats import binom
binomial = binom(p=p, n=n)
pmf = binomial(np.arange(n+1))
res = np.sum(x * pmf)
所以
res = x.copy()
for i in range(n):
res = p*res[1:] + (p-1)*res[:-1]
只是二项分布随机变量x的期望值。
这可以不用循环完成吗?
import numpy as np
n = 10
x = np.random.random(n+1)
a, b = 0.45, 0.55
for i in range(n):
x = a*x[:-1] + b*x[1:]
我在 x
的这种迭代更新/收缩很感兴趣,想知道它是否可以在没有循环的情况下完成。但我不能全神贯注,我不确定这是否可能。
让我觉得它可能有用的是这个 vatiaton
n = 10
a, b = 0.301201, 0.59692
x0 = 123
x = x0
for i in range(n):
x = a*x + b*x
# ~42
其实就是x0*(a + b)**n
print(np.allclose(x, x0*(a + b)**n))
# True
您正在计算:
sum( a ** (n - i) * b ** i * x[i] * choose(n, i) for 0 <= i <= n)
[那是伪代码,而不是 Python。]我不确定将其转换为 Numpy 的最佳方法。
choose(n, i)
是 n!/ (i! (n-i)!)
,不是 numpy 选择函数。
利用@mathfux
的评论,可以做到
import numpy as np
from scipy.stats import binom
binomial = binom(p=p, n=n)
pmf = binomial(np.arange(n+1))
res = np.sum(x * pmf)
所以
res = x.copy()
for i in range(n):
res = p*res[1:] + (p-1)*res[:-1]
只是二项分布随机变量x的期望值。