1

emcee ライブラリで emcee.EnsembleSampler 関数を実行して、行っている研究用のパラメータのマルコフ連鎖を作成しています。なんらかの理由で、run_mcmc 関数が実行されるときに、emcee.EnsembleSampler.chain オブジェクトで見つかったチェーンが、本質的にほぼガウスである必要があるときに、まったく変化しません。

一部のデータでこれを複数回実行しましたが、完全に正常に機能しますが、場合によっては、チェーンが反復されず、直線だけになる場合があります。

司会者コードの使用方法 (約 90% の時間で動作します):

sampler1 = emcee.EnsembleSampler(n_walkers, n_dim, self.__ln_prob, args = (event1, parameters_to_fit, parallaxType1), threads = 1)
sampler1.run_mcmc(start1, n_steps)
samples1 = sampler1.chain[:, n_burn:, :].reshape((-1, n_dim), order = 'F')

__ln_prob 関数は次のように記述されます (その中で使用される関数もここで詳しく説明されています)。

def __ln_prob(self, theta, event, parameters_to_fit, parallaxType):
    """ combines likelihood and priors """
    ln_prior_ = self.__ln_prior(theta, parameters_to_fit, parallaxType)
    if not np.isfinite(ln_prior_):
        return -np.inf, [-1, -1]
    ln_like_ = self.__ln_like(theta, event, parameters_to_fit)
    if np.isnan(ln_like_):
        return -np.inf, [-1, -1]
    if (parallaxType == 'positive') or (parallaxType == 'negative'):
        sourceFlux, blendFlux = event.get_ref_fluxes()
        if (sourceFlux[0] <= 0) or (blendFlux <= 0):
            return -np.inf, [-1, -1]
        sourceMag = MulensModel.Utils.get_mag_from_flux(sourceFlux[0])
        blendMag = MulensModel.Utils.get_mag_from_flux(blendFlux)
        return ln_prior_ + ln_like_, [sourceMag, blendMag]
    else:
        return ln_prior_ + ln_like_, [-1, -1]

前の関数:

def __ln_prior(self, theta, parameters_to_fit, parallaxType):
    """ priors - we only reject obviously wrong models """
    if theta[parameters_to_fit.index("t_E")] < 0.:
        return -np.inf
    elif (theta[parameters_to_fit.index("u_0")] < 0.) and (parallaxType == 'positive'):
        return -np.inf
    elif (theta[parameters_to_fit.index("u_0")] > 0.) and (parallaxType == 'negative'):
        return -np.inf
    return 0.0

チェーン値が振動することを期待していますが、一部のケースではそうではありません。後のコードからエラーがスローされないため、__ln_prior または __ln_prob から -np.inf 値が返されないようです。-np.inf が返された場合、コードは壊れるべきだと思いますか? たぶんこれが理由ですか?

問題を理解するためにコードがあまり必要ではないと思います。これが、明らかに理解していない比較的頻繁に発生する問題であることを願っています。

sample() 関数が受け取ったのと同じパラメーターのセットを返す理由について、ソース コードを調べてみましたが、これが見つからないようです。

ソース コードは次の場所にあります: https://github.com/dfm/emcee/blob/master/emcee/ensemble.py

4

0 に答える 0