LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
priorsContinued.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #
3 # LSST Data Management System
4 # Copyright 2008-2013 LSST Corporation.
5 #
6 # This product includes software developed by the
7 # LSST Project (http://www.lsst.org/).
8 #
9 # This program is free software: you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation, either version 3 of the License, or
12 # (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the LSST License Statement and
20 # the GNU General Public License along with this program. If not,
21 # see <http://www.lsstcorp.org/LegalNotices/>.
22 #
23 
24 __all__ = ("fitMixture", "SemiEmpiricalPriorConfig",
25  "SoftenedLinearPriorControl")
26 
27 import numpy as np
28 
29 from lsst.pex.config import makeConfigClass
30 from lsst.utils import continueClass
31 
32 from ..mixture import Mixture
33 from .priors import (SemiEmpiricalPriorControl, SemiEmpiricalPrior,
34  SoftenedLinearPriorControl, SoftenedLinearPrior,
35  MixturePrior)
36 
37 
38 SemiEmpiricalPriorConfig = makeConfigClass(SemiEmpiricalPriorControl)
39 
40 SoftenedLinearPriorConfig = makeConfigClass(SoftenedLinearPriorControl)
41 
42 
43 @continueClass # noqa: F811 (FIXME: remove for py 3.8+)
44 class SemiEmpiricalPrior: # noqa: F811
45 
46  ConfigClass = SemiEmpiricalPriorConfig
47 
48 
49 @continueClass # noqa: F811 (FIXME: remove for py 3.8+)
50 class SoftenedLinearPrior: # noqa: F811
51 
52  ConfigClass = SoftenedLinearPriorConfig
53 
54 
55 def 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.
59 
60  Parameters
61  ----------
62  data : numpy.ndarray
63  array of data points to fit; shape=(N,3)
64  nComponents : int
65  number of components in the mixture distribution
66  minFactor : float
67  ellipticity variance of the smallest component in the initial mixture,
68  relative to the measured variance
69  maxFactor : float
70  ellipticity variance of the largest component in the initial mixture,
71  relative to the measured variance
72  nIterations : int
73  number of expectation-maximization update iterations
74  df : float
75  number of degrees of freedom for component Student's T distributions
76  (inf=Gaussian).
77  """
78  components = Mixture.ComponentList()
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],
84  [0.0, eSigma, 0.0],
85  [0.0, 0.0, rSigma]])
86  for factor in np.linspace(minFactor, maxFactor, nComponents):
87  sigma = baseSigma.copy()
88  sigma[:2, :2] *= factor
89  components.append(Mixture.Component(1.0, mu, sigma))
90  mixture = Mixture(3, components, df)
91  restriction = MixturePrior.getUpdateRestriction()
92  for i in range(nIterations):
93  mixture.updateEM(data, restriction)
94  return mixture
A weighted Student's T or Gaussian distribution used as a component in a Mixture.
Definition: Mixture.h:47
def fitMixture(data, nComponents, minFactor=0.25, maxFactor=4.0, nIterations=20, df=float("inf"))
def makeConfigClass(ctrl, name=None, base=Config, doc=None, module=None, cls=None)
Definition: wrap.py:56