代码之家  ›  专栏  ›  技术社区  ›  scleronomic

无循环迭代二项式更新

  •  0
  • scleronomic  · 技术社区  · 5 年前

    这可以不用循环吗?

    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:]
    

    我在一年前遇到过这种情况 another question Binomial options pricing model 但老实说,我不太明白这个话题。我只是对公式和迭代更新/收缩 x

    让我觉得可能有用的是这个梵蒂冈

    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
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   scleronomic    5 年前

    您正在计算:

    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 choose函数。


    使用 @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的期望值。

    推荐文章