r"""
Weibull cumulative distribution fit with three parameters, of the form
:math:`F(t) = 1 - e^{-\left( \frac{t - \mu}{\beta} \right)^{\alpha}}`.
The data :math:`F_k` must be positive. Unlike the other estimations,
which are sorted according to their independent variable, this one
expects the dependent variable to be sorted in ascending order.
.. todo::
Add proper handling of colinear inputs (and other singular matrix cases).
.. todo::
Add tests.
.. todo::
Add nan_policy argument.
.. todo::
Add PEP8 check to formal tests.
.. todo::
Add axis parameter.
"""
from numpy import array, expm1, log
from .util import preprocess_pair
from .exp import exp_fit
__all__ = ['weibull_cdf_fit']
[docs]def weibull_cdf_fit(x, y, sorted=True):
r"""
Weibull CDF fit of the form
:math:`F(t) = 1 - e^{-\left( \frac{t - \mu}{\beta} \right)^{\alpha}}`.
This implementation is based on a transformation that makes the
approximate solution to integral equation :eq:`exp-eq`, presented in
:ref:`ref-reei` applicable.
Parameters
----------
x : array-like
The x-values of the data points, :math:`t` in the equation. The
fit will be performed on a raveled version of this array.
y : array-like
The y-values of the data points corresponding to `x`,
:math:`F(t)` in the equation. Must be the same size as `x`. The
fit will be performed on a raveled version of this array.
sorted : bool
Set to True if `y` is already monotonically increasing or
decreasing. If False, `y` will be sorted into increasing order,
and `x` will be sorted along with it.
Return
------
alpha, beta, mu : ~numpy.ndarray
A 3-element array of optimized fitting parameters. The first
parameter is the shape, the second the scale, and the third the
mean of the PDF.
Notes
-----
The x- and y- data is conventionally transposed from what the final
optimization expects. `y` is expected to be ascending or descending,
not `x`.
References
----------
- [Jacquelin]_ "\ :ref:`ref-reei`\ ", :ref:`pp. 19-20. <reei2-sec3>`
"""
F, y = preprocess_pair(y, x, sorted)
x = log(-log(1.0 - F))
a, b, c = exp_fit(x, y, sorted=True)
out = array([1.0 / c, b, a])
return out
[docs]def model(x, alpha, beta, mu):
r"""
Compute :math:`y = 1 - e^{-\left( \frac{x - \mu}{\beta} \right)^{\alpha}}`.
Parameters
----------
x : array-like
The value of the model will be the same shape as the input.
alpha : float
The shape of the distribution.
beta : float
The scale of the distribution.
mu : float
The mean of the distribution.
Return
------
y : array-like
An array of the same shape as `x`, containing the model
computed for the given parameters.
"""
# TODO: Check if in-place operations are really faster here
return -expm1(-((x - mu) / beta)**alpha)
weibull_cdf_fit.model = model