+
    0i[d                         ^ RI HtHt ^ RIHtHt ^ RIHtHtH	t	H
t
HtHtHtHtHtHtHtHtHtHtHtHt ^ RIt^RIHtHt ^RIHt R.t ! R R4      tR	 tR# )
    )linalgspecial)check_random_state	np_vecdot)asarray
atleast_2dreshapezerosnewaxisexppisqrtravelpower
atleast_1dsqueezesum	transposeonescovN)gaussian_kernel_estimategaussian_kernel_estimate_log)multivariate_normalgaussian_kdec                      a  ] tR t^$t o RtRR ltR t]tR tR t	RRR/R llt
R	 tRR
 ltR tR t]tR]n        RR ltR t]R 4       tR tR tR t]R 4       t]R 4       tRtV tR# )r   ay  Representation of a kernel-density estimate using Gaussian kernels.

Kernel density estimation is a way to estimate the probability density
function (PDF) of a random variable in a non-parametric way.
`gaussian_kde` works for both uni-variate and multi-variate data.   It
includes automatic bandwidth determination.  The estimation works best for
a unimodal distribution; bimodal or multi-modal distributions tend to be
oversmoothed.

Parameters
----------
dataset : array_like
    Datapoints to estimate from. In case of univariate data this is a 1-D
    array, otherwise a 2-D array with shape (# of dims, # of data).
bw_method : str, scalar or callable, optional
    The method used to calculate the bandwidth factor.  This can be
    'scott', 'silverman', a scalar constant or a callable.  If a scalar,
    this will be used directly as `factor`.  If a callable, it should
    take a `gaussian_kde` instance as only parameter and return a scalar.
    If None (default), 'scott' is used.  See Notes for more details.
weights : array_like, optional
    weights of datapoints. This must be the same shape as dataset.
    If None (default), the samples are assumed to be equally weighted

Attributes
----------
dataset : ndarray
    The dataset with which `gaussian_kde` was initialized.
d : int
    Number of dimensions.
n : int
    Number of datapoints.
neff : int
    Effective number of datapoints.

    .. versionadded:: 1.2.0
factor : float
    The bandwidth factor obtained from `covariance_factor`.
covariance : ndarray
    The kernel covariance matrix; this is the data covariance matrix
    multiplied by the square of the bandwidth factor, e.g.
    ``np.cov(dataset) * factor**2``.
inv_cov : ndarray
    The inverse of `covariance`.

Methods
-------
evaluate
__call__
integrate_gaussian
integrate_box_1d
integrate_box
integrate_kde
pdf
logpdf
resample
set_bandwidth
covariance_factor
marginal

Notes
-----
Bandwidth selection strongly influences the estimate obtained from the KDE
(much more so than the actual shape of the kernel).  Bandwidth selection
can be done by a "rule of thumb", by cross-validation, by "plug-in
methods" or by other means; see [3]_, [4]_ for reviews.  `gaussian_kde`
uses a rule of thumb, the default is Scott's Rule.

Scott's Rule [1]_, implemented as `scotts_factor`, is::

    n**(-1./(d+4)),

with ``n`` the number of data points and ``d`` the number of dimensions.
In the case of unequally weighted points, `scotts_factor` becomes::

    neff**(-1./(d+4)),

with ``neff`` the effective number of datapoints.
Silverman's suggestion for *multivariate* data [2]_, implemented as
`silverman_factor`, is::

    (n * (d + 2) / 4.)**(-1. / (d + 4)).

or in the case of unequally weighted points::

    (neff * (d + 2) / 4.)**(-1. / (d + 4)).

Note that this is not the same as "Silverman's rule of thumb" [6]_, which
may be more robust in the univariate case; see documentation of the
``set_bandwidth`` method for implementing a custom bandwidth rule.

Good general descriptions of kernel density estimation can be found in [1]_
and [2]_, the mathematics for this multi-dimensional implementation can be
found in [1]_.

With a set of weighted samples, the effective number of datapoints ``neff``
is defined by::

    neff = sum(weights)^2 / sum(weights^2)

as detailed in [5]_.

`gaussian_kde` does not currently support data that lies in a
lower-dimensional subspace of the space in which it is expressed. For such
data, consider performing principal component analysis / dimensionality
reduction and using `gaussian_kde` with the transformed data.

References
----------
.. [1] D.W. Scott, "Multivariate Density Estimation: Theory, Practice, and
       Visualization", John Wiley & Sons, New York, Chicester, 1992.
.. [2] B.W. Silverman, "Density Estimation for Statistics and Data
       Analysis", Vol. 26, Monographs on Statistics and Applied Probability,
       Chapman and Hall, London, 1986.
.. [3] B.A. Turlach, "Bandwidth Selection in Kernel Density Estimation: A
       Review", CORE and Institut de Statistique, Vol. 19, pp. 1-33, 1993.
.. [4] D.M. Bashtannyk and R.J. Hyndman, "Bandwidth selection for kernel
       conditional density estimation", Computational Statistics & Data
       Analysis, Vol. 36, pp. 279-298, 2001.
.. [5] Gray P. G., 1969, Journal of the Royal Statistical Society.
       Series A (General), 132, 272
.. [6] Kernel density estimation. *Wikipedia.*
       https://en.wikipedia.org/wiki/Kernel_density_estimation

Examples
--------
Generate some random two-dimensional data:

>>> import numpy as np
>>> from scipy import stats
>>> def measure(n):
...     "Measurement model, return two coupled measurements."
...     m1 = np.random.normal(size=n)
...     m2 = np.random.normal(scale=0.5, size=n)
...     return m1+m2, m1-m2

>>> m1, m2 = measure(2000)
>>> xmin = m1.min()
>>> xmax = m1.max()
>>> ymin = m2.min()
>>> ymax = m2.max()

Perform a kernel density estimate on the data:

>>> X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
>>> positions = np.vstack([X.ravel(), Y.ravel()])
>>> values = np.vstack([m1, m2])
>>> kernel = stats.gaussian_kde(values)
>>> Z = np.reshape(kernel(positions).T, X.shape)

Plot the results:

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,
...           extent=[xmin, xmax, ymin, ymax])
>>> ax.plot(m1, m2, 'k.', markersize=2)
>>> ax.set_xlim([xmin, xmax])
>>> ax.set_ylim([ymin, ymax])
>>> plt.show()

Compare against manual KDE at a point:

>>> point = [1, 2]
>>> mean = values.T
>>> cov = kernel.factor**2 * np.cov(values)
>>> X = stats.multivariate_normal(cov=cov)
>>> res = kernel.pdf(point)
>>> ref = X.pdf(point - mean).sum() / len(mean)
>>> np.allclose(res, ref)
True
Nc                T   \        \        V4      4      V n        V P                  P                  ^8  g   \	        R4      hV P                  P
                  w  V n        V n        Ve   \        V4      P                  \        4      V n        V ;P                  \        V P                  4      ,          un        V P                  P                  ^8w  d   \	        R4      h\        V P                  4      V P                  8w  d   \	        R4      h^\!        V P                  V P                  4      ,          V n        V P                  V P                  8  d   Rp\	        V4      h V P%                  VR7       R#   \&        P(                   d   pRp\&        P(                  ! T4      ThRp?ii ; i)   z.`dataset` input should have multiple elements.Nz*`weights` input should be one-dimensional.z%`weights` input should be of length na1  Number of dimensions is greater than number of samples. This results in a singular data covariance matrix, which cannot be treated using the algorithms implemented in `gaussian_kde`. Note that `gaussian_kde` interprets each *column* of `dataset` to be a point; consider transposing the input to `dataset`.	bw_methodab  The data appears to lie in a lower-dimensional subspace of the space in which it is expressed. This has resulted in a singular data covariance matrix, which cannot be treated using the algorithms implemented in `gaussian_kde`. Consider performing principal component analysis / dimensionality reduction and using `gaussian_kde` with the transformed data.)r   r   datasetsize
ValueErrorshapednr   astypefloat_weightsr   weightsndimlenr   _neffset_bandwidthr   LinAlgError)selfr    r   r)   msges   &&&&  N/var/www/html/photoedit/myenv/lib/python3.14/site-packages/scipy/stats/_kde.py__init__gaussian_kde.__init__   sB   !''"23||  1$MNN++&w/66u=DMMMS//M||  A% !MNN4==!TVV+ !HII9T]]DMMBBDJ 66DFF?-C S/!
	13!! 	1?C $$S)q0	1s    E4 4F'	F""F'c                   \        \        V4      4      pVP                  w  r#W P                  8w  dO   V^8X  d+   W0P                  8X  d   \	        WP                  ^34      p^pMRV RV P                   2p\        V4      h\        V P                  V4      w  rV\        V,          ! V P                  P                  V P                  R,          VP                  V P                  V4      pVR,          # )a  Evaluate the estimated pdf on a set of points.

Parameters
----------
points : (# of dimensions, # of points)-array
    Alternatively, a (# of dimensions,) vector can be passed in and
    treated as a single point.

Returns
-------
values : (# of points,)-array
    The values at each point.

Raises
------
ValueError : if the dimensionality of the input points is different than
             the dimensionality of the KDE.

points have dimension , dataset has dimension NNNNr9   r   )r   r   r#   r$   r	   r"   _get_output_dtype
covariancer   r    Tr)   cho_cov)r/   pointsr$   mr0   output_dtypespecresults   &&      r2   evaluategaussian_kde.evaluate   s    ( GFO,||;Av!vv+ &&!5/s 3004x9 o%.tG)$/LLNNDLL1HHdllL2 d|    c                4   \        \        V4      4      p\        V4      pVP                  V P                  38w  d   \        RV P                   24      hVP                  V P                  V P                  38w  d   \        RV P                   24      hVR\        3,          pV P                  V,           p\        P                  ! V4      pV P                  V,
          p\        P                  ! WE4      p\        P                  ! \        P                  ! V^ ,          4      4      p\        ^\         ,          VP                  ^ ,          R,          4      V,          p\#        WV^ R7      R,          p	\#        \%        V	) 4      V P&                  ^ R7      V,          p
V
# )a  
Multiply estimated density by a multivariate Gaussian and integrate
over the whole space.

Parameters
----------
mean : aray_like
    A 1-D array, specifying the mean of the Gaussian.
cov : array_like
    A 2-D array, specifying the covariance matrix of the Gaussian.

Returns
-------
result : scalar
    The value of the integral.

Raises
------
ValueError
    If the mean or covariance of the input Gaussian differs from
    the KDE's dimensionality.

zmean does not have dimension z#covariance does not have dimension r9          @axis)r   r   r   r#   r$   r"   r   r<   r   
cho_factorr    	cho_solvenpproddiagonalr   r   r   r   r)   )r/   meanr   sum_covsum_cov_choldifftdiffsqrt_det
norm_constenergiesrC   s   &&&        r2   integrate_gaussiangaussian_kde.integrate_gaussian!  s3   0 '$-(o::$&&"<TVVHEFF99((B466(KLL AwJ//C'
 ((1||d"  4772;;|A781r67==#3c#9:XE
Tq1C73y>4<<a@:MrF   c                   V P                   ^8w  d   \        R4      h\        \        V P                  4      4      ^ ,          p\        WP
                  ,
          V,          4      p\        W P
                  ,
          V,          4      p\        P                  ! V4      \        P                  ! V4      ,
          p\        V P                  V4      pV# )a4  
Computes the integral of a 1D pdf between two bounds.

Parameters
----------
low : scalar
    Lower bound of integration.
high : scalar
    Upper bound of integration.

Returns
-------
value : scalar
    The result of the integral.

Raises
------
ValueError
    If the KDE is over more than one dimension.

z'integrate_box_1d() only handles 1D pdfs)
r$   r"   r   r   r<   r    r   ndtrr   r)   )r/   lowhighstdevnormalized_lownormalized_highdeltavalues   &&&     r2   integrate_box_1dgaussian_kde.integrate_box_1dV  s    , 66Q;FGGd4??+,Q/ll 2e;<!4 =>_-^0LL$,,.rF   rngc                   WP                   P                  ,
          W P                   P                  ,
          re\        P                  ! WeV P                  VVR7      p\        WpP                  RR7      # )a  Computes the integral of a pdf over a rectangular interval.

Parameters
----------
low_bounds : array_like
    A 1-D array containing the lower bounds of integration.
high_bounds : array_like
    A 1-D array containing the upper bounds of integration.
maxpts : int, optional
    The maximum number of points to use for integration.
rng : `numpy.random.Generator`, optional
    Pseudorandom number generator state. When `rng` is None, a new
    generator is created using entropy from the operating system. Types
    other than `numpy.random.Generator` are passed to
    `numpy.random.default_rng` to instantiate a ``Generator``.

Returns
-------
value : scalar
    The result of the integral.

)lower_limitr   maxptsre   rI   )r    r=   r   cdfr<   r   r)   )r/   
low_boundshigh_boundsrh   re   r\   r]   valuess   &&&&$   r2   integrate_boxgaussian_kde.integrate_boxx  sR    . /||~~1MT$((tv
 B77rF   c                J   VP                   V P                   8w  d   \        R4      hVP                  V P                  8  d   TpT pMT pTpVP                  VP                  ,           p\        P
                  ! V4      pRp\        VP                  4       F  pVP                  RV\        3,          pVP                  V,
          p	\        P                  ! WY4      p
\        W^ R7      R,          pV\        \        V) 4      VP                  ^ R7      VP                  V,          ,          ,          pK  	  \        P                  ! \        P                  ! V^ ,          4      4      p\!        ^\"        ,          VP$                  ^ ,          R,          4      V,          pWm,          pV# )a'  
Computes the integral of the product of this  kernel density estimate
with another.

Parameters
----------
other : gaussian_kde instance
    The other kde.

Returns
-------
value : scalar
    The result of the integral.

Raises
------
ValueError
    If the KDEs have different dimensionality.

z$KDEs are not the same dimensionalityg        r9   rI   rH   )r$   r"   r%   r<   r   rK   ranger    r   rL   r   r   r)   rM   rN   rO   r   r   r#   )r/   othersmalllargerQ   rR   rC   irP   rS   rT   rW   rU   rV   s   &&            r2   integrate_kdegaussian_kde.integrate_kde  s?   * 77dffCDD 77TVVEEEE""U%5%55((1uwwA==Aw/D==4'D$$\8E 15;HiXIAFu}}UVGWWWF   772;;|A781r67==#3c#9:XE
rF   c                R   Vf   \        V P                  4      p\        V4      p\        VP	                  \        V P                  3\        4      V P                  VR7      4      pVP                  V P                  WP                  R7      pV P                  RV3,          pWd,           # )a  Randomly sample a dataset from the estimated pdf.

Parameters
----------
size : int, optional
    The number of samples to draw.  If not provided, then the size is
    the same as the effective number of samples in the underlying
    dataset.
seed : {None, int, `numpy.random.Generator`, `numpy.random.RandomState`}, optional
    If `seed` is None (or `np.random`), the `numpy.random.RandomState`
    singleton is used.
    If `seed` is an int, a new ``RandomState`` instance is used,
    seeded with `seed`.
    If `seed` is already a ``Generator`` or ``RandomState`` instance then
    that instance is used.

Returns
-------
resample : (self.d, `size`) ndarray
    The sampled dataset.

)r!   )r!   pr9   )intneffr   r   r   r
   r$   r'   r<   choicer%   r)   r    )r/   r!   seedrandom_statenormindicesmeanss   &&&    r2   resamplegaussian_kde.resample  s    . <tyy>D)$/99466)U#T__4 : 
  %%dff4<<%HQZ(|rF   c                ^    \        V P                  RV P                  ^,           ,          4      # )zGCompute Scott's factor.

Returns
-------
s : float
    Scott's factor.
      r   r{   r$   r/   s   &r2   scotts_factorgaussian_kde.scotts_factor  s!     TYYTVVAX//rF   c                    \        V P                  V P                  R,           ,          R,          RV P                  ^,           ,          4      # )zSCompute the Silverman factor.

Returns
-------
s : float
    The silverman factor.
rH   g      @r   r   r   s   &r2   silverman_factorgaussian_kde.silverman_factor  s3     TYYs
+C/dffQh@@rF   zComputes the bandwidth factor `factor`.
        The default is `scotts_factor`.  A subclass can overwrite this
        method to provide a different method, or set it through a call to
        `set_bandwidth`.c                  a a Sf   MSR8X  d   S P                   S n        MSR8X  d   S P                  S n        Mv\        P                  ! S4      '       d*   \        S\        4      '       g   RS n        V3R lS n        M1\        S4      '       d   SS n        V 3R lS n        MRp\        V4      hS P                  4        R# )a*  Compute the bandwidth factor with given method.

The new bandwidth calculated after a call to `set_bandwidth` is used
for subsequent evaluations of the estimated density.

Parameters
----------
bw_method : str, scalar or callable, optional
    The method used to calculate the bandwidth factor.  This can be
    'scott', 'silverman', a scalar constant or a callable.  If a
    scalar, this will be used directly as `factor`.  If a callable,
    it should take a `gaussian_kde` instance as only parameter and
    return a scalar.  If None (default), nothing happens; the current
    `covariance_factor` method is kept.

Notes
-----
.. versionadded:: 0.11

Examples
--------
>>> import numpy as np
>>> import scipy.stats as stats
>>> x1 = np.array([-7, -5, 1, 4, 5.])
>>> kde = stats.gaussian_kde(x1)
>>> xs = np.linspace(-10, 10, num=50)
>>> y1 = kde(xs)
>>> kde.set_bandwidth(bw_method='silverman')
>>> y2 = kde(xs)
>>> kde.set_bandwidth(bw_method=kde.factor / 3.)
>>> y3 = kde(xs)

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> ax.plot(x1, np.full(x1.shape, 1 / (4. * x1.size)), 'bo',
...         label='Data points (rescaled)')
>>> ax.plot(xs, y1, label='Scott (default)')
>>> ax.plot(xs, y2, label='Silverman')
>>> ax.plot(xs, y3, label='Const (1/3 * Silverman)')
>>> ax.legend()
>>> plt.show()

Nscott	silvermanzuse constantc                     < S # N r   s   r2   <lambda>,gaussian_kde.set_bandwidth.<locals>.<lambda>:  s    YrF   c                  &   < S P                  S 4      # r   )
_bw_methodr   s   r2   r   r   =  s    T__T-BrF   zC`bw_method` should be 'scott', 'silverman', a scalar or a callable.)r   covariance_factorr   rM   isscalar
isinstancestrr   callabler"   _compute_covariance)r/   r   r0   s   ff r2   r-   gaussian_kde.set_bandwidth  s    X '!%)%7%7D"+%%)%:%:D"[[##Jy#,F,F,DO%6D"i  'DO%BD"#CS/!  "rF   c           
        V P                  4       V n        \        V R4      '       gY   \        \	        V P
                  ^RV P                  R7      4      V n        \        P                  ! V P                  RR7      V n
        V P                  V P                  ^,          ,          V n        V P                  V P                  ,          P                  \        P                  4      V n        ^\        P                   ! \        P"                  ! V P                  \        P$                  ! ^\&        ,          4      ,          4      4      P)                  4       ,          V n        R# )zSComputes the covariance matrix for each Gaussian kernel using
covariance_factor().
_data_cho_covFrowvarbiasaweightsT)lowerN)r   factorhasattrr   r   r    r)   _data_covariancer   choleskyr   r<   r&   rM   float64r>   logdiagr   r   r   log_detr   s   &r2   r    gaussian_kde._compute_covarianceE  s     ,,.t_--$.s4<<498<0F %GD! "(1F1F7;"=D //$++q.@**T[[8@@L*,''!B$-)8 !9 ::=#%@rF   c           	         V P                  4       V n        \        \        V P                  ^RV P
                  R7      4      V n        \        P                  ! V P                  4      V P                  ^,          ,          # )r   Fr   )	r   r   r   r   r    r)   r   r   invr   s   &r2   inv_covgaussian_kde.inv_covW  s]     ,,. *3t||A05,N !Ozz$//04;;>AArF   c                $    V P                  V4      # )z
Evaluate the estimated pdf on a provided set of points.

Notes
-----
This is an alias for `gaussian_kde.evaluate`.  See the ``evaluate``
docstring for more details.

)rD   )r/   xs   &&r2   pdfgaussian_kde.pdfc  s     }}QrF   c                   \        V4      pVP                  w  r4W0P                  8w  dO   V^8X  d+   W@P                  8X  d   \        W P                  ^34      p^pMRV RV P                   2p\	        V4      h\        V P                  V4      w  rg\        V,          ! V P                  P                  V P                  R,          VP                  V P                  V4      pVR,          # )zD
Evaluate the log of the estimated pdf on a provided set of points.
r6   r7   r8   r:   )r   r#   r$   r	   r"   r;   r<   r   r    r=   r)   r>   )	r/   r   r?   r$   r@   r0   rA   rB   rC   s	   &&       r2   logpdfgaussian_kde.logpdfo  s     A||;Av!vv+ &&!5/s 3004x9 o%.tG-d3LLNNDLL1HHdllL2 d|rF   c                   \         P                  ! V4      p\         P                  ! VP                  \         P                  4      '       g   Rp\        V4      h\        V P                  4      pVP                  4       pWBV^ 8  ,          ,           W"^ 8  &   \        \         P                  ! V4      4      \        V4      8w  d   Rp\        V4      hV^ 8  W$8  ,          p\         P                  ! V4      '       d   RWV,           RV R2p\        V4      hV P                  V,          pV P                  p\        WpP                  4       VR7      # )a  Return a marginal KDE distribution

Parameters
----------
dimensions : int or 1-d array_like
    The dimensions of the multivariate distribution corresponding
    with the marginal variables, that is, the indices of the dimensions
    that are being retained. The other dimensions are marginalized out.

Returns
-------
marginal_kde : gaussian_kde
    An object representing the marginal distribution.

Notes
-----
.. versionadded:: 1.10.0

zaElements of `dimensions` must be integers - the indices of the marginal variables being retained.z,All elements of `dimensions` must be unique.zDimensions z# are invalid for a distribution in z dimensions.)r   r)   )rM   r   
issubdtypedtypeintegerr"   r+   r    copyuniqueanyr)   r   r   )	r/   
dimensionsdimsr0   r%   original_dims	i_invalidr    r)   s	   &&       r2   marginalgaussian_kde.marginal  s   * }}Z(}}TZZ44?CS/!		$(^+AXryy3t9,ACS/!AX$),	66) !9 : ;,,-3l<CS/!,,t$,,G/E/E/G$+- 	-rF   c                     V P                   #   \         d;    \        T P                  4      T P                  ,          T n         T P                   u # i ; ir   )r(   AttributeErrorr   r%   r   s   &r2   r)   gaussian_kde.weights  sB    	!==  	! L/DM== 	!s    AAAc                     V P                   #   \         d<    ^\        T P                  T P                  4      ,          T n         T P                   u # i ; i)r   )r,   r   r   r)   r   s   &r2   r{   gaussian_kde.neff  sE    	:: 	9T\\4<<@@DJ::	s    AAA)r   r   r   r,   r(   r>   r<   r   r$   r    r   r   r%   )NNr   )__name__
__module____qualname____firstlineno____doc__r3   rD   __call__rX   rc   rn   rv   r   r   r   r   r-   r   propertyr   r   r   r   r)   r{   __static_attributes____classdictcell__)__classdict__s   @r2   r   r   $   s     kX$1L&P H3j D8 8<0d!F0A &!
=#~@$ 	B 	B
 0/-b ! !  rF   c                    \         P                  ! W4      p\         P                  ! V4      P                  pV^8X  d   RpW$3# V^8X  d   RpW$3# VR9   d   RpW$3# \	        V RV 24      h)z
Calculates the output dtype and the "spec" (=C type name).

This was necessary in order to deal with the fused types in the Cython
routine `gaussian_kernel_estimate`. See gh-10824 for details.
r'   doublezlong doublez has unexpected item size: )      )rM   common_typer   itemsizer"   )r<   r?   rA   r   rB   s   &&   r2   r;   r;     s     >>*5Lxx%..H1}  
Q  
X	 	 . ;H:F 	rF   ) scipyr   r   scipy._lib._utilr   r   numpyr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   rM   _statsr   r   _multivariater   __all__r   r;   r   rF   r2   <module>r      sN   * " :      K .
b
 b
JrF   