def fit(
    real,
    known,
    latent_d=1,
    ret_pmf=False,
    subtract_mean=False,
    sig_u=1e10,
    sig_v=1e10,
    sig=1,
    do_bayes=False,
    burnin=10,
    samps=200,
    stop_thresh=1e-10,
    min_learning_rate=1e-20,
):
    ratings = np.zeros((known.sum(), 3))
    for idx, (i, j) in enumerate(np.transpose(known.nonzero())):
        ratings[idx] = [i, j, real[i, j]]

    pmf = ProbabilisticMatrixFactorization(ratings, latent_d, subtract_mean)
    pmf.sigma_sq = sig
    pmf.sigma_u_sq = sig_u
    pmf.sigma_v_sq = sig_v
    pmf.stop_thresh = stop_thresh
    pmf.min_learning_rate = min_learning_rate
    pmf.fit()

    if not do_bayes:
        pred = pmf.predicted_matrix()
        return (pmf, pred) if ret_pmf else pred
    else:
        bpmf = BayesianPMF(ratings, 1)
        bpmf.__setstate__(pmf.__getstate__())
        sampler = bpmf.samples()

        # do burn-in
        next(islice(sampler, burnin, burnin), None)

        pred = bpmf.predict(islice(sampler, samps))
        return (bpmf, pred) if ret_pmf else pred
def fit(real,
        known,
        latent_d=1,
        ret_pmf=False,
        subtract_mean=False,
        sig_u=1e10,
        sig_v=1e10,
        sig=1,
        do_bayes=False,
        burnin=10,
        samps=200,
        stop_thresh=1e-10,
        min_learning_rate=1e-20):
    ratings = np.zeros((known.sum(), 3))
    for idx, (i, j) in enumerate(np.transpose(known.nonzero())):
        ratings[idx] = [i, j, real[i, j]]

    pmf = ProbabilisticMatrixFactorization(ratings, latent_d, subtract_mean)
    pmf.sigma_sq = sig
    pmf.sigma_u_sq = sig_u
    pmf.sigma_v_sq = sig_v
    pmf.stop_thresh = stop_thresh
    pmf.min_learning_rate = min_learning_rate
    pmf.fit()

    if not do_bayes:
        pred = pmf.predicted_matrix()
        return (pmf, pred) if ret_pmf else pred
    else:
        bpmf = BayesianPMF(ratings, 1)
        bpmf.__setstate__(pmf.__getstate__())
        sampler = bpmf.samples()

        # do burn-in
        next(islice(sampler, burnin, burnin), None)

        pred = bpmf.predict(islice(sampler, samps))
        return (bpmf, pred) if ret_pmf else pred