def test_shape_transformer_2d_2d_array(axis): st = ShapeTransformerTo2D(axis=axis) x = numpy.arange(6).reshape((2, 3)) xt = st.transform(x) xit = st.inverse_transform(xt) if axis == 0: assert numpy.allclose(xt.array, numpy.array([[0, 3], [1, 4], [2, 5]])) elif axis == 1 or axis == -1: assert numpy.allclose(x, xt.array) assert numpy.allclose(x, xit.array)
def transform(self, x, axis=1): is_array = not isinstance(x, Variable) if self.mean is None: raise AttributeError('[Error] mean is None, call fit beforehand!') x = format_x(x) shape_transformer = ShapeTransformerTo2D(axis=axis) x = shape_transformer.transform(x) mean_all, std_all = self._compute_mean_std_all(x.shape[1]) x = (x - mean_all[None, :]) / std_all[None, :] x = shape_transformer.inverse_transform(x) if is_array: x = x.array return x
def test_shape_transformer_2d_3d_array(axis): st = ShapeTransformerTo2D(axis=axis) x = numpy.arange(12).reshape((2, 3, 2)) xt = st.transform(x) xit = st.inverse_transform(xt) if axis == 0: assert numpy.allclose( xt.array, numpy.array([[0, 6], [1, 7], [2, 8], [3, 9], [4, 10], [5, 11]])) elif axis == 1: assert numpy.allclose( xt.array, numpy.array([[0, 2, 4], [1, 3, 5], [6, 8, 10], [7, 9, 11]])) elif axis == 2 or axis == -1: assert numpy.allclose(xt.array, x.reshape(6, 2)) assert numpy.allclose(x, xit.array)
def fit(self, x, indices=None, axis=1): """Fitting parameter. Args: x (numpy.ndarray or cupy.ndarray or Variable): indices (list or tuple or None): indices for applying standard scaling. axis (int): axis to calculate mean & std. Returns: self (StandardScaler): this instance. """ x = to_array(x) x = format_x(x) x = ShapeTransformerTo2D(axis=axis).transform(x).array if indices is None: pass elif isinstance(indices, (list, tuple)): indices = numpy.asarray(indices) self.indices = indices if self.indices is not None: x = x[:, self.indices] xp = self.xp if xp is numpy: x = cuda.to_cpu(x) self.mean = xp.nanmean(x, axis=0) self.std = xp.nanstd(x, axis=0) else: x = cuda.to_gpu(x) if int(xp.sum(xp.isnan(x))) > 0: raise NotImplementedError( "StandardScaling with nan value on GPU is not supported.") # cupy.nanmean, cupy.nanstd is not implemented yet. self.mean = xp.mean(x, axis=0) self.std = xp.std(x, axis=0) # result consistency check if xp.sum(self.std == 0) > 0: logger = getLogger(__name__) ind = numpy.argwhere(cuda.to_cpu(self.std) == 0)[:, 0] logger.warning('fit: std was 0 at indices {}'.format(ind)) return self
def fit(self, x, indices=None, axis=1): """Fitting parameter. Args: x (numpy.ndarray or cupy.ndarray or Variable): indices (list or tuple or None): indices for applying standard scaling. axis (int): axis to calculate min & max. Returns: self (MinMaxScaler): this instance. """ x = to_array(x) x = format_x(x) x = ShapeTransformerTo2D(axis=axis).transform(x).array if indices is None: pass elif isinstance(indices, (list, tuple)): indices = numpy.asarray(indices) self.indices = indices if self.indices is not None: x = x[:, self.indices] xp = self.xp if xp is numpy: x = cuda.to_cpu(x) else: x = cuda.to_gpu(x) self.min = xp.nanmin(x, axis=0) self.max = xp.nanmax(x, axis=0) # result consistency check if xp.sum(self.max - self.min == 0) > 0: logger = getLogger(__name__) ind = numpy.argwhere(cuda.to_cpu(self.max-self.min) == 0)[:, 0] logger.warning('fit: max-min was 0 at indices {}'.format(ind)) return self
def test_shape_transformer_2d_error(): st = ShapeTransformerTo2D(axis=1) x = numpy.arange(6).reshape(2, 3) with pytest.raises(AttributeError): # call `inverse_transform` before `transform` xt = st.inverse_transform(x)