import numpy as np
import scipy.stats as st
from scipy.optimize import minimize
import matplotlib.pyplot as pltN = 101
K = 10
p = 0.75
B = st.binom(K, p)
np.random.seed(291)
x = B.rvs(size = N)def ll_binomial(theta, data):
    sx = np.sum(data["x"])
    K = data["K"]
    N = data["N"]
    l1p = np.log1p(-theta) # np.log(1 + -p)
    out = np.log(theta) * sx + l1p * (N * K - sx)
    return -outrng = np.random.default_rng()
init = rng.random()
data = {"x": x, "K": K, "N": np.size(x)}
minimize(ll_binomial, init, args = (data,), bounds = [(1e-5, 1 - 1e-5)])  message: CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL
  success: True
   status: 0
      fun: 576.050536971854
        x: [ 7.426e-01]
      nit: 7
      jac: [ 0.000e+00]
     nfev: 18
     njev: 9
 hess_inv: <1x1 LbfgsInvHessProduct with dtype=float64>