Ignore:
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Unsupervised/OWSOM.py

    r9671 r10455  
    121121##        params=[{"iterations":self.iterations1, "radius":self.radius1, "alpha":self.alpha1}, 
    122122##                {"iterations":self.iterations2, "radius":self.radius2, "alpha":self.alpha2}] 
    123         self.learner = orngSOM.SOMLearner(name=self.LearnerName, map_shape=(self.xdim, self.ydim), topology=topology, neighborhood=neigh, 
     123        self.learner = orngSOM.SOMLearner(name=self.LearnerName, map_shape=(self.xdim, self.ydim), topology=topology, neighbourhood=neigh, 
    124124                                        epochs=self.iterations1, eps=self.eps, initialize=self.initialization, 
    125125                                        radius_ini=self.radius1, radius_fin=self.radius2) #alphaType=alphaT, parameters=params) 
  • Orange/projection/som.py

    r10316 r10455  
    133133 
    134134    Node    Instances 
    135     (0, 0)  21 
    136     (0, 1)  1 
    137     (0, 2)  23 
    138     (1, 0)  22 
     135    (0, 0)  31 
     136    (0, 1)  7 
     137    (0, 2)  0 
     138    (1, 0)  24 
    139139    (1, 1)  7 
    140     (1, 2)  6 
    141     (2, 0)  32 
    142     (2, 1)  16 
    143     (2, 2)  22 
    144      
    145     Data instances in cell (1, 2): 
    146     [4.9, 2.4, 3.3, 1.0, 'Iris-versicolor'] 
    147     [5.0, 2.0, 3.5, 1.0, 'Iris-versicolor'] 
    148     [5.6, 2.9, 3.6, 1.3, 'Iris-versicolor'] 
    149     [5.7, 2.6, 3.5, 1.0, 'Iris-versicolor'] 
    150     [5.5, 2.4, 3.7, 1.0, 'Iris-versicolor'] 
    151     [5.0, 2.3, 3.3, 1.0, 'Iris-versicolor'] 
     140    (1, 2)  50 
     141    (2, 0)  10 
     142    (2, 1)  21 
     143    (2, 2)  0 
     144 
     145    Data instances in cell (0, 1): 
     146    [6.9, 3.1, 4.9, 1.5, 'Iris-versicolor'] 
     147    [6.7, 3.0, 5.0, 1.7, 'Iris-versicolor'] 
     148    [6.3, 2.9, 5.6, 1.8, 'Iris-virginica'] 
     149    [6.5, 3.2, 5.1, 2.0, 'Iris-virginica'] 
     150    [6.4, 2.7, 5.3, 1.9, 'Iris-virginica'] 
     151    [6.1, 2.6, 5.6, 1.4, 'Iris-virginica'] 
     152    [6.5, 3.0, 5.2, 2.0, 'Iris-virginica'] 
    152153     
    153154""" 
     
    225226 
    226227    def radius(self, epoch): 
    227         return self.radius_ini - (float(self.radius_ini) - self.radius_fin)*(float(epoch) / self.epochs) 
    228  
    229     def alpha(self, epoch): 
    230         """Compute the learning rate from epoch, starting with learning_rate to 0 at the end of training.  
    231         """ 
    232         return (1 - epoch/self.epochs)*self.learning_rate 
    233              
     228        return self.radius_ini - (float(self.radius_ini) - self.radius_fin)*(float(epoch) / (self.epochs-1)) 
     229 
     230    def radius_seq(self, iter): 
     231        """Compute the radius regarding the iterations, not epochs.""" 
     232        iterations = len(self.data)*self.epochs 
     233        return self.radius_ini - (float(self.radius_ini) - self.radius_fin)*(float(iter) / (iterations-1)) 
     234 
     235    def alpha(self, iter): 
     236        """Compute the learning rate from iterations, starting with learning_rate to 0 at the end of training. 
     237        """ 
     238        iterations = len(self.data)*self.epochs 
     239        return (1 - float(iter)/(iterations-1))*self.learning_rate 
     240 
    234241    @deprecated_keywords({"progressCallback": "progress_callback"}) 
    235242    def __call__(self, data, map, progress_callback=None): 
     
    287294            self.distances.append(min_dist) 
    288295 
     296            iter = epoch*len(self.data)+ind 
     297 
    289298            if self.neighbourhood == Map.NeighbourhoodGaussian: 
    290                 h = numpy.exp(-self.unit_distances[:, bmu]/(2*self.radius(epoch))) * (self.unit_distances[:, bmu] <= self.radius(epoch)) 
     299                h = numpy.exp(-self.unit_distances[:, bmu]**2/(2*self.radius_seq(iter)**2)) * (self.unit_distances[:, bmu]**2 <= self.radius_seq(iter)**2) 
    291300            elif self.neighbourhood == Map.NeighbourhoodEpanechicov: 
    292                 h = 1.0 - (self.unit_distances[:bmu]/self.radius(epoch))**2 
     301                h = 1.0 - (self.unit_distances[:bmu]/self.radius_seq(iter))**2 
    293302                h = h * (h >= 0.0) 
    294303            else: 
    295                 h = 1.0*(self.unit_distances[:, bmu] <= self.radius(epoch)) 
    296             h = h * self.alpha(epoch) 
     304                h = 1.0*(self.unit_distances[:, bmu] <= self.radius_seq(iter)) 
     305            h = h * self.alpha(iter) 
    297306 
    298307            nonzero = ma.nonzero(h) 
     
    344353 
    345354        if self.neighbourhood == Map.NeighbourhoodGaussian:         
    346             H = numpy.exp(-self.unit_distances/(2*self.radius(epoch))) * (self.unit_distances <= self.radius(epoch)) 
     355            H = numpy.exp(-self.unit_distances**2/(2*self.radius(epoch)**2)) * (self.unit_distances**2 <= self.radius(epoch)**2) 
    347356        elif self.neighbourhood == Map.NeighbourhoodEpanechicov: 
    348357            H = 1.0 - (self.unit_distances/self.radius(epoch))**2 
     
    676685        nodes = list(self) 
    677686        coords = numpy.zeros((len(nodes), len(self.map_shape))) 
    678         coords[:, 0] = numpy.floor(numpy.arange(len(nodes)) / self.map_shape[0]) 
    679         coords[:, 1] = numpy.mod(numpy.arange(len(nodes)), self.map_shape[1]) 
    680          
    681         ## in hexagonal topology we move every odd map row by 0.5 and multiply all by sqrt(0.75) 
     687 
     688        k = [self.map_shape[1],1] 
     689        inds = numpy.arange(len(nodes)) 
     690        for i in range(0,len(self.map_shape)): 
     691            coords[:,i] = numpy.transpose(numpy.floor(inds/k[i])) 
     692            inds = numpy.mod(inds,k[i]) 
     693 
     694        ## in hexagonal topology we move every odd map row by 0.5 (only the second coordinate) 
     695        ## and multiply all the first coordinates by sqrt(0.75) to assure that 
     696        ## distances between neighbours are of unit size 
    682697        if self.topology == Map.HexagonalTopology: 
    683             ind = numpy.nonzero(1 - numpy.mod(coords[:, 0], 2)) 
    684             coords[ind] = coords[ind] + 0.5 
    685             coords = coords * numpy.sqrt(0.75) 
     698            ind = numpy.nonzero(numpy.mod(coords[:, 0], 2)) 
     699            coords[ind,1] = coords[ind,1] + 0.5 
     700            coords[:,0] = coords[:,0] * numpy.sqrt(0.75) 
    686701        return coords 
    687702 
     
    733748        for d in range(mdim): 
    734749            max, min = numpy.max(unit_coords[:, d]), numpy.min(unit_coords[:, d]) 
    735             unit_coords[:, d] = (unit_coords[:, d] - min)/(max - min) 
     750            if max > min: 
     751                unit_coords[:, d] = (unit_coords[:, d] - min)/(max - min) 
     752            ## in case of one-dimensional SOM 
     753            else: 
     754                unit_coords[:, d] = 0.5 
     755 
    736756        unit_coords = (unit_coords - 0.5) * 2 
    737757 
  • docs/reference/rst/code/som-mapping.py

    r10322 r10455  
    1717print "\n".join(["%s  %d" % (str(n.pos), len(n.examples)) for n in map]) 
    1818 
    19 i, j = 1, 2 
     19i, j = 0, 1 
    2020print 
    2121print "Data instances in cell (%d, %d):" % (i, j) 
Note: See TracChangeset for help on using the changeset viewer.