
    0Phe                     *   d dl Z d dlmZmZ d dlZddlmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZmZmZm Z  dd
l!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+  ej,        d          Z-d Z. G d dee
e	e          Z/dS )    N)IntegralReal   )BaseEstimatorMetaEstimatorMixinMultiOutputMixinRegressorMixin_fit_contextclone)ConvergenceWarning)check_consistent_lengthcheck_random_stateget_tags)Bunch)
HasMethodsIntervalOptions
RealNotInt
StrOptions)MetadataRouterMethodMapping_raise_for_params_routing_enabledprocess_routing)sample_without_replacement)_check_method_params_check_sample_weight_deprecate_positional_argscheck_is_fittedhas_fit_parametervalidate_data   )LinearRegressionc           
      p   | t          |          z  }t          t          d|z
            }t          t          d||z  z
            }|dk    rdS |dk    rt          d          S t          t          t	          j        t	          j        |          t	          j        |          z                                S )a  Determine number trials such that at least one outlier-free subset is
    sampled for the given inlier/outlier ratio.

    Parameters
    ----------
    n_inliers : int
        Number of inliers in the data.

    n_samples : int
        Total number of samples in the data.

    min_samples : int
        Minimum number of samples chosen randomly from original data.

    probability : float
        Probability (confidence) that one outlier-free sample is generated.

    Returns
    -------
    trials : int
        Number of trials.

    r"   r   inf)floatmax_EPSILONabsnpceillog)	n_inliers	n_samplesmin_samplesprobabilityinlier_rationomdenoms          \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/linear_model/_ransac.py_dynamic_max_trialsr5   0   s    0 uY///L
hK
(
(C!lK7788E
axxqzzU||uRWRVC[[26%==899::;;;    c                   |    e Zd ZU dZ eg d          dg eeddd           eeddd          dg eeddd          dge	dge	dg eeddd           e
eej        h          g eeddd           e
eej        h          g eeddd           e
eej        h          g eeddd          g eeddd          g ed	d
h          e	gdgdZeed<   	 ddddddej        ej        ej        dd	dddZ ed           ed          ddd                        Zd Zd Zd Z fdZ xZS )RANSACRegressora  RANSAC (RANdom SAmple Consensus) algorithm.

    RANSAC is an iterative algorithm for the robust estimation of parameters
    from a subset of inliers from the complete data set.

    Read more in the :ref:`User Guide <ransac_regression>`.

    Parameters
    ----------
    estimator : object, default=None
        Base estimator object which implements the following methods:

        * `fit(X, y)`: Fit model to given training data and target values.
        * `score(X, y)`: Returns the mean accuracy on the given test data,
          which is used for the stop criterion defined by `stop_score`.
          Additionally, the score is used to decide which of two equally
          large consensus sets is chosen as the better one.
        * `predict(X)`: Returns predicted values using the linear model,
          which is used to compute residual error using loss function.

        If `estimator` is None, then
        :class:`~sklearn.linear_model.LinearRegression` is used for
        target values of dtype float.

        Note that the current implementation only supports regression
        estimators.

    min_samples : int (>= 1) or float ([0, 1]), default=None
        Minimum number of samples chosen randomly from original data. Treated
        as an absolute number of samples for `min_samples >= 1`, treated as a
        relative number `ceil(min_samples * X.shape[0])` for
        `min_samples < 1`. This is typically chosen as the minimal number of
        samples necessary to estimate the given `estimator`. By default a
        :class:`~sklearn.linear_model.LinearRegression` estimator is assumed and
        `min_samples` is chosen as ``X.shape[1] + 1``. This parameter is highly
        dependent upon the model, so if a `estimator` other than
        :class:`~sklearn.linear_model.LinearRegression` is used, the user must
        provide a value.

    residual_threshold : float, default=None
        Maximum residual for a data sample to be classified as an inlier.
        By default the threshold is chosen as the MAD (median absolute
        deviation) of the target values `y`. Points whose residuals are
        strictly equal to the threshold are considered as inliers.

    is_data_valid : callable, default=None
        This function is called with the randomly selected data before the
        model is fitted to it: `is_data_valid(X, y)`. If its return value is
        False the current randomly chosen sub-sample is skipped.

    is_model_valid : callable, default=None
        This function is called with the estimated model and the randomly
        selected data: `is_model_valid(model, X, y)`. If its return value is
        False the current randomly chosen sub-sample is skipped.
        Rejecting samples with this function is computationally costlier than
        with `is_data_valid`. `is_model_valid` should therefore only be used if
        the estimated model is needed for making the rejection decision.

    max_trials : int, default=100
        Maximum number of iterations for random sample selection.

    max_skips : int, default=np.inf
        Maximum number of iterations that can be skipped due to finding zero
        inliers or invalid data defined by ``is_data_valid`` or invalid models
        defined by ``is_model_valid``.

        .. versionadded:: 0.19

    stop_n_inliers : int, default=np.inf
        Stop iteration if at least this number of inliers are found.

    stop_score : float, default=np.inf
        Stop iteration if score is greater equal than this threshold.

    stop_probability : float in range [0, 1], default=0.99
        RANSAC iteration stops if at least one outlier-free set of the training
        data is sampled in RANSAC. This requires to generate at least N
        samples (iterations)::

            N >= log(1 - probability) / log(1 - e**m)

        where the probability (confidence) is typically set to high value such
        as 0.99 (the default) and e is the current fraction of inliers w.r.t.
        the total number of samples.

    loss : str, callable, default='absolute_error'
        String inputs, 'absolute_error' and 'squared_error' are supported which
        find the absolute error and squared error per sample respectively.

        If ``loss`` is a callable, then it should be a function that takes
        two arrays as inputs, the true and predicted value and returns a 1-D
        array with the i-th value of the array corresponding to the loss
        on ``X[i]``.

        If the loss on a sample is greater than the ``residual_threshold``,
        then this sample is classified as an outlier.

        .. versionadded:: 0.18

    random_state : int, RandomState instance, default=None
        The generator used to initialize the centers.
        Pass an int for reproducible output across multiple function calls.
        See :term:`Glossary <random_state>`.

    Attributes
    ----------
    estimator_ : object
        Final model fitted on the inliers predicted by the "best" model found
        during RANSAC sampling (copy of the `estimator` object).

    n_trials_ : int
        Number of random selection trials until one of the stop criteria is
        met. It is always ``<= max_trials``.

    inlier_mask_ : bool array of shape [n_samples]
        Boolean mask of inliers classified as ``True``.

    n_skips_no_inliers_ : int
        Number of iterations skipped due to finding zero inliers.

        .. versionadded:: 0.19

    n_skips_invalid_data_ : int
        Number of iterations skipped due to invalid data defined by
        ``is_data_valid``.

        .. versionadded:: 0.19

    n_skips_invalid_model_ : int
        Number of iterations skipped due to an invalid model defined by
        ``is_model_valid``.

        .. versionadded:: 0.19

    n_features_in_ : int
        Number of features seen during :term:`fit`.

        .. versionadded:: 0.24

    feature_names_in_ : ndarray of shape (`n_features_in_`,)
        Names of features seen during :term:`fit`. Defined only when `X`
        has feature names that are all strings.

        .. versionadded:: 1.0

    See Also
    --------
    HuberRegressor : Linear regression model that is robust to outliers.
    TheilSenRegressor : Theil-Sen Estimator robust multivariate regression model.
    SGDRegressor : Fitted by minimizing a regularized empirical loss with SGD.

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/RANSAC
    .. [2] https://www.sri.com/wp-content/uploads/2021/12/ransac-publication.pdf
    .. [3] https://bmva-archive.org.uk/bmvc/2009/Papers/Paper355/Paper355.pdf

    Examples
    --------
    >>> from sklearn.linear_model import RANSACRegressor
    >>> from sklearn.datasets import make_regression
    >>> X, y = make_regression(
    ...     n_samples=200, n_features=2, noise=4.0, random_state=0)
    >>> reg = RANSACRegressor(random_state=0).fit(X, y)
    >>> reg.score(X, y)
    0.9885...
    >>> reg.predict(X[:1,])
    array([-31.9417...])

    For a more detailed example, see
    :ref:`sphx_glr_auto_examples_linear_model_plot_ransac.py`
    )fitscorepredictNr"   left)closedr   bothabsolute_errorsquared_errorrandom_state)	estimatorr/   residual_thresholdis_data_validis_model_valid
max_trials	max_skipsstop_n_inliers
stop_scorestop_probabilitylossrA   _parameter_constraintsd   gGz?)r/   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rA   c                    || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        d S N)rB   r/   rC   rD   rE   rF   rG   rH   rI   rJ   rA   rK   )selfrB   r/   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rA   s                r4   __init__zRANSACRegressor.__init__!  sc      #&"4*,$",$ 0(			r6   F)prefer_skip_nested_validationz1.7)version)sample_weightc          	      \   t          || d           t          dd          }t          d          }t          | ||||f          \  }}t          ||           | j        t          | j                  }nt                      }| j        5t          |t                    st          d          |j
        d	         d	z   }nOd
| j        cxk     rd	k     r+n n(t          j        | j        |j
        d
         z            }n| j        d	k    r| j        }||j
        d
         k    rt          d|j
        d
         z            | j        <t          j        t          j        |t          j        |          z
                      }	n| j        }	| j        dk    r|j        d	k    rd }
n=d }
n9| j        dk    r|j        d	k    rd }
nd }
nt%          | j                  r| j        }
t'          | j                  }	 |                    |           n# t          $ r Y nw xY wt-          |d          }t/          |          j        }||st          d|z            |||d<   t3                      rt5          | dfi |}nEt7                      }t7          i i i           |_        |t9          ||          }d|i|j        _        d	}t          j         }d}d}d}d}d
| _        d
| _         d
| _!        |j
        d
         }t          j"        |          }d
| _#        | j$        }| j#        |k     r| xj#        d	z  c_#        | j        | j         z   | j!        z   | j%        k    rntM          |||          }||         }||         }| j'        '| '                    ||          s| xj         d	z  c_         tQ          ||j        j        |          } |j        ||fi | | j)        (| )                    |||          s| xj!        d	z  c_!        |*                    |          } |
||          }||	k    }t          j+        |          }||k     r| xj        d	z  c_        ;||         } ||          }!||          }"tQ          ||j        j,        |           }# |j,        |!|"fi |#}$||k    r|$|k     r|}|$}|}|!}|"}| }t[          |t]          |||| j/                            }|| j0        k    s|| j1        k    rn| j#        |k     |>| j        | j         z   | j!        z   | j%        k    rt          d          t          d          | j        | j         z   | j!        z   | j%        k    rte          j3        dth                     tQ          ||j        j        |          }% |j        ||fi |% || _5        || _6        | S )a
  Fit estimator using RANSAC algorithm.

        Parameters
        ----------
        X : {array-like, sparse matrix} of shape (n_samples, n_features)
            Training data.

        y : array-like of shape (n_samples,) or (n_samples, n_targets)
            Target values.

        sample_weight : array-like of shape (n_samples,), default=None
            Individual weights for each sample
            raises error if sample_weight is passed and estimator
            fit method does not support it.

            .. versionadded:: 0.18

        **fit_params : dict
            Parameters routed to the `fit` method of the sub-estimator via the
            metadata routing API.

            .. versionadded:: 1.5

                Only available if
                `sklearn.set_config(enable_metadata_routing=True)` is set. See
                :ref:`Metadata Routing User Guide <metadata_routing>` for more
                details.

        Returns
        -------
        self : object
            Fitted `RANSACRegressor` estimator.

        Raises
        ------
        ValueError
            If no valid consensus set could be found. This occurs if
            `is_data_valid` and `is_model_valid` return False for all
            `max_trials` randomly chosen sub-samples.
        r9   csrF)accept_sparseensure_all_finite)	ensure_2d)validate_separatelyNzR`min_samples` needs to be explicitly set when estimator is not a LinearRegression.r"   r   zG`min_samples` may not be larger than number of samples: n_samples = %d.r?   c                 0    t          j        | |z
            S rO   )r*   r)   y_truey_preds     r4   <lambda>z%RANSACRegressor.fit.<locals>.<lambda>  s    rvfvo7N7N r6   c                 X    t          j        t          j        | |z
            d          S )Nr"   axis)r*   sumr)   r\   s     r4   r_   z%RANSACRegressor.fit.<locals>.<lambda>  s*    rvF6F?++!8 8 8 r6   r@   c                     | |z
  dz  S )Nr    r\   s     r4   r_   z%RANSACRegressor.fit.<locals>.<lambda>  s    A7M r6   c                 :    t          j        | |z
  dz  d          S )Nr   r"   ra   )r*   rc   r\   s     r4   r_   z%RANSACRegressor.fit.<locals>.<lambda>  s%    rvf_*8 8 8 r6   )rA   rT   z[%s does not support sample_weight. Sample weights are only used for the calibration itself.)r9   r;   r:   )paramsindiceszRANSAC skipped more iterations than `max_skips` without finding a valid consensus set. Iterations were skipped because each randomly chosen sub-sample failed the passing criteria. See estimator attributes for diagnostics (n_skips*).zRANSAC could not find a valid consensus set. All `max_trials` iterations were skipped because each randomly chosen sub-sample failed the passing criteria. See estimator attributes for diagnostics (n_skips*).zRANSAC found a valid consensus set but exited early due to skipping more iterations than `max_skips`. See estimator attributes for diagnostics (n_skips*).)7r   dictr!   r   rB   r   r#   r/   
isinstance
ValueErrorshaper*   r+   rC   medianr)   rK   ndimcallabler   rA   
set_paramsr    type__name__r   r   r   r   r9   r%   n_skips_no_inliers_n_skips_invalid_data_n_skips_invalid_model_arange	n_trials_rF   rG   r   rD   r   rE   r;   rc   r:   minr5   rJ   rH   rI   warningswarnr   
estimator_inlier_mask_)&rP   XyrT   
fit_paramscheck_X_paramscheck_y_paramsrB   r/   rC   loss_functionrA   estimator_fit_has_sample_weightestimator_namerouted_paramsn_inliers_best
score_bestinlier_mask_bestX_inlier_besty_inlier_bestinlier_best_idxs_subsetr.   sample_idxsrF   subset_idxsX_subsety_subsetfit_params_subsetr^   residuals_subsetinlier_mask_subsetn_inliers_subsetinlier_idxs_subsetX_inlier_subsety_inlier_subsetscore_params_inlier_subsetscore_subsetfit_params_best_idxs_subsets&                                         r4   r9   zRANSACRegressor.fit>  sl   h 	*dE222EUKKK...!Q^^,L
 
 
1 	 1%%%>%dn--II(**I#i)9::  1   '!*q.KK!%%%%A%%%%%'$"2QWQZ"?@@KK""*K##.12=  
 "*!#26!bill2B+C+C!D!D!%!89(((v{{ N N! ! Y/))v{{ M M! ! di   	& IM)$*;<<	  l ;;;; 	 	 	D	 +<I*W*W'i1$-L$+,   $*7J' 	O+D%FF:FFMM!GGM&+Bb&I&I&IM#( 4]A F F/>.N'+fW
"&#$ %&"&'# GAJ	i	**_
nz))NNaNN (,--. 	 
  5;\  K ~H~H !-d6H6H(7 7- **a/** !5-15{! ! !
 IM(HBB0ABBB ".t7J7J8X8 8. ++q0++ &&q))F,}Q77 "25G!G!v&899  .00((A-(( "--?!@ 23O 23O *>-17AS* * *&
 +9?  - L  >11lZ6O6O .N%J1+M+M&8##"I{D<Q  J !444
do8U8Uw nz))| #(,--. 	 
 !/   !L   (,--. 	 
 3
 '   ';m-1;R'
 '
 '
# 		m]RR6QRRR#,s   4H 
HHc                     t          |            t          | |ddd          }t          || d           t                      rt	          | dfi |j        d         }ni } | j        j        |fi |S )a   Predict using the estimated model.

        This is a wrapper for `estimator_.predict(X)`.

        Parameters
        ----------
        X : {array-like or sparse matrix} of shape (n_samples, n_features)
            Input data.

        **params : dict
            Parameters routed to the `predict` method of the sub-estimator via
            the metadata routing API.

            .. versionadded:: 1.5

                Only available if
                `sklearn.set_config(enable_metadata_routing=True)` is set. See
                :ref:`Metadata Routing User Guide <metadata_routing>` for more
                details.

        Returns
        -------
        y : array, shape = [n_samples] or [n_samples, n_targets]
            Returns predicted values.
        FTrX   rW   resetr;   )r   r!   r   r   r   rB   r{   r;   )rP   r}   rg   predict_paramss       r4   r;   zRANSACRegressor.predicta  s    4 	#
 
 
 	&$	222 	 ,T9GGGGQNN  N&t&q;;N;;;r6   c                     t          |            t          | |ddd          }t          || d           t                      rt	          | dfi |j        d         }ni } | j        j        ||fi |S )a6  Return the score of the prediction.

        This is a wrapper for `estimator_.score(X, y)`.

        Parameters
        ----------
        X : (array-like or sparse matrix} of shape (n_samples, n_features)
            Training data.

        y : array-like of shape (n_samples,) or (n_samples, n_targets)
            Target values.

        **params : dict
            Parameters routed to the `score` method of the sub-estimator via
            the metadata routing API.

            .. versionadded:: 1.5

                Only available if
                `sklearn.set_config(enable_metadata_routing=True)` is set. See
                :ref:`Metadata Routing User Guide <metadata_routing>` for more
                details.

        Returns
        -------
        z : float
            Score of the prediction.
        FTr   r:   )r   r!   r   r   r   rB   r{   r:   )rP   r}   r~   rg   score_paramss        r4   r:   zRANSACRegressor.score  s    : 	#
 
 
 	&$000 	*4CCFCCMgVLLL$t$Q::\:::r6   c                 .   t          | j        j                                      | j        t                                          dd                              dd                              dd                              dd                    }|S )aj  Get metadata routing of this object.

        Please check :ref:`User Guide <metadata_routing>` on how the routing
        mechanism works.

        .. versionadded:: 1.5

        Returns
        -------
        routing : MetadataRouter
            A :class:`~sklearn.utils.metadata_routing.MetadataRouter` encapsulating
            routing information.
        )ownerr9   )callercalleer:   r;   )rB   method_mapping)r   	__class__rr   addrB   r   )rP   routers     r4   get_metadata_routingz$RANSACRegressor.get_metadata_routing  s      dn&=>>>BBn(??SeS,,SgS..SS00S	)S44 C 
 
 r6   c                     t                                                      }| j        d|j        _        n(t          | j                  j        j        |j        _        |S )NT)super__sklearn_tags__rB   
input_tagssparser   )rP   tagsr   s     r4   r   z RANSACRegressor.__sklearn_tags__  sL    ww''))>!%)DO""%-dn%=%=%H%ODO"r6   rO   )rr   
__module____qualname____doc__r   r   r   r   r   ro   r   r*   r%   r   rL   ri   __annotations__rQ   r
   r   r9   r;   r:   r   r   __classcell__)r   s   @r4   r8   r8   R   s        k k\ !j!<!<!<==tDHXq$v666HZAf555

  (xafEEEtL"D)#T*HXq$v666GD26(##

 HXq$v666GD26(##

 HXq$v666GD26(##
  xdD@@@A%XdAq@@@A-?@@(K'(3$ $D   <  &v6    : \&+    ...)- Y Y Y Y /. Yv,< ,< ,<\,; ,; ,;\  0        r6   r8   )0ry   numbersr   r   numpyr*   baser   r   r   r	   r
   r   
exceptionsr   utilsr   r   r   utils._bunchr   utils._param_validationr   r   r   r   r   utils.metadata_routingr   r   r   r   r   utils.randomr   utils.validationr   r   r   r   r    r!   _baser#   spacingr(   r5   r8   re   r6   r4   <module>r      s3    " " " " " " " "                    , + + + + + I I I I I I I I I I                                       6 5 5 5 5 5                $ # # # # #2:a==< < <DI
 I
 I
 I
 I
	I
 I
 I
 I
 I
r6   