Skip to content

Commit

Permalink
Merge pull request #52 from jerneju/sparse-1
Browse files Browse the repository at this point in the history
[FIX] Polynomial Classification: work on sparse
  • Loading branch information
PrimozGodec committed Apr 13, 2018
2 parents 7997982 + fd36b74 commit 034e08b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 6 deletions.
12 changes: 7 additions & 5 deletions orangecontrib/educational/widgets/owpolynomialclassification.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@
import copy

import numpy as np
import scipy.sparse as sp
from scipy.interpolate import splprep, splev
from scipy.ndimage.filters import gaussian_filter

from AnyQt.QtCore import Qt
from AnyQt.QtGui import QPixmap, QColor, QIcon
from AnyQt.QtWidgets import QSizePolicy
from scipy.interpolate import splprep, splev

from Orange.base import Learner as InputLearner
from Orange.data import (
Expand Down Expand Up @@ -531,8 +532,9 @@ def select_data(self):
cols = []
for attr in (attr_x, attr_y):
subset = self.data[:, attr]
cols.append(subset.X)
cols.append(subset.X if not sp.issparse(subset.X) else subset.X.toarray())
x = np.column_stack(cols)
y_c = self.data.Y[:, None] if not sp.issparse(self.data.Y) else self.data.Y.toarray()

if np.isnan(x).all(axis=0).any():
self.Error.all_none_data()
Expand All @@ -554,7 +556,7 @@ def select_data(self):
y = [(0 if d.get_class().value == self.target_class else 1)
for d in self.data]

return Table(domain, x, y, self.data.Y[:, None])
return Table(domain, x, y, y_c)

def apply(self):
"""
Expand All @@ -563,7 +565,7 @@ def apply(self):
self.send_learner()
self.update_model()
self.send_coefficients()
if None in (self.data, self.model):
if any(a is None for a in (self.data, self.model)):
self.set_empty_plot()
else:
self.replot()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -983,3 +983,7 @@ def send_sparse_data(data):
class_vars=data.domain.attributes[3:] + data.domain.class_vars
)
send_sparse_data(data.transform(domain))


if __name__ == "__main__":
unittest.main()
5 changes: 5 additions & 0 deletions orangecontrib/educational/widgets/tests/test_owkmeans.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,3 +335,8 @@ def test_data_nan_column(self):
data = data.transform(domain)
data[:, 0] = np.nan
self.send_signal(self.widget.Inputs.data, data)


if __name__ == "__main__":
import unittest
unittest.main()
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from functools import reduce
import unittest

from Orange.regression import LinearRegressionLearner
import scipy.sparse as sp
from numpy.testing import assert_array_equal

from Orange.regression import LinearRegressionLearner
from Orange.widgets.tests.base import WidgetTest
from Orange.data import Table, ContinuousVariable, Domain, DiscreteVariable
from Orange.classification import (
Expand Down Expand Up @@ -606,3 +607,31 @@ def test_no_data_contour(self):
GH-50
"""
self.widget.contours_enabled_checkbox.click()

def test_sparse(self):
"""
Do not crash on sparse data. Convert used
sparse columns to numpy array.
GH-52
"""
w = self.widget

def send_sparse_data(data):
data.X = sp.csr_matrix(data.X)
data.Y = sp.csr_matrix(data.Y)
self.send_signal(w.Inputs.data, data)

# one class variable
send_sparse_data(Table("iris"))

# two class variables
data = Table("iris")
domain = Domain(
attributes=data.domain.attributes[:3],
class_vars=data.domain.attributes[3:] + data.domain.class_vars
)
send_sparse_data(data.transform(domain))


if __name__ == "__main__":
unittest.main()
Original file line number Diff line number Diff line change
Expand Up @@ -250,3 +250,8 @@ def test_data_nan_row(self):
data = Table("iris")[::50]
data.X[0] = np.nan
self.send_signal(self.widget.Inputs.data, data)


if __name__ == "__main__":
import unittest
unittest.main()

0 comments on commit 034e08b

Please sign in to comment.