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

ValueError:概率总和不等于1

  •  0
  • Hamid  · 技术社区  · 3 年前

    不明白为什么我得到以下值错误概率总和不为1。这是由于我的共同分配吗?一个愚蠢的错误?非常感谢任何帮助。

    import numpy as np
    import matplotlib.pyplot as plt
    
    p = np.array([[10/66, 15/66, 3/66], [20/66, 12/66, 0], [6/66, 0, 0]])
    
    # Initialize starting values for X and Y
    x = 0
    y = 0
    
    # Create arrays to store trace plots
    trace_x = []
    trace_y = []
    
    # Run 10,000 iterations of Gibbs sampling
    for i in range(10000):
        # Sample a new value for X given the current value of Y
        x = np.random.choice([0, 1, 2], p=p[y])
        # Sample a new value for Y given the current value of X
        y = np.random.choice([0, 1, 2], p=p[:, x])
        # Append the new values to the trace plots
        trace_x.append(x)
        trace_y.append(y)
    
    # Plot the trace plots
    plt.plot(trace_x)
    plt.title('Trace plot for X')
    plt.xlabel('Iteration')
    plt.ylabel('Value')
    plt.show()
    
    plt.plot(trace_y)
    plt.title('Trace plot for Y')
    plt.xlabel('Iteration')
    plt.ylabel('Value')
    plt.show()
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   jodag    3 年前

    您提供的是P(X,Y=Y),而不是P(X|Y=Y)。缺少缩放项,因为P(X|Y=Y)=P(X,Y=Y)/P(Y=Y)。换句话说,联合分布的行和列不应该相加。您需要自己对它们进行规范化以获得条件分布。

    # Sample a new value for X given the current value of Y
    py = np.sum(p[y])
    x = np.random.choice([0, 1, 2], p=p[y] / py)
    # Sample a new value for Y given the current value of X
    px = np.sum(p[:, x])
    y = np.random.choice([0, 1, 2], p=p[:, x] / px)