Ë
    ÿ�DjÈ=  ã                  ó  — d Z ddlmZ ddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ dd	gZ e	d
„ d„ dd„ dd¬«      	 	 	 d	 	 	 	 	 	 	 dd„«       Zdd„Z e	d„ dd„ e¬«      dddddœ	 	 	 	 	 	 	 	 	 	 	 d d„«       Zd„ Zd„ Zd„ Zd„ Zd„ Zy)!z5
Created on Fri Apr  2 09:06:05 2021

@author: matth
é    )ÚannotationsN)Úspecialé   )Ú_axis_nan_policy_factoryÚ_broadcast_arrays)Úarray_namespaceÚentropyÚdifferential_entropyc                ó   — | S ©N© ©Úxs    úXC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\scipy/stats/_entropy.pyú<lambda>r      ó   € ˆa€ ó    c                ó   — d| v r| d   �dS dS )NÚqké   r   r   )Úkwgss    r   r   r      s!   € Ø�d‰l˜t D™zÐ5ˆð àð r   c                ó   — | fS r   r   r   s    r   r   r      s   € ¨A¨4€ r   Téÿÿÿÿ)Ú	n_samplesÚ	n_outputsÚresult_to_tupleÚpairedÚ	too_smallc                óR  — |�|dk  rt        d«      ‚|€t        | «      nt        | |«      }|j                  | «      } t        j                  d¬«      5  d| z  |j                  | |d¬«      z  } ddd«       |€t        j                  | «      }n`|j                  |«      }t        | |fd|¬	«      \  } }t        |d¬«      }d|z   |j
                  |fi |¤Žz  }t        j                  | |«      }|j                  ||¬
«      }|�|t        j                  |«      z  }|S # 1 sw Y   Œ°xY w)aÖ  
    Calculate the Shannon entropy/relative entropy of given distribution(s).

    If only probabilities `pk` are given, the Shannon entropy is calculated as
    ``H = -sum(pk * log(pk))``.

    If `qk` is not None, then compute the relative entropy
    ``D = sum(pk * log(pk / qk))``. This quantity is also known
    as the Kullback-Leibler divergence.

    This routine will normalize `pk` and `qk` if they don't sum to 1.

    Parameters
    ----------
    pk : array_like
        Defines the (discrete) distribution. Along each axis-slice of ``pk``,
        element ``i`` is the  (possibly unnormalized) probability of event
        ``i``.
    qk : array_like, optional
        Sequence against which the relative entropy is computed. Should be in
        the same format as `pk`.
    base : float, optional
        The logarithmic base to use, defaults to ``e`` (natural logarithm).
    axis : int, optional
        The axis along which the entropy is calculated. Default is 0.

    Returns
    -------
    S : {float, array_like}
        The calculated entropy.

    Notes
    -----
    Informally, the Shannon entropy quantifies the expected uncertainty
    inherent in the possible outcomes of a discrete random variable.
    For example,
    if messages consisting of sequences of symbols from a set are to be
    encoded and transmitted over a noiseless channel, then the Shannon entropy
    ``H(pk)`` gives a tight lower bound for the average number of units of
    information needed per symbol if the symbols occur with frequencies
    governed by the discrete distribution `pk` [1]_. The choice of base
    determines the choice of units; e.g., ``e`` for nats, ``2`` for bits, etc.

    The relative entropy, ``D(pk|qk)``, quantifies the increase in the average
    number of units of information needed per symbol if the encoding is
    optimized for the probability distribution `qk` instead of the true
    distribution `pk`. Informally, the relative entropy quantifies the expected
    excess in surprise experienced if one believes the true distribution is
    `qk` when it is actually `pk`.

    A related quantity, the cross entropy ``CE(pk, qk)``, satisfies the
    equation ``CE(pk, qk) = H(pk) + D(pk|qk)`` and can also be calculated with
    the formula ``CE = -sum(pk * log(qk))``. It gives the average
    number of units of information needed per symbol if an encoding is
    optimized for the probability distribution `qk` when the true distribution
    is `pk`. It is not computed directly by `entropy`, but it can be computed
    using two calls to the function (see Examples).

    See [2]_ for more information.

    References
    ----------
    .. [1] Shannon, C.E. (1948), A Mathematical Theory of Communication.
           Bell System Technical Journal, 27: 379-423.
           https://doi.org/10.1002/j.1538-7305.1948.tb01338.x
    .. [2] Thomas M. Cover and Joy A. Thomas. 2006. Elements of Information
           Theory (Wiley Series in Telecommunications and Signal Processing).
           Wiley-Interscience, USA.


    Examples
    --------
    The outcome of a fair coin is the most uncertain:

    >>> import numpy as np
    >>> from scipy.stats import entropy
    >>> base = 2  # work in units of bits
    >>> pk = np.array([1/2, 1/2])  # fair coin
    >>> H = entropy(pk, base=base)
    >>> H
    1.0
    >>> H == -np.sum(pk * np.log(pk)) / np.log(base)
    True

    The outcome of a biased coin is less uncertain:

    >>> qk = np.array([9/10, 1/10])  # biased coin
    >>> entropy(qk, base=base)
    0.46899559358928117

    The relative entropy between the fair coin and biased coin is calculated
    as:

    >>> D = entropy(pk, qk, base=base)
    >>> D
    0.7369655941662062
    >>> D == np.sum(pk * np.log(pk/qk)) / np.log(base)
    True

    The cross entropy can be calculated as the sum of the entropy and
    relative entropy`:

    >>> CE = entropy(pk, base=base) + entropy(pk, qk, base=base)
    >>> CE
    1.736965594166206
    >>> CE == -np.sum(pk * np.log(qk)) / np.log(base)
    True

    Nr   ú+`base` must be a positive number or `None`.Úignore)Úinvalidg      ð?T©ÚaxisÚkeepdims)r$   Úxp©r$   )Ú
ValueErrorr   ÚasarrayÚnpÚerrstateÚsumr   Úentrr   ÚdictÚrel_entrÚmathÚlog)Úpkr   Úbaser$   r&   ÚvecÚ
sum_kwargsÚSs           r   r	   r	      s   € ðv Ð˜D AšIÜÐFÓGÐGà " 
Œ˜Ô	´ÀÀBÓ0G€Bà	�‰�B‹€BÜ	�‰˜XÔ	&ñ ;Ø�‰V�b—f‘f˜R d°T�fÓ:Ñ:ˆ÷;à	€zÜ�l‰l˜2Ó‰à�Z‰Z˜‹^ˆÜ" B¨ 8°$¸2Ô>‰ˆˆBÜ˜t¨dÔ3ˆ
Ø�‰V�f�b—f‘f˜RÑ. :Ñ.Ñ.ˆÜ×Ñ˜r 2Ó&ˆØ
�‰ˆs˜ˆÓ€AØÐØ	ŒT�X‰X�d‹^ÑˆØ€H÷;ð ;ús   ÁDÄD&c                óÄ   — | d   }|j                   |   }|j                  dt        j                  t        j                  |«      dz   «      «      }dd|z  cxk  r|k  sy yy)Nr   Úwindow_lengthç      à?r   TF)ÚshapeÚgetr0   ÚfloorÚsqrt)ÚsamplesÚkwargsr$   ÚvaluesÚnr8   s         r   Ú"_differential_entropy_is_too_smallrB   ¢   sb   € Ø�Q‰Z€FØ�‰�TÑ€AØ—J‘J˜Ü#Ÿz™z¬$¯)©)°A«,¸Ñ*<Ó=ó?€Mà��MÑ!Ô% AÒ%Øð &ØØr   c                ó   — | S r   r   r   s    r   r   r   ­   r   r   c                ó   — | fS r   r   r   s    r   r   r   ­   s   € ¸¸€ r   )r   r   r   Úauto)r8   r3   r$   Úmethodc               óx  — t        j                  | «      } t        j                  | |d«      } | j                  d   }|€+t	        j
                  t	        j                  |«      dz   «      }dd|z  cxk  r|k  sn t        d|› d|› d�«      ‚|�|dk  rt        d«      ‚t        j                  | d¬	«      }t        t        t        t        t        d
œ}|j                  «       }||vrdt        |«      › �}t        |«      ‚|dk(  r|dk  rd}n
|dk  rd}nd} ||   ||«      }	|�|	t        j                  |«      z  }	|	S )aV  Given a sample of a distribution, estimate the differential entropy.

    Several estimation methods are available using the `method` parameter. By
    default, a method is selected based the size of the sample.

    Parameters
    ----------
    values : sequence
        Sample from a continuous distribution.
    window_length : int, optional
        Window length for computing Vasicek estimate. Must be an integer
        between 1 and half of the sample size. If ``None`` (the default), it
        uses the heuristic value

        .. math::
            \left \lfloor \sqrt{n} + 0.5 \right \rfloor

        where :math:`n` is the sample size. This heuristic was originally
        proposed in [2]_ and has become common in the literature.
    base : float, optional
        The logarithmic base to use, defaults to ``e`` (natural logarithm).
    axis : int, optional
        The axis along which the differential entropy is calculated.
        Default is 0.
    method : {'vasicek', 'van es', 'ebrahimi', 'correa', 'auto'}, optional
        The method used to estimate the differential entropy from the sample.
        Default is ``'auto'``.  See Notes for more information.

    Returns
    -------
    entropy : float
        The calculated differential entropy.

    Notes
    -----
    This function will converge to the true differential entropy in the limit

    .. math::
        n \to \infty, \quad m \to \infty, \quad \frac{m}{n} \to 0

    The optimal choice of ``window_length`` for a given sample size depends on
    the (unknown) distribution. Typically, the smoother the density of the
    distribution, the larger the optimal value of ``window_length`` [1]_.

    The following options are available for the `method` parameter.

    * ``'vasicek'`` uses the estimator presented in [1]_. This is
      one of the first and most influential estimators of differential entropy.
    * ``'van es'`` uses the bias-corrected estimator presented in [3]_, which
      is not only consistent but, under some conditions, asymptotically normal.
    * ``'ebrahimi'`` uses an estimator presented in [4]_, which was shown
      in simulation to have smaller bias and mean squared error than
      the Vasicek estimator.
    * ``'correa'`` uses the estimator presented in [5]_ based on local linear
      regression. In a simulation study, it had consistently smaller mean
      square error than the Vasiceck estimator, but it is more expensive to
      compute.
    * ``'auto'`` selects the method automatically (default). Currently,
      this selects ``'van es'`` for very small samples (<10), ``'ebrahimi'``
      for moderate sample sizes (11-1000), and ``'vasicek'`` for larger
      samples, but this behavior is subject to change in future versions.

    All estimators are implemented as described in [6]_.

    References
    ----------
    .. [1] Vasicek, O. (1976). A test for normality based on sample entropy.
           Journal of the Royal Statistical Society:
           Series B (Methodological), 38(1), 54-59.
    .. [2] Crzcgorzewski, P., & Wirczorkowski, R. (1999). Entropy-based
           goodness-of-fit test for exponentiality. Communications in
           Statistics-Theory and Methods, 28(5), 1183-1202.
    .. [3] Van Es, B. (1992). Estimating functionals related to a density by a
           class of statistics based on spacings. Scandinavian Journal of
           Statistics, 61-72.
    .. [4] Ebrahimi, N., Pflughoeft, K., & Soofi, E. S. (1994). Two measures
           of sample entropy. Statistics & Probability Letters, 20(3), 225-234.
    .. [5] Correa, J. C. (1995). A new estimator of entropy. Communications
           in Statistics-Theory and Methods, 24(10), 2439-2449.
    .. [6] Noughabi, H. A. (2015). Entropy Estimation Using Numerical Methods.
           Annals of Data Science, 2(2), 231-241.
           https://link.springer.com/article/10.1007/s40745-015-0045-9

    Examples
    --------
    >>> import numpy as np
    >>> from scipy.stats import differential_entropy, norm

    Entropy of a standard normal distribution:

    >>> rng = np.random.default_rng()
    >>> values = rng.standard_normal(100)
    >>> differential_entropy(values)
    1.3407817436640392

    Compare with the true entropy:

    >>> float(norm.entropy())
    1.4189385332046727

    For several sample sizes between 5 and 1000, compare the accuracy of
    the ``'vasicek'``, ``'van es'``, and ``'ebrahimi'`` methods. Specifically,
    compare the root mean squared error (over 1000 trials) between the estimate
    and the true differential entropy of the distribution.

    >>> from scipy import stats
    >>> import matplotlib.pyplot as plt
    >>>
    >>>
    >>> def rmse(res, expected):
    ...     '''Root mean squared error'''
    ...     return np.sqrt(np.mean((res - expected)**2))
    >>>
    >>>
    >>> a, b = np.log10(5), np.log10(1000)
    >>> ns = np.round(np.logspace(a, b, 10)).astype(int)
    >>> reps = 1000  # number of repetitions for each sample size
    >>> expected = stats.expon.entropy()
    >>>
    >>> method_errors = {'vasicek': [], 'van es': [], 'ebrahimi': []}
    >>> for method in method_errors:
    ...     for n in ns:
    ...        rvs = stats.expon.rvs(size=(reps, n), random_state=rng)
    ...        res = stats.differential_entropy(rvs, method=method, axis=-1)
    ...        error = rmse(res, expected)
    ...        method_errors[method].append(error)
    >>>
    >>> for method, errors in method_errors.items():
    ...     plt.loglog(ns, errors, label=method)
    >>>
    >>> plt.legend()
    >>> plt.xlabel('sample size')
    >>> plt.ylabel('RMSE (1000 trials)')
    >>> plt.title('Entropy Estimator Error (Exponential Distribution)')

    r   r9   r   zWindow length (z7) must be positive and less than half the sample size (z).r   r    r'   )Úvasicekúvan esÚcorreaÚebrahimirE   z`method` must be one of rE   é
   rI   iè  rK   rH   )r*   r)   Úmoveaxisr:   r0   r<   r=   r(   ÚsortÚ_vasicek_entropyÚ_van_es_entropyÚ_correa_entropyÚ_ebrahimi_entropyÚlowerÚsetr1   )
r@   r8   r3   r$   rF   rA   Úsorted_dataÚmethodsÚmessageÚress
             r   r
   r
   ¬   sO  € ôh �Z‰Z˜Ó€FÜ�[‰[˜  rÓ*€FØ�‰�RÑ€AàÐÜŸ
™
¤4§9¡9¨Q£<°#Ñ#5Ó6ˆà��MÑ!Ô% AÔ%ÜØ˜m˜_ð -*Ø*+¨¨Bð0ó
ð 	
ð
 Ð˜D AšIÜÐFÓGÐGä—'‘'˜& rÔ*€Kä*Ü(Ü(Ü,Ü'ñ	)€Gð
 �\‰\‹^€FØ�WÑØ,¬S°«\¨NÐ;ˆÜ˜Ó!Ð!à�ÒØ�Š7Ø‰FØ�$ŠYØ‰FàˆFà
ˆ'�&‰/˜+ }Ó
5€CàÐØŒr�v‰v�d‹|Ñˆà€Jr   c                óî   — t        j                  | j                  «      }||d<   t        j                  | ddgf   |«      }t        j                  | ddgf   |«      }t        j                  || |fd¬«      S )z9Pad the data for computing the rolling window difference.r   .r   r'   )r*   Úarrayr:   Úbroadcast_toÚconcatenate)ÚXÚmr:   ÚXlÚXrs        r   Ú_pad_along_last_axisra   l  sj   € ô �H‰H�Q—W‘WÓ€EØ€Eˆ"�IÜ	�‰˜˜3  ˜8™ eÓ	,€BÜ	�‰˜˜3  ˜9™ uÓ	-€BÜ�>‰>˜2˜q "˜+¨BÔ/Ð/r   c                óÔ   — | j                   d   }t        | |«      } | dd|z  d…f   | ddd|z  …f   z
  }t        j                  |d|z  z  |z  «      }t        j                  |d¬«      S )z:Compute the Vasicek estimator as described in [6] Eq. 1.3.r   .r   Néþÿÿÿr'   )r:   ra   r*   r1   Úmean)r]   r^   rA   ÚdifferencesÚlogss        r   rO   rO   v  sp   € à	�‰�‰€AÜ˜Q Ó"€AØ�C˜˜Q™™�K‘. 1 S¨)¨B°©F¨) ^Ñ#4Ñ4€KÜ�6‰6�!�Q�q‘S‘'˜KÑ'Ó(€DÜ�7‰7�4˜bÔ!Ð!r   c                ó†  — | j                   d   }| d|d…f   | dd| …f   z
  }d||z
  z  t        j                  t        j                  |dz   |z  |z  «      d¬«      z  }t        j                  ||dz   «      }|t        j                  d|z  «      z   t        j                  |«      z   t        j                  |dz   «      z
  S )z1Compute the van Es estimator as described in [6].r   .Nr   r'   )r:   r*   r,   r1   Úarange)r]   r^   rA   Ú
differenceÚterm1Úks         r   rP   rP     s¯   € ð 	
�‰�‰€AØ�3˜™�7‘˜a  S q b S ™kÑ)€JØˆq�‰s‰G”b—f‘fœRŸV™V Q q¡S¨!¡G¨jÑ$8Ó9ÀÔCÑC€EÜ
�	‰	�!�Q�q‘SÓ€AØ”2—6‘6˜!˜A™#“;Ñ¤§¡¨£Ñ*¬R¯V©V°A°a±C«[Ñ8Ð8r   c                óÐ  — | j                   d   }t        | |«      } | dd|z  d…f   | ddd|z  …f   z
  }t        j                  d|dz   «      j	                  t
        «      }t        j                  |«      dz  }d|||k     dz
  |z  z   |||k  <   d|||||z
  dz   k\     z
  |z  z   ||||z
  dz   k\  <   t        j                  ||z  ||z  z  «      }t        j                  |d¬«      S )z3Compute the Ebrahimi estimator as described in [6].r   .r   Nrc   r   r'   )	r:   ra   r*   rh   ÚastypeÚfloatÚ	ones_liker1   rd   )r]   r^   rA   re   ÚiÚcirf   s          r   rR   rR   Š  sû   € ð 	
�‰�‰€AÜ˜Q Ó"€Aà�C˜˜Q™™�K‘. 1 S¨)¨B°©F¨) ^Ñ#4Ñ4€Kä
�	‰	�!�Q�q‘SÓ× Ñ ¤Ó'€AÜ	�‰�a‹˜Ñ	€BØ�a˜˜Q™‘i !‘m QÑ&Ñ&€B€qˆA�v�JØ˜a ! A¨¨1©¨Q©¡J¡-Ñ/°Ñ2Ñ2€B€qˆA�‰E�A‰I�~Ñä�6‰6�!�k‘/ R¨!¡VÑ,Ó-€DÜ�7‰7�4˜bÔ!Ð!r   c                óÞ  — | j                   d   }t        | |«      } t        j                  d|dz   «      }t        j                  | |dz   «      dd…df   }||z   }||z   dz
  }t        j                  | d|f   dd¬«      }| d|f   |z
  }t        j
                  ||z  d¬«      }	|t        j
                  |d	z  d¬«      z  }
t        j                  t        j                  |	|
z  «      d¬«       S )
z1Compute the Correa estimator as described in [6].r   r   N.rc   Tr#   r'   r   )r:   ra   r*   rh   rd   r,   r1   )r]   r^   rA   rp   ÚdjÚjÚj0ÚXibarri   ÚnumÚdens              r   rQ   rQ   ›  sß   € ð 	
�‰�‰€AÜ˜Q Ó"€Aä
�	‰	�!�Q�q‘SÓ€AÜ	�‰�A�2�q˜‘sÓ	šA˜t˜GÑ	$€BØ	ˆB‰€AØ	
ˆQ‰�‰€Bä�G‰G�A�c˜2�g‘J R°$Ô7€EØ�3˜�7‘˜eÑ#€JÜ
�&‰&�˜B‘ RÔ
(€CØ
ŒB�F‰F�:˜q‘= rÔ*Ñ
*€CÜ�G‰G”B—F‘F˜3˜s™7“O¨"Ô-Ð-Ð-r   )NNr   )
r2   únp.typing.ArrayLiker   znp.typing.ArrayLike | Noner3   úfloat | Noner$   ÚintÚreturnúnp.number | np.ndarray)r   )r@   ry   r8   z
int | Noner3   rz   r$   r{   rF   Ústrr|   r}   )Ú__doc__Ú
__future__r   r0   Únumpyr*   Úscipyr   Ú_axis_nan_policyr   r   Úscipy._lib._array_apir   Ú__all__r	   rB   r
   ra   rO   rP   rR   rQ   r   r   r   ú<module>r†      s  ðñõ #Û Û Ý ß IÝ 1àÐ,Ð
-€ñ Ùñð ¡¸Øôð .2Ø!%ØðEØ*ðEàðEð ðEð (ò	EóðEóPñ Ù˜1©nØ0ôð !%ØØØñyØðyð ðyð ð	yð
 ðyð ðyð òyó	ðyòx0ò"ò9ò"ó".r   