From cefbbe66e4d47d4514bdd3cf30cc6499a01266e1 Mon Sep 17 00:00:00 2001 From: hugovandenbussche01 Date: Tue, 10 Nov 2026 16:16:57 +0100 Subject: [PATCH 1/3] Completed numpy_questions.py and sklearn_questions.py --- numpy_questions.py | 14 ++++++++++-- sklearn_questions.py | 53 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/numpy_questions.py b/numpy_questions.py index 21fcec4b..f4a1558e 100644 --- a/numpy_questions.py +++ b/numpy_questions.py @@ -40,7 +40,10 @@ def max_index(X): i = 0 j = 0 - # TODO + if not isinstance(X, np.ndarray) or X.ndim != 2: + raise ValueError('X is not an np.array or is not of dimension 2D.') + + i, j = np.unravel_index(np.argmax[X], X.shape) return i, j @@ -64,4 +67,11 @@ def wallis_product(n_terms): """ # XXX : The n_terms is an int that corresponds to the number of # terms in the product. For example 10000. - return 0. + + if n_terms == 0: + return 1.0 + + n = np.arange(1, n_terms + 1) + product = np.prod((4 * n**2) / (4 * n**2 - 1)) + + return float(2 * product) diff --git a/sklearn_questions.py b/sklearn_questions.py index f65038c6..dfba2bd1 100644 --- a/sklearn_questions.py +++ b/sklearn_questions.py @@ -29,15 +29,25 @@ class OneNearestNeighbor(BaseEstimator, ClassifierMixin): - "OneNearestNeighbor classifier." + """OneNearestNeighbor classifier.""" def __init__(self): # noqa: D107 pass def fit(self, X, y): - """Write docstring. - - And describe parameters + """Fit the model on the training set (X training data, y target value). + + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + The input samples. + y : ndarray of shape (n_samples,) + The target values. + + Returns + ------- + self : object + the fitted estimator """ X, y = check_X_y(X, y) check_classification_targets(y) @@ -45,12 +55,22 @@ def fit(self, X, y): self.n_features_in_ = X.shape[1] # XXX fix + self.X_fit_ = X + self.y_fit_ = y return self def predict(self, X): - """Write docstring. + """Predict the class label for each sample in X. + + Parameters + ---------- + X : ndarray of shape (n_samples, n_features) + The input samples. - And describe parameters + Returns + -------- + y_pred : ndarray of shape(n_samples,) + The predicted class labels """ check_is_fitted(self) X = check_array(X) @@ -60,15 +80,28 @@ def predict(self, X): ) # XXX fix + distances = np.linalg.norm(self.X_fit_[:, np.newaxis, :] - X, axis=2) + nearestneighbor = np.argmin(distances, axis=1) + y_pred = self.y_fit_[nearestneighbor] 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 : ndarray (n_samples, n_features) + Test sample + y : ndarray (n_samples,) + True labels of X + + Returns + ------- + score : float + Mean accuracy of predictions of X with respect to y """ X, y = check_X_y(X, y) y_pred = self.predict(X) # XXX fix - return y_pred.sum() + return np.mean(y_pred == y) From 6386fb7a2a3a175d12ece00cdd35e29af15cdff2 Mon Sep 17 00:00:00 2001 From: hugovandenbussche01 Date: Tue, 10 Nov 2026 16:50:00 +0100 Subject: [PATCH 2/3] Hugo Vandenbussche assignment --- numpy_questions.py | 2 +- sklearn_questions.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/numpy_questions.py b/numpy_questions.py index f4a1558e..f16be635 100644 --- a/numpy_questions.py +++ b/numpy_questions.py @@ -43,7 +43,7 @@ def max_index(X): if not isinstance(X, np.ndarray) or X.ndim != 2: raise ValueError('X is not an np.array or is not of dimension 2D.') - i, j = np.unravel_index(np.argmax[X], X.shape) + i, j = np.unravel_index(np.argmax(X), X.shape) return i, j diff --git a/sklearn_questions.py b/sklearn_questions.py index 2be42180..6d20d26a 100644 --- a/sklearn_questions.py +++ b/sklearn_questions.py @@ -50,7 +50,7 @@ def fit(self, X, y): self : object the fitted estimator """ - X, y = check_X_y(X, y) + X, y = self.validate_data(X, y, accept_sparse=False) check_classification_targets(y) self.classes_ = np.unique(y) self.n_features_in_ = X.shape[1] @@ -70,11 +70,11 @@ def predict(self, X): Returns -------- - y_pred : ndarray of shape(n_samples,) + y_pred : ndarray of shape (n_samples,) The predicted class labels """ check_is_fitted(self) - X = check_array(X) + X = self.validate_data(X, reset=False) y_pred = np.full( shape=len(X), fill_value=self.classes_[0], dtype=self.classes_.dtype @@ -91,9 +91,9 @@ def score(self, X, y): Parameters ---------- - X : ndarray (n_samples, n_features) + X : ndarray of shape (n_samples, n_features) Test sample - y : ndarray (n_samples,) + y : ndarray of shape (n_samples,) True labels of X Returns @@ -101,7 +101,7 @@ def score(self, X, y): score : float Mean accuracy of predictions of X with respect to y """ - X, y = check_X_y(X, y) + X, y = self.validate_data(X, y, accept_sparse=False) y_pred = self.predict(X) # XXX fix From 019153b80e88bcf619624947247c0cf37fa7a038 Mon Sep 17 00:00:00 2001 From: hugovandenbussche01 Date: Tue, 10 Nov 2026 17:14:50 +0100 Subject: [PATCH 3/3] Hugo Vandenbussche assignment --- sklearn_questions.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/sklearn_questions.py b/sklearn_questions.py index 6d20d26a..7c3e5fdf 100644 --- a/sklearn_questions.py +++ b/sklearn_questions.py @@ -25,7 +25,6 @@ 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.utils.multiclass import check_classification_targets @@ -50,12 +49,11 @@ def fit(self, X, y): self : object the fitted estimator """ - X, y = self.validate_data(X, y, accept_sparse=False) + X, y = check_X_y(X, y) check_classification_targets(y) self.classes_ = np.unique(y) self.n_features_in_ = X.shape[1] - # XXX fix self.X_fit_ = X self.y_fit_ = y return self @@ -74,14 +72,20 @@ def predict(self, X): The predicted class labels """ check_is_fitted(self) - X = self.validate_data(X, reset=False) + X = check_array(X) + if X.shape[1] != self.n_features_in_: + raise ValueError( + f"X has {X.shape[1]} features, but OneNearestNeighbor " + f"is expecting {self.n_features_in_} features as input." + ) y_pred = np.full( shape=len(X), fill_value=self.classes_[0], dtype=self.classes_.dtype ) - # XXX fix - distances = np.linalg.norm(self.X_fit_[:, np.newaxis, :] - X, axis=2) + distances = np.linalg.norm( + X[:, np.newaxis, :] - self.X_fit_[np.newaxis, :, :], axis=2 + ) nearestneighbor = np.argmin(distances, axis=1) y_pred = self.y_fit_[nearestneighbor] return y_pred @@ -101,8 +105,7 @@ def score(self, X, y): score : float Mean accuracy of predictions of X with respect to y """ - X, y = self.validate_data(X, y, accept_sparse=False) + X, y = check_X_y(X, y) y_pred = self.predict(X) - # XXX fix return np.mean(y_pred == y)