Exemplo n.º 1
0
    omega = np.diag(((z @ alpha_rw[:, i - 1] + 1)**2).ravel())
    inv_omega = inv(omega)
    b_omega = inv(x.T @ inv_omega @ x) @ x.T @ inv_omega @ y
    v_1 = inv(inv(v_0) + h[0][i - 1] * x.T @ inv_omega @ x)
    beta_1 = v_1 @ (inv(v_0) @ beta_0 +
                    h[0][i - 1] * x.T @ inv_omega @ x @ b_omega)
    try:
        beta[:, [i]] = beta_1 + norm_rnd(v_1)
    except:
        beta[:, [i]] = beta_1 + norm_rnd(v_1 + 0.000000001)
        error_check += 1

    h_1 = (1 / nu_1 * \
            ((y - x @ beta[:, [i]]).T @ inv_omega @ (y - x @ beta[:, [i]]) + nu_0 * h_0 ** (- 1)) \
        ) ** (- 1)
    h[:, [i]] = gamm_rnd_koop2(h_1, nu_1)

    a_can_rw = alpha_rw[:, [i - 1]] + norm_rnd(vscale_rw)
    log_accept_rw = min(
        a_post(a_can_rw, beta[:, [i]], h[0][i], y, x, z) -
        a_post(alpha_rw[:, [i - 1]], beta[:, [i]], h[0][i], y, x, z), 0)

    if log_accept_rw > math.log(np.random.uniform()):
        alpha_rw[:, [i]] = a_can_rw
        count_rw += 1
    else:
        alpha_rw[:, [i]] = alpha_rw[:, [i - 1]]

    progress_bar(i, s)

# ===== 4. Vyhozeni prvnich s_0 vzorku =====
Exemplo n.º 2
0
    [-0.0343, 0.0449, -0.0021, 0.0037],
    [-0.0284, -0.0021, 0.0341, -0.0015],
    [-0.0024, 0.0037, -0.0015, 0.2144],
])
count = 0  # Pocitadlo akceptovasnych vzorku
nu_1 = nu_0 + n  # 5.23
log_A = h = np.array([0.0] * s)
# ===== 4. Metropolis within Gibbs =====
print("Metropolis within Gibbs ...")
for i in range(1, s):
    # a) podminena hustota p(h|gamma,y) ~ G(h_1,nu_1)
    f_x = gamma[0][i-1] * \
        ( gamma[1][i-1] * x[:,[1]]**gamma[3][i-1] + gamma[2][i-1] * x[:,[2]]**gamma[3][i-1] ) ** \
        ( 1 / gamma[3][i-1] )
    h_1 = (1 / nu_1 * ((y - f_x).T @ (y - f_x) + nu_0 / h_0))**(-1)
    h[i] = gamm_rnd_koop2(h_1, nu_1)
    # b) podminena hustota p(gamma|h,y) -> logaritmus jadrove podminene hustoty = externi funkce log_post_ces.py
    # Generovani kandidatu z kandidatske hustoty
    gamma_ast = gamma[:, [i - 1]] + norm_rnd(sigma)
    log_accept = min(
        log_post_ces(y, x, gamma_ast, h[i], gamma_0, v_0) - \
        log_post_ces(y, x, gamma[:,[i-1]], h[i], gamma_0, v_0),
        0
    )
    # Rozhodnuti o akceptaci
    if log_accept > log(uniform()):
        gamma[:, [i]] = gamma_ast
        count += 1
    else:
        gamma[:, [i]] = gamma[:, [i - 1]]
Exemplo n.º 3
0
    omega = np.diag((lam[:, [i - 1]]**(-1)).ravel())
    inv_omega = inv(omega)
    b_omega = inv(x.T @ inv_omega @ x) @ x.T @ inv_omega @ y
    v_1 = inv(inv(v_0) + h[0][i - 1] * x.T @ inv_omega @ x)
    beta_1 = v_1 @ (inv(v_0) @ beta_0 +
                    h[0][i - 1] * x.T @ inv_omega @ x @ b_omega)
    try:
        beta[:, [i]] = beta_1 + norm_rnd(v_1)
    except:
        beta[:, [i]] = beta_1 + norm_rnd(v_1 + 0.000000001)
        error_check += 1

    h_1 = (1 / nu_1 * \
            ((y - x @ beta[:, [i]]).T @ inv_omega @ (y - x @ beta[:, [i]]) + nu_0 * h_0 ** (- 1)) \
        ) ** (- 1)
    h[:, [i]] = gamm_rnd_koop2(h_1, nu_1)

    epsilon = y - x @ beta[:, [i]]
    nu_lam_1 = nu_lam_rw[:][i - 1] + 1
    for j in range(n):
        lam_1 = nu_lam_1 / (h[0][i] * epsilon[j][0]**2 + nu_lam_1 - 1)
        # pdb.set_trace()
        # Pouziva jiny typ funkce pro generovani cisel z gamma rozdeleni nez v Matlab scriptu
        lam[j, i] = gamm_rnd_koop2(lam_1, nu_lam_1)

    # R-W M-H pro nu_lambda
    nu_lam_can_rw = nu_lam_rw[0][i - 1] + norm_rnd(vscale_rw)
    pdb.set_trace()
    log_accept_rw = min(
        nu_lambda_post(nu_lam_can_rw, nu_lam_0, lam[:, [i]]) -
        nu_lambda_post(nu_lam_rw[0][i - 1], nu_lam_0, lam[:, [i]]), 0)