24__all__ = (
"fitMixture",
"SemiEmpiricalPriorConfig",
25 "SoftenedLinearPriorControl")
30from lsst.utils
import continueClass
32from ..mixture
import Mixture
33from .priors
import (SemiEmpiricalPriorControl, SemiEmpiricalPrior,
34 SoftenedLinearPriorControl, SoftenedLinearPrior,
38SemiEmpiricalPriorConfig = makeConfigClass(SemiEmpiricalPriorControl)
40SoftenedLinearPriorConfig = makeConfigClass(SoftenedLinearPriorControl)
46 ConfigClass = SemiEmpiricalPriorConfig
52 ConfigClass = SoftenedLinearPriorConfig
55def fitMixture(data, nComponents, minFactor=0.25, maxFactor=4.0,
56 nIterations=20, df=float(
"inf")):
57 """Fit a ``Mixture`` distribution to a set of (e1, e2, r) data points,
58 returing a ``MixturePrior`` object.
63 array of data points to fit; shape=(N,3)
65 number of components in the mixture distribution
67 ellipticity variance of the smallest component
in the initial mixture,
68 relative to the measured variance
70 ellipticity variance of the largest component
in the initial mixture,
71 relative to the measured variance
73 number of expectation-maximization update iterations
75 number of degrees of freedom
for component Student
's T distributions
79 rMu = data[:, 2].mean()
80 rSigma = data[:, 2].var()
81 eSigma = 0.5*(data[:, 0].var() + data[:, 1].var())
82 mu = np.array([0.0, 0.0, rMu], dtype=float)
83 baseSigma = np.array([[eSigma, 0.0, 0.0],
86 for factor
in np.linspace(minFactor, maxFactor, nComponents):
87 sigma = baseSigma.copy()
88 sigma[:2, :2] *= factor
90 mixture = Mixture(3, components, df)
91 restriction = MixturePrior.getUpdateRestriction()
92 for i
in range(nIterations):
93 mixture.updateEM(data, restriction)
A weighted Student's T or Gaussian distribution used as a component in a Mixture.
def fitMixture(data, nComponents, minFactor=0.25, maxFactor=4.0, nIterations=20, df=float("inf"))