From 3e2bd8d182016859f7ba08fd87350ecdd0ddea2a Mon Sep 17 00:00:00 2001 From: Vesna Tanko Date: Tue, 6 Nov 2018 10:36:27 +0100 Subject: [PATCH] OWFreeViz: Fix optimization for data with missing values --- Orange/widgets/visualize/owfreeviz.py | 15 ++++++++------- Orange/widgets/visualize/tests/test_owfreeviz.py | 2 +- Orange/widgets/visualize/utils/widget.py | 1 + 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Orange/widgets/visualize/owfreeviz.py b/Orange/widgets/visualize/owfreeviz.py index c1f9583c4c5..2fe3cf1833b 100644 --- a/Orange/widgets/visualize/owfreeviz.py +++ b/Orange/widgets/visualize/owfreeviz.py @@ -353,12 +353,12 @@ def prepare_projection_data(self): self._X = self._Y = self.valid_data = None return - self._X = self.data.X.copy() - self._X -= np.nanmean(self._X, axis=0) - span = np.ptp(self._X[self.valid_data], axis=0) + self._X = self.data.X[self.valid_data] + self._X -= np.mean(self._X, axis=0) + span = np.ptp(self._X, axis=0) self._X[:, span > 0] /= span[span > 0].reshape(1, -1) - self._Y = self.data.Y + self._Y = self.data.Y[self.valid_data] if self.data.domain.class_var.is_discrete: self._Y = self._Y.astype(int) @@ -370,9 +370,10 @@ def init_embedding_coords(self): def get_embedding(self): if self.data is None: return None - embedding = np.dot(self._X, self.projection) - embedding /= \ - np.max(np.linalg.norm(embedding[self.valid_data], axis=1)) or 1 + EX = np.dot(self._X, self.projection) + EX /= np.max(np.linalg.norm(EX, axis=1)) or 1 + embedding = np.zeros((len(self.data), 2), dtype=np.float) + embedding[self.valid_data] = EX return embedding def get_anchors(self): diff --git a/Orange/widgets/visualize/tests/test_owfreeviz.py b/Orange/widgets/visualize/tests/test_owfreeviz.py index 0120a8c746c..988cf84b6ef 100644 --- a/Orange/widgets/visualize/tests/test_owfreeviz.py +++ b/Orange/widgets/visualize/tests/test_owfreeviz.py @@ -39,7 +39,7 @@ def test_error_msg(self): self.assertFalse(self.widget.Error.not_enough_class_vars.is_shown()) def test_optimization(self): - self.send_signal(self.widget.Inputs.data, self.data) + self.send_signal(self.widget.Inputs.data, self.heart_disease) self.widget.btn_start.click() def test_optimization_cancelled(self): diff --git a/Orange/widgets/visualize/utils/widget.py b/Orange/widgets/visualize/utils/widget.py index 610f806926a..43c6eeb11c7 100644 --- a/Orange/widgets/visualize/utils/widget.py +++ b/Orange/widgets/visualize/utils/widget.py @@ -550,6 +550,7 @@ def clear(self): self.data = None self.valid_data = None self.selection = None + self.graph.selection = None def onDeleteWidget(self): super().onDeleteWidget()