Ignore:
Timestamp:
04/02/12 18:12:04 (2 years ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Fixed scatterplot (and linear projection) point jittering (now remains the same through subset data changes), fixes #1170.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/data/preprocess/scaling.py

    r10651 r10705  
    195195        self.jitter_size = 10 
    196196        self.jitter_continuous = 0 
     197        self.jitter_seed = 0 
    197198 
    198199        self.attr_values = {} 
     
    269270 
    270271        len_data = data and len(data) or 0 
    271         numpy.random.seed(1)     # we always reset the random generator, so that if we receive the same data again we will add the same noise 
    272272 
    273273        self.attribute_names = [attr.name for attr in full_data.domain] 
     
    362362                                         self.no_jittering_scaled_subset_data], 
    363363                                         axis = 1) 
    364         for index in range(len(data.domain)): 
     364 
     365        # Random generators for jittering  
     366        random = numpy.random.RandomState(seed=self.jitter_seed) 
     367        rand_seeds = random.random_integers(0, sys.maxint - 1, size=len(data.domain)) 
     368        for index, rseed in zip(range(len(data.domain)), rand_seeds): 
     369            # Need to use a different seed for each feature 
     370            random = numpy.random.RandomState(seed=rseed) 
    365371            attr = data.domain[index] 
    366372            if attr.var_type == Orange.core.VarTypes.Discrete: 
    367373                scaled_data[index] += (self.jitter_size/(50.0*max(1,len(attr.values))))*\ 
    368                                       (numpy.random.random(len(full_data)) - 0.5) 
     374                                      (random.rand(len(full_data)) - 0.5) 
    369375                 
    370376            elif attr.var_type == Orange.core.VarTypes.Continuous and self.jitter_continuous: 
    371                 scaled_data[index] += self.jitter_size/50.0 * (0.5 - numpy.random.random(len(full_data))) 
     377                scaled_data[index] += self.jitter_size/50.0 * (0.5 - random.rand(len(full_data))) 
    372378                scaled_data[index] = numpy.absolute(scaled_data[index])       # fix values below zero 
    373379                ind = numpy.where(scaled_data[index] > 1.0, 1, 0)     # fix values above 1 
    374380                numpy.putmask(scaled_data[index], ind, 2.0 - numpy.compress(ind, scaled_data[index])) 
     381 
     382        if self.have_subset_data: 
     383            # Fix all subset instances which are also in the main data 
     384            # to have the same jittered values 
     385            ids_to_indices = dict((inst.id, i) \ 
     386                                  for i, inst in enumerate(self.raw_data)) 
     387 
     388            subset_ids_map = [[i, ids_to_indices[s.id]] \ 
     389                               for i, s in enumerate(self.raw_subset_data)\ 
     390                               if s.id in ids_to_indices] 
     391            if len(subset_ids_map): 
     392                subset_ids_map = numpy.array(subset_ids_map) 
     393                subset_ids_map[:, 0] += len_data 
     394                scaled_data[:, subset_ids_map[:, 0]] = \ 
     395                        scaled_data[:, subset_ids_map[:, 1]] 
     396 
    375397        self.scaled_data = scaled_data[:,:len_data]; self.scaled_subset_data = scaled_data[:,len_data:] 
    376398     
Note: See TracChangeset for help on using the changeset viewer.