Beispiel #1
0
def hmc_propose(chains, adapted_approximation, adapted_scale, maxGradient):
    e = 0.25
    start_vectors = chains.vectors
    startp = chains.logps

    p = random.multivariate_normal(
        mean=zeros(chains.dimensions), cov=adapted_approximation.inv_orientation, size=chains._nChains
    )
    start_p = p

    p = p - (e / 2) * (-chains.logp_grads)

    T = 3
    for i in range(T):
        chains.propose(chains.vectors + e * vectorsMult(adapted_approximation.orientation, p))
        if i != T - 1:
            p = p - e * (-chains.logp_grads)

    p = p - (e / 2) * (-chains.logp_grads)

    p = -p
    end_vectors = chains.vectors
    chains.propose(start_vectors)
    chains.propose(end_vectors)
    chains.vectors - start_vectors
    # ( (-startp) - (-chains.logps)  +  sum(start_p**2, axis =1)/2 - sum(p**2, axis =1)/2)
    # ( (-startp) - (-chains.logps) + kenergy(start_p, adapted_approximation.orientation) - kenergy(p, adapted_approximation.orientation))
    # return sum(p**2, axis =1)/2,sum(start_p**2, axis =1) /2
    return kenergy(p, adapted_approximation.orientation), kenergy(start_p, adapted_approximation.orientation)
Beispiel #2
0
def hmc_propose(chains, adapted_approximation, adapted_scale, maxGradient):
    e = .25
    start_vectors = chains.vectors
    startp = chains.logps

    p = random.multivariate_normal(mean=zeros(chains.dimensions),
                                   cov=adapted_approximation.inv_orientation,
                                   size=chains._nChains)
    start_p = p

    p = p - (e / 2) * (-chains.logp_grads)

    T = 3
    for i in range(T):
        chains.propose(chains.vectors +
                       e * vectorsMult(adapted_approximation.orientation, p))
        if i != T - 1:
            p = p - e * (-chains.logp_grads)

    p = p - (e / 2) * (-chains.logp_grads)

    p = -p
    end_vectors = chains.vectors
    chains.propose(start_vectors)
    chains.propose(end_vectors)
    chains.vectors - start_vectors
    #( (-startp) - (-chains.logps)  +  sum(start_p**2, axis =1)/2 - sum(p**2, axis =1)/2)
    #( (-startp) - (-chains.logps) + kenergy(start_p, adapted_approximation.orientation) - kenergy(p, adapted_approximation.orientation))
    #return sum(p**2, axis =1)/2,sum(start_p**2, axis =1) /2
    return kenergy(p, adapted_approximation.orientation), kenergy(
        start_p, adapted_approximation.orientation)
Beispiel #3
0
 def drift(x, gradient):
     return vectorsMult(scaledOrientation, truncate_gradient(x, gradient,adapted_approximation, maxGradient) /2)