8000 ENH Add verbose option to SpectralClustering (#17969) · sstalley/scikit-learn@19f6e57 · GitHub
[go: up one dir, main page]

Skip to content

Commit 19f6e57

Browse files
committed
ENH Add verbose option to SpectralClustering (scikit-learn#17969)
1 parent 61ce18f commit 19f6e57

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

sklearn/cluster/_spectral.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ def discretize(vectors, *, copy=True, max_svd_restarts=30, n_iter_max=20,
160160
@_deprecate_positional_args
161161
def spectral_clustering(affinity, *, n_clusters=8, n_components=None,
162162
eigen_solver=None, random_state=None, n_init=10,
163-
eigen_tol=0.0, assign_labels='kmeans'):
163+
eigen_tol=0.0, assign_labels='kmeans',
164+
verbose=False):
164165
"""Apply clustering to a projection of the normalized Laplacian.
165166
166167
In practice Spectral Clustering is very useful when the structure of
@@ -222,6 +223,9 @@ def spectral_clustering(affinity, *, n_clusters=8, n_components=None,
222223
the 'Multiclass spectral clustering' paper referenced below for
223224
more details on the discretization approach.
224225
226+
verbose : bool, default=False
227+
Verbosity mode.
228+
225229
Returns
226230
-------
227231
labels : array of integers, shape: n_samples
@@ -265,10 +269,12 @@ def spectral_clustering(affinity, *, n_clusters=8, n_components=None,
265269
eigen_solver=eigen_solver,
266270
random_state=random_state,
267271
eigen_tol=eigen_tol, drop_first=False)
272+
if verbose:
273+
print('Computing label assignment using %s' % assign_labels)
268274

269275
if assign_labels == 'kmeans':
270276
_, labels, _ = k_means(maps, n_clusters, random_state=random_state,
271-
n_init=n_init)
277+
n_init=n_init, verbose=verbose)
272278
else:
273279
labels = discretize(maps, random_state=random_state)
274280

@@ -381,6 +387,9 @@ class SpectralClustering(ClusterMixin, BaseEstimator):
381387
``-1`` means using all processors. See :term:`Glossary <n_jobs>`
382388
for more details.
383389
390+
verbose : bool, default=False
391+
Verbosity mode.
392+
384393
Attributes
385394
----------
386395
affinity_matrix_ : array-like of shape (n_samples, n_samples)
@@ -443,7 +452,8 @@ class SpectralClustering(ClusterMixin, BaseEstimator):
443452
def __init__(self, n_clusters=8, *, eigen_solver=None, n_components=None,
444453
random_state=None, n_init=10, gamma=1., affinity='rbf',
445454
n_neighbors=10, eigen_tol=0.0, assign_labels='kmeans',
446-
degree=3, coef0=1, kernel_params=None, n_jobs=None):
455+
degree=3, coef0=1, kernel_params=None, n_jobs=None,
456+
verbose=False):
447457
self.n_clusters = n_clusters
448458
self.eigen_solver = eigen_solver
449459
self.n_components = n_components
@@ -458,6 +468,7 @@ def __init__(self, n_clusters=8, *, eigen_solver=None, n_components=None,
458468
self.coef0 = coef0
459469
self.kernel_params = kernel_params
460470
self.n_jobs = n_jobs
471+
self.verbose = verbose
461472

462473
def fit(self, X, y=None):
463474
"""Perform spectral clustering from features, or affinity matrix.
@@ -523,7 +534,8 @@ def fit(self, X, y=None):
523534
random_state=random_state,
524535
n_init=self.n_init,
525536
eigen_tol=self.eigen_tol,
526-
8000 assign_labels=self.assign_labels)
537+
assign_labels=self.assign_labels,
538+
verbose=self.verbose)
527539
return self
528540

529541
def fit_predict(self, X, y=None):

sklearn/cluster/tests/test_spectral.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Testing for Spectral Clustering methods"""
2+
import re
23

34
import numpy as np
45
from scipy import sparse
@@ -248,3 +249,19 @@ def test_n_components():
248249
labels_diff_ncomp = SpectralClustering(n_components=2,
249250
random_state=0).fit(X).labels_
250251
assert not np.array_equal(labels, labels_diff_ncomp)
252+
253+
@pytest.mark.parametrize('assign_labels', ('kmeans', 'discretize'))
254+
def test_verbose(assign_labels, capsys):
255+
# Check verbose mode of KMeans for better coverage.
256+
X, y = make_blobs(n_samples=20, random_state=0,
257+
centers=[[1, 1], [-1, -1]], cluster_std=0.01)
258+
259+
SpectralClustering(n_clusters=2, random_state=42, verbose=1).fit(X)
260+
261+
captured = capsys.readouterr()
262+
263+
assert re.search(r"Computing label assignment using", captured.out)
264+
265+
if assign_labels == "kmeans":
266+
assert re.search(r"Initialization complete", captured.out)
267+
assert re.search(r"Iteration [0-9]+, inertia", captured.out)

0 commit comments

Comments
 (0)
0