Source code for skpoly._bernstein
import numpy as np
from scipy.stats import binom
from ._base import _BasePolynomialBasisTransformer
[docs]
class BernsteinFeatures(_BasePolynomialBasisTransformer):
"""Generate Bernstein polynomial features.
Parameters
----------
degree : int, default=3
Highest degree of the basis.
feature_range : tuple of float, default=(0.0, 1.0)
Interval ``[a, b]`` that bounds the input features.
include_bias : bool, default=False
If ``True``, include the first basis function of each feature.
tensor_product : bool, default=False
If ``True``, append tensor product features for each pair of columns.
Attributes
----------
n_features_in_ : int
Number of features in the input passed to :meth:`fit`.
feature_range_ : tuple of float
Validated feature range.
n_output_features_ : int
Total number of output features generated by :meth:`transform`.
"""
def _setup(self) -> None:
return None
def _scale_to_basis(self, X: np.ndarray) -> np.ndarray:
lower, upper = self.feature_range_
scaled = (X - lower) / (upper - lower)
return np.clip(scaled, 0.0, 1.0, out=scaled)
def _evaluate_basis(self, X: np.ndarray) -> np.ndarray:
if X.shape[1] == 0:
return np.empty((X.shape[0], 0, self.degree + 1), dtype=np.float64)
orders = np.arange(self.degree + 1)
vanders = []
for column in range(X.shape[1]):
probabilities = binom.pmf(orders, self.degree, X[:, [column]])
vanders.append(probabilities.astype(np.float64, copy=False))
return np.stack(vanders, axis=1)
__all__ = ["BernsteinFeatures"]