24 from __future__
import absolute_import, division, print_function
26 __all__ = (
"fitMixture",
"SemiEmpiricalPriorConfig",
27 "SoftenedLinearPriorControl")
29 from builtins
import range
33 from lsst.pex.config
import makeConfigClass
34 from lsst.utils
import continueClass
36 from ..mixture
import Mixture
37 from .priors
import (SemiEmpiricalPriorControl, SemiEmpiricalPrior,
38 SoftenedLinearPriorControl, SoftenedLinearPrior,
42 SemiEmpiricalPriorConfig = makeConfigClass(SemiEmpiricalPriorControl)
44 SoftenedLinearPriorConfig = makeConfigClass(SoftenedLinearPriorControl)
50 ConfigClass = SemiEmpiricalPriorConfig
56 ConfigClass = SoftenedLinearPriorConfig
59 def fitMixture(data, nComponents, minFactor=0.25, maxFactor=4.0,
60 nIterations=20, df=float(
"inf")):
61 """Fit a ``Mixture`` distribution to a set of (e1, e2, r) data points,
62 returing a ``MixturePrior`` object.
67 array of data points to fit; shape=(N,3)
69 number of components in the mixture distribution
71 ellipticity variance of the smallest component in the initial mixture,
72 relative to the measured variance
74 ellipticity variance of the largest component in the initial mixture,
75 relative to the measured variance
77 number of expectation-maximization update iterations
79 number of degrees of freedom for component Student's T distributions
82 components = Mixture.ComponentList()
83 rMu = data[:, 2].mean()
84 rSigma = data[:, 2].var()
85 eSigma = 0.5*(data[:, 0].var() + data[:, 1].var())
86 mu = np.array([0.0, 0.0, rMu], dtype=float)
87 baseSigma = np.array([[eSigma, 0.0, 0.0],
90 for factor
in np.linspace(minFactor, maxFactor, nComponents):
91 sigma = baseSigma.copy()
92 sigma[:2, :2] *= factor
94 mixture = Mixture(3, components, df)
95 restriction = MixturePrior.getUpdateRestriction()
96 for i
in range(nIterations):
97 mixture.updateEM(data, restriction)
A weighted Student's T or Gaussian distribution used as a component in a Mixture. ...