Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/run_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
strategy:
max-parallel: 4
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
python-version: ["3.9", "3.10", "3.11", "3.12"]
fail-fast: false


Expand Down
6 changes: 5 additions & 1 deletion RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# History of changes

## 1.1.0 (Latest)
## 1.1.1 (Latest)

+ Minor bug fix to ensure that all prediction calls can be carried.

## 1.1.0

+ Updating documentation introduction of the package
+ Added the chi square divergence in GEMINIs: `gemclus.gemini.ChiSquareGEMINI`
Expand Down
2 changes: 1 addition & 1 deletion gemclus/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
__all__ = ['linear', 'mlp', 'sparse', 'data', 'nonparametric', 'gemini', 'tree', 'add_mlcl_constraint',
'__version__', 'DiscriminativeModel']

__version__ = '1.1.0'
__version__ = '1.1.1'
11 changes: 5 additions & 6 deletions gemclus/_base_gemini.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import numpy as np
from sklearn.base import ClusterMixin, BaseEstimator
from sklearn.neural_network._stochastic_optimizers import AdamOptimizer, SGDOptimizer
from sklearn.utils import check_array, check_random_state
from sklearn.utils import check_random_state
from sklearn.utils._param_validation import Interval, StrOptions
from sklearn.utils.validation import check_is_fitted
from sklearn.utils.validation import check_is_fitted, validate_data

from gemclus.gemini import AVAILABLE_GEMINIS
from .gemini._base_loss import _GEMINI
Expand Down Expand Up @@ -230,8 +230,7 @@ def fit(self, X, y=None):
self._validate_params()

# Check that X has the correct shape
X = check_array(X)
X = self._validate_data(X, accept_sparse=True, dtype=np.float64, ensure_min_samples=self.n_clusters)
X = validate_data(self, X, accept_sparse=False, dtype=np.float64, ensure_min_samples=self.n_clusters)

# Fix the random seed
random_state = check_random_state(self.random_state)
Expand Down Expand Up @@ -314,7 +313,7 @@ def predict_proba(self, X):
check_is_fitted(self)

# Input validation
X = check_array(X)
X = validate_data(self, X, accept_sparse=False, dtype=np.float64, reset=False)

y_pred = self._infer(X, retain=False)
return y_pred
Expand All @@ -337,7 +336,7 @@ def predict(self, X):
check_is_fitted(self)

# Input validation
X = check_array(X)
X = validate_data(self, X, accept_sparse=True, dtype=np.float64, reset=False)

return np.argmax(self.predict_proba(X), axis=1)

Expand Down
4 changes: 3 additions & 1 deletion gemclus/linear/_linear_geminis.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sklearn.neural_network._stochastic_optimizers import AdamOptimizer, SGDOptimizer
from sklearn.utils._param_validation import Interval, StrOptions
from sklearn.utils.extmath import softmax
from sklearn.utils.validation import check_is_fitted, check_array
from sklearn.utils.validation import check_is_fitted, check_array, validate_data

from .._base_gemini import DiscriminativeModel
from ..gemini import MMDGEMINI, WassersteinGEMINI
Expand Down Expand Up @@ -579,5 +579,7 @@ def _compute_grads(self, X, y_pred, gradient):


def predict_proba(self, X):
check_is_fitted(self)
X = validate_data(self, X, accept_sparse=False, reset=False)
kernel = self._compute_kernel(X)
return self._infer(kernel)
3 changes: 2 additions & 1 deletion gemclus/sparse/_linear_sparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from sklearn.metrics.pairwise import PAIRWISE_KERNEL_FUNCTIONS
from sklearn.neural_network._stochastic_optimizers import SGDOptimizer
from sklearn.utils._param_validation import Interval, StrOptions
from sklearn.utils.validation import validate_data

from ._base_sparse import _path, check_groups
from ._prox_grad import linear_prox_grad, group_linear_prox_grad
Expand Down Expand Up @@ -151,7 +152,7 @@ def _group_lasso_penalty(self):
return np.linalg.norm(self.W_, axis=1, ord=2).sum()

def fit(self, X, y=None):
self._validate_data(X)
X = validate_data(self, X, accept_sparse=False, dtype=np.float64)
self.groups_ = check_groups(self.groups, X.shape[1]) # Intercept to check that group forms a partition
return super().fit(X, y)

Expand Down
3 changes: 2 additions & 1 deletion gemclus/sparse/_mlp_sparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from sklearn.neural_network._stochastic_optimizers import SGDOptimizer
from sklearn.utils._param_validation import Interval, StrOptions
from sklearn.utils.extmath import softmax
from sklearn.utils.validation import validate_data

from ._base_sparse import _path, check_groups
from ._prox_grad import group_mlp_prox_grad, mlp_prox_grad
Expand Down Expand Up @@ -203,7 +204,7 @@ def _group_lasso_penalty(self):
return np.linalg.norm(self.W_skip_, axis=1, ord=2).sum()

def fit(self, X, y=None):
self._validate_data(X)
X = validate_data(self, X, accept_sparse=False, dtype=np.float64)
self.groups_ = check_groups(self.groups, X.shape[1]) # Intercept to check that group forms a partition
return super().fit(X, y)

Expand Down
7 changes: 3 additions & 4 deletions gemclus/tree/kauri.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from sklearn.metrics.pairwise import PAIRWISE_KERNEL_FUNCTIONS, pairwise_kernels
from sklearn.utils import check_array, check_random_state
from sklearn.utils._param_validation import Interval, StrOptions
from sklearn.utils.validation import check_is_fitted
from sklearn.utils.validation import check_is_fitted, validate_data

from ._utils import find_best_split, gemini_objective, Split
from .._constraints import constraint_params
Expand Down Expand Up @@ -187,8 +187,7 @@ def fit(self, X, y=None):
self._validate_params()

# Check that X has the correct shape
X = check_array(X)
X = self._validate_data(X, accept_sparse=True, dtype=np.float64, ensure_min_samples=self.min_samples_leaf)
X = validate_data(self, X, accept_sparse=False, dtype=np.float64, ensure_min_samples=self.min_samples_leaf)

# Create the random state
random_state = check_random_state(self.random_state)
Expand Down Expand Up @@ -352,7 +351,7 @@ def predict(self, X):
check_is_fitted(self)

# Input validation
X = check_array(X)
X = validate_data(self, X, accept_sparse=False, reset=False)

return self.tree_.predict(X)

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "gemclus"
version = "1.1.0"
version = "1.1.1"
authors = [
{name = "Louis Ohl", email = "louis.ohl@liu.se"},
]
Expand Down
Loading