Skip to content

Commit cee5ebb

Browse files
committed
Clustering: Fixed tests
1 parent 3e8826f commit cee5ebb

File tree

4 files changed

+30
-48
lines changed

4 files changed

+30
-48
lines changed

Orange/tests/test_clustering_dbscan.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ def test_predict_numpy(self):
2828
dbscan = DBSCAN()
2929
c = dbscan(self.iris)
3030
X = self.iris.X[::20]
31-
p = c(X)
31+
p = c.predict(X)

Orange/tests/test_clustering_kmeans.py

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def setUpClass(cls):
1818
def test_kmeans(self):
1919
kmeans = KMeans(n_clusters=2)
2020
c = kmeans(self.iris)
21-
X = self.iris.X[:20]
21+
X = self.iris[:20]
2222
p = c(X)
2323
# First 20 iris belong to one cluster
2424
assert len(set(p.ravel())) == 1
@@ -28,16 +28,9 @@ def test_kmeans_parameters(self):
2828
max_iter=10,
2929
random_state=42,
3030
tol=0.001,
31-
init='random',
32-
compute_silhouette_score=True)
31+
init='random')
3332
c = kmeans(self.iris)
3433

35-
def test_predict_single_instance(self):
36-
kmeans = KMeans()
37-
c = kmeans(self.iris)
38-
inst = self.iris[0]
39-
p = c(inst)
40-
4134
def test_predict_table(self):
4235
kmeans = KMeans()
4336
c = kmeans(self.iris)
@@ -48,18 +41,10 @@ def test_predict_numpy(self):
4841
kmeans = KMeans()
4942
c = kmeans(self.iris)
5043
X = self.iris.X[::20]
51-
p = c(X)
44+
p = c.predict(X)
5245

5346
def test_predict_sparse(self):
5447
kmeans = KMeans()
5548
c = kmeans(self.iris)
56-
X = csc_matrix(self.iris.X[::20])
57-
p = c(X)
58-
59-
def test_silhouette_sparse(self):
60-
"""Test if silhouette gets calculated for sparse data"""
61-
kmeans = KMeans(compute_silhouette_score=True)
62-
sparse_iris = self.iris.copy()
63-
sparse_iris.X = csc_matrix(sparse_iris.X)
64-
c = kmeans(sparse_iris)
65-
self.assertFalse(np.isnan(c.silhouette))
49+
self.iris.X = csc_matrix(self.iris.X[::20])
50+
p = c(self.iris)

Orange/tests/test_louvain.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,17 @@
55
import numpy as np
66

77
from Orange.data import Table
8-
from Orange.clustering.louvain import Louvain
8+
from Orange.clustering.louvain import Louvain, LouvainModel
99

1010

11-
class TestSVMLearner(unittest.TestCase):
11+
class TestLouvain(unittest.TestCase):
1212
@classmethod
1313
def setUpClass(cls):
1414
cls.data = Table('iris')
1515
cls.louvain = Louvain()
1616

1717
def test_orange_table(self):
18-
self.assertIsNone(self.louvain.fit(self.data))
19-
clusters = self.louvain.fit_predict(self.data)
20-
self.assertIn(type(clusters), [list, np.ndarray])
21-
22-
def test_np_array(self):
23-
data_np = self.data.X
24-
self.assertIsNone(self.louvain.fit(data_np))
25-
clusters = self.louvain.fit_predict(data_np)
18+
louvain_model = self.louvain(self.data)
19+
self.assertEqual(type(louvain_model), LouvainModel)
20+
clusters = louvain_model(self.data)
2621
self.assertIn(type(clusters), [list, np.ndarray])

Orange/widgets/unsupervised/tests/test_owkmeans.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import numpy as np
66
from AnyQt.QtCore import Qt
77
from AnyQt.QtWidgets import QRadioButton
8+
from sklearn.metrics import silhouette_score
89

910
import Orange.clustering
1011
from Orange.data import Table, Domain
@@ -199,24 +200,22 @@ def test_data_on_output(self):
199200

200201
@patch("Orange.clustering.kmeans.KMeansModel.__call__")
201202
def test_centroids_on_output(self, km_call):
202-
ret = km_call.return_value = Mock()
203-
ret.X = np.array([0] * 50 + [1] * 100)
204-
ret.silhouette_samples = np.arange(150) / 150
203+
km_call.return_value = np.array([0] * 50 + [1] * 100).flatten()
205204

206205
widget = self.widget
207206
widget.optimize_k = False
208207
widget.k = 4
209208
self.send_signal(widget.Inputs.data, self.iris)
210209
self.commit_and_wait()
211210

212-
widget.clusterings[4].silhouette_samples = np.arange(150) / 150
211+
widget.samples_scores = lambda x: np.arctan(
212+
np.arange(150) / 150) / np.pi + 0.5
213213
widget.send_data()
214214
out = self.get_output(widget.Outputs.centroids)
215-
np.testing.assert_almost_equal(
216-
out.metas,
217-
[[0, np.mean(np.arctan(np.arange(50) / 150)) / np.pi + 0.5],
215+
np.testing.assert_array_almost_equal(
216+
np.array([[0, np.mean(np.arctan(np.arange(50) / 150)) / np.pi + 0.5],
218217
[1, np.mean(np.arctan(np.arange(50, 150) / 150)) / np.pi + 0.5],
219-
[2, 0], [3, 0]])
218+
[2, 0], [3, 0]]), out.metas.astype(float))
220219
self.assertEqual(out.name, "iris centroids")
221220

222221
def test_centroids_domain_on_output(self):
@@ -262,12 +261,14 @@ def test_optimization_fails(self):
262261
self.KMeansFail.fail_on = {3, 5, 7}
263262
model = widget.table_view.model()
264263

265-
with patch.object(model, "set_scores", wraps=model.set_scores) as set_scores:
264+
with patch.object(
265+
model, "set_scores", wraps=model.set_scores) as set_scores:
266266
self.send_signal(self.widget.Inputs.data, self.iris, wait=5000)
267267
scores, start_k = set_scores.call_args[0]
268268
self.assertEqual(
269269
scores,
270-
[km if isinstance(km, str) else km.silhouette
270+
[km if isinstance(km, str) else silhouette_score(
271+
self.iris.X, km(self.iris))
271272
for km in (widget.clusterings[k] for k in range(3, 9))]
272273
)
273274
self.assertEqual(start_k, 3)
@@ -312,15 +313,14 @@ def test_run_fails(self):
312313
self.assertIsNotNone(self.get_output(self.widget.Outputs.annotated_data))
313314

314315
def test_select_best_row(self):
315-
class Cluster:
316-
def __init__(self, n):
317-
self.silhouette = n
318-
319316
widget = self.widget
320317
widget.k_from, widget.k_to = 2, 6
321-
widget.clusterings = {k: Cluster(5 - (k - 4) ** 2) for k in range(2, 7)}
318+
widget.optimize_k = True
319+
self.send_signal(self.widget.Inputs.data, Table("housing"), wait=5000)
320+
self.commit_and_wait()
322321
widget.update_results()
323-
self.assertEqual(widget.selected_row(), 2)
322+
# for housing dataset best selection is 3 clusters, so row no. 1
323+
self.assertEqual(widget.selected_row(), 1)
324324

325325
widget.clusterings = {k: "error" for k in range(2, 7)}
326326
widget.update_results()
@@ -394,7 +394,9 @@ def test_silhouette_column(self):
394394
# Avoid randomness in the test
395395
random = np.random.RandomState(0) # pylint: disable=no-member
396396
table = Table(random.rand(110, 2))
397-
with patch("Orange.clustering.kmeans.SILHOUETTE_MAX_SAMPLES", 100):
397+
with patch(
398+
"Orange.widgets.unsupervised.owkmeans.SILHOUETTE_MAX_SAMPLES",
399+
100):
398400
self.send_signal(self.widget.Inputs.data, table)
399401
outtable = self.get_output(widget.Outputs.annotated_data)
400402
outtable = outtable.get_column_view("Silhouette")[0]

0 commit comments

Comments
 (0)