33from AnyQt .QtWidgets import QWidget , QVBoxLayout
44
55from 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
107from Orange .projection import (MDS , Isomap , LocallyLinearEmbedding ,
118 SpectralEmbedding , TSNE )
129from Orange .widgets import gui
1310from Orange .widgets .settings import Setting , SettingProvider
1411from 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+
1727class 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
92102class 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 )
0 commit comments