Skip to content

Commit 9b2cedb

Browse files
OWManifold: Add absolute distances to tSNE
1 parent f1cba0d commit 9b2cedb

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

Orange/widgets/unsupervised/owmanifoldlearning.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,27 @@
33
from AnyQt.QtWidgets import QWidget, QVBoxLayout
44

55
from Orange.data import Table, Domain, ContinuousVariable
6-
from Orange.distance import (
7-
Euclidean, Manhattan, Jaccard, Cosine, SpearmanR, PearsonR, Distance,
8-
MahalanobisDistance,
9-
)
6+
from Orange import distance
107
from Orange.projection import (MDS, Isomap, LocallyLinearEmbedding,
118
SpectralEmbedding, TSNE)
129
from Orange.widgets import gui
1310
from Orange.widgets.settings import Setting, SettingProvider
1411
from Orange.widgets.widget import OWWidget, Msg, Input, Output
1512

1613

14+
METRICS = [
15+
distance.Euclidean,
16+
distance.Manhattan,
17+
distance.MahalanobisDistance(),
18+
distance.Jaccard,
19+
distance.Cosine,
20+
distance.SpearmanR,
21+
distance.SpearmanRAbsolute,
22+
distance.PearsonR,
23+
distance.PearsonRAbsolute,
24+
]
25+
26+
1727
class ManifoldParametersEditor(QWidget, gui.OWComponent):
1828
def __init__(self, parent):
1929
QWidget.__init__(self, parent)
@@ -90,12 +100,8 @@ def __radio_parameter_update(self, name):
90100

91101

92102
class TSNEParametersEditor(ManifoldParametersEditor):
93-
metrics = [
94-
Euclidean, Manhattan, Jaccard, MahalanobisDistance(), Cosine,
95-
SpearmanR, PearsonR,
96-
]
97103
metric_index = Setting(0)
98-
metric_values = [(metric, metric.name) for metric in metrics]
104+
metric_values = [(metric, metric.name) for metric in METRICS]
99105

100106
perplexity = Setting(30)
101107
early_exaggeration = Setting(4)
@@ -107,6 +113,7 @@ class TSNEParametersEditor(ManifoldParametersEditor):
107113

108114
def __init__(self, parent):
109115
super().__init__(parent)
116+
110117
self.metric_combo = self._create_combo_parameter(
111118
"metric", "Metric:")
112119
self.perplexity_spin = self._create_spin_parameter(
@@ -208,9 +215,8 @@ class Error(OWWidget.Error):
208215
manifold_error = Msg("{}")
209216
sparse_methods = Msg('Only t-SNE method supported on sparse data')
210217
sparse_metric = Msg(
211-
", ".join(m.name for m in TSNEParametersEditor.metrics[:-1]
212-
if not m.supports_sparse)
213-
+ " and " + TSNEParametersEditor.metrics[-1].name +
218+
", ".join(m.name for m in METRICS[:-1] if not m.supports_sparse) +
219+
" and " + METRICS[-1].name +
214220
" distances not supported with sparse data."
215221
)
216222

@@ -286,7 +292,7 @@ def apply(self):
286292
metric = params.get('metric')
287293

288294
# Make sure that the metric supports sparse data
289-
if data.is_sparse() and isinstance(metric, Distance) \
295+
if data.is_sparse() and isinstance(metric, distance.Distance) \
290296
and not metric.supports_sparse:
291297
self.Error.sparse_metric()
292298

@@ -297,7 +303,7 @@ def apply(self):
297303
data.domain.metas)
298304
try:
299305
# Mahalanobis distance must first be fit to the data
300-
if isinstance(metric, MahalanobisDistance):
306+
if isinstance(metric, distance.MahalanobisDistance):
301307
metric.fit(data)
302308

303309
projector = method(**params)

Orange/widgets/unsupervised/tests/test_owmanifoldlearning.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ def test_singular_matrices(self):
101101
[0, 1, 2],
102102
[0, 1, 1]))
103103
)
104-
metrics = {m.name: i for i, m in enumerate(self.widget.tsne_editor.metrics)}
104+
metrics = {m.name: i for i, (m, _)
105+
in enumerate(self.widget.tsne_editor.metric_values)}
105106

106107
self.send_signal(self.widget.Inputs.data, table)
107108
self.widget.manifold_methods_combo.activated.emit(0) # t-SNE

0 commit comments

Comments
 (0)