diff --git a/numpy_questions.py b/numpy_questions.py index 21fcec4b..f01c2eb8 100644 --- a/numpy_questions.py +++ b/numpy_questions.py @@ -40,7 +40,11 @@ def max_index(X): i = 0 j = 0 - # TODO + if not isinstance(X, np.ndarray) or X.ndim != 2: + raise ValueError("Input must be a 2D numpy array.") + + max_array = np.argmax(X) + i, j = np.unravel_index(max_array, X.shape) return i, j @@ -62,6 +66,13 @@ def wallis_product(n_terms): pi : float The approximation of order `n_terms` of pi using the Wallis product. """ + if not isinstance(n_terms, int) or n_terms < 0: + raise ValueError("n_terms must be a non-negative integer.") + if n_terms == 0: + return 1.0 + k = np.arange(1, n_terms + 1) + product = np.prod((4 * k**2) / (4 * k**2 - 1)) + pi_approximation = 2 * product # XXX : The n_terms is an int that corresponds to the number of # terms in the product. For example 10000. - return 0. + return pi_approximation diff --git a/sklearn_questions.py b/sklearn_questions.py index 948c2e54..8fc4ee8f 100644 --- a/sklearn_questions.py +++ b/sklearn_questions.py @@ -20,56 +20,100 @@ `pydocstyle` that you can also call at the root of the repo. """ import numpy as np -from sklearn.base import BaseEstimator -from sklearn.base import ClassifierMixin -from sklearn.utils.validation import check_X_y -from sklearn.utils.validation import check_array -from sklearn.utils.validation import check_is_fitted -from sklearn.utils.validation import validate_data +from sklearn.base import BaseEstimator, ClassifierMixin +from sklearn.metrics.pairwise import pairwise_distances from sklearn.utils.multiclass import check_classification_targets +from sklearn.utils.validation import check_is_fitted, validate_data class OneNearestNeighbor(ClassifierMixin, BaseEstimator): - "OneNearestNeighbor classifier." + """OneNearestNeighbor classifier. + + Parameters + ---------- + None + + Attributes + ---------- + classes_ : ndarray of shape (n_classes,) + The unique class labels observed during fitting. + n_features_in_ : int + Number of features seen during ``fit``. + X_ : ndarray of shape (n_samples, n_features) + The training input samples. + y_ : ndarray of shape (n_samples,) + The target values corresponding to training samples. + """ def __init__(self): # noqa: D107 pass def fit(self, X, y): - """Write docstring. - - And describe parameters + """Fit the OneNearestNeighbor classifier from the training dataset. + + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + Training data. + y : ndarray of shape (n_samples,) + Target values. + + Returns + ------- + self : OneNearestNeighbor + The fitted estimator. """ - X, y = check_X_y(X, y) + X, y = validate_data(self, X=X, y=y) check_classification_targets(y) self.classes_ = np.unique(y) - self.n_features_in_ = X.shape[1] - # XXX fix + self.X_ = X + self.y_ = y + return self def predict(self, X): - """Write docstring. + """Predict the class labels for the provided data. - And describe parameters + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + Test samples. + + Returns + ------- + y_pred : ndarray of shape (n_samples,) + Class labels for each data sample. """ check_is_fitted(self) - X = check_array(X) + X = validate_data(self, X=X, reset=False) y_pred = np.full( shape=len(X), fill_value=self.classes_[0], dtype=self.classes_.dtype ) + distances = pairwise_distances(X, self.X_, metric='euclidean') + closest_indices = np.argmin(distances, axis=1) + y_pred[:] = self.y_[closest_indices] - # XXX fix return y_pred def score(self, X, y): - """Write docstring. - - And describe parameters + """Return the mean accuracy on the given test data and labels. + + Parameters + ---------- + X : array-like of shape (n_samples, n_features) + Test samples. + y : array-like of shape (n_samples,) + True labels for X. + + Returns + ------- + score : float + Mean accuracy of self.predict(X) with respect to y. """ - X, y = check_X_y(X, y) + X, y = validate_data(self, X=X, y=y, reset=False) y_pred = self.predict(X) + y_score = (y_pred == y).sum() / len(y) - # XXX fix - return y_pred.sum() + return y_score