一、Cost functions
使用内置的Cost functions不仅方便,而且还有一些额外的功能。
①、支持拟合加权直方图。
②、技术技巧提高数值稳定性。
③、可选numba加速(如果安装了numba)。
④、可以添加成本函数来拟合具有共享参数的数据集。
⑤、临时屏蔽数据。
from iminuit import cost, Minuit
from numba_stats import truncnorm, truncexpon, norm, expon
import numpy as np
from matplotlib import pyplot as plt
from scipy.stats import multivariate_normal as mvnorm
from jacobi import jacobi
xr = (0, 2) # xrange
rng = np.random.default_rng(1)
xdata = rng.normal(1, 0.1, size=1000)
ydata = rng.exponential(size=len(xdata))
xmix = np.append(xdata, ydata)
xmix = xmix[(xr[0] < xmix) & (xmix < xr[1])]
n, xe = np.histogram(xmix, bins=20, range=xr)
cx = 0.5 * (xe[1:] + xe[:-1])
dx = np.diff(xe)
plt.errorbar(cx, n, n ** 0.5, fmt="ok")
plt.plot(xmix, np.zeros_like(xmix), "|", alpha=0.1)
n2, _, ye = np.histogram2d(xdata, ydata, bins=(20, 5), range=(xr, (0, np.max(ydata))))
plt.pcolormesh(xe, ye, n2.T)
plt.scatter(xdata, ydata, marker=".", color="w", s=1);
二、最大似然估计
def pdf(x, z, mu, sigma, tau):
return (z * truncnorm.pdf(x, *xr, mu, sigma) +
(1 - z) * truncexpon.pdf(x, *xr, 0.0, tau))
c = cost.UnbinnedNLL(xmix, pdf)
m = Minuit(c, z=0.4, mu=1, sigma=0.2, tau=1)
m.limits["z"] = (0, 1)
m.limits["mu"] = (0, 2)
m.limits["sigma", "tau"] = (0, None)
m.migrad()