Changeset 10806:eb51260debca in orange


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

Fixed selected components update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Prototypes/OWPCA.py

    r10805 r10806  
    113113        ##### 
    114114        grid = QGridLayout() 
    115         box = OWGUI.widgetBox(self.controlArea, "Settings", 
     115        box = OWGUI.widgetBox(self.controlArea, "Components Selection", 
    116116                              orientation=grid) 
    117117 
     
    186186        self.variances_sum = None 
    187187        self.projector_full = None 
     188        self.currently_selected = 0 
    188189 
    189190        self.resize(800, 400) 
     
    205206        self.variances_cumsum = None 
    206207        self.projector_full = None 
     208        self.currently_selected = 0 
    207209 
    208210    def set_data(self, data=None): 
     
    213215            self.data = data 
    214216            self.on_change() 
     217        else: 
     218            self.send("Transformed Data", None) 
     219            self.send("Eigen Vectors", None) 
    215220 
    216221    def on_change(self): 
     222        """Data has changed and we need to recompute the projection. 
     223        """ 
    217224        if self.data is None: 
    218225            return 
     
    221228 
    222229    def on_update(self): 
     230        """Component selection was changed by the user. 
     231        """ 
    223232        if self.data is None: 
    224233            return 
    225234        self.update_cutoff_curve() 
    226         self.update_components() 
     235        if self.currently_selected != self.number_of_selected_components(): 
     236            self.update_components() 
    227237 
    228238    def construct_pca_all_comp(self): 
     
    245255 
    246256    def apply(self): 
    247         """Apply PCA in input data, caching the full projection, 
     257        """Apply PCA on input data, caching the full projection, 
    248258        then updating the selected components. 
    249259         
     
    258268        self.max_components_spin.setRange(1, len(self.variances)) 
    259269        self.update_scree_plot() 
     270        self.update_cutoff_curve() 
    260271        self.update_components() 
    261272 
    262273    def update_components(self): 
     274        """Update the output components. 
     275        """ 
    263276        scale = self.projector_full.scale 
    264277        center = self.projector_full.center 
     
    283296        eigenvectors = self.eigenvectors_as_table(components) 
    284297 
     298        self.currently_selected = self.number_of_selected_components() 
     299 
    285300        self.send("Transformed Data", projected_data) 
    286301        self.send("Eigen Vectors", eigenvectors) 
     
    293308 
    294309    def update_scree_plot(self): 
    295         variances = self.projector_full.variances 
    296         s = np.sum(variances) 
    297         cv = variances / s 
    298         cs = np.cumsum(cv) 
    299         x_space = np.arange(0, len(variances)) 
     310        x_space = np.arange(0, len(self.variances)) 
    300311        self.scree_plot.set_axis_enabled(owaxis.xBottom, True) 
    301312        self.scree_plot.set_axis_enabled(owaxis.yLeft, True) 
     
    303314                                        ["PC" + str(i + 1) for i in x_space]) 
    304315 
    305         self.variance_curve.set_data(x_space, cv) 
    306         self.cumulative_variance_curve.set_data(x_space, cs) 
     316        self.variance_curve.set_data(x_space, self.variances) 
     317        self.cumulative_variance_curve.set_data(x_space, self.variances_cumsum) 
    307318        self.variance_curve.setVisible(True) 
    308319        self.cumulative_variance_curve.setVisible(True) 
     
    311322 
    312323    def on_cutoff_moved(self, value): 
     324        """Cutoff curve was moved by the user. 
     325        """ 
    313326        components = int(np.floor(value)) + 1 
    314         if components != self.max_components: 
    315             self.max_components = int(np.floor(value)) + 1 
    316             self.variance_covered = self.variances_cumsum[self.max_components - 1] * 100 
     327        # Did the number of components actually change 
     328        self.max_components = components 
     329        self.variance_covered = self.variances_cumsum[components - 1] * 100 
     330        if self.currently_selected != self.number_of_selected_components(): 
     331#            self.max_components = int(np.floor(value)) + 1 
     332#            self.variance_covered = self.variances_cumsum[self.max_components - 1] * 100 
    317333            self.update_components() 
    318334 
    319335    def update_cutoff_curve(self): 
    320         """Update cutoff line from gui control elements. 
     336        """Update cutoff curve from 'Components Selection' control box. 
    321337        """ 
    322338        variance = self.variances_cumsum[self.max_components - 1] * 100.0 
     
    328344        self.scree_plot.set_cutoff_value(cutoff + 0.5) 
    329345 
     346    def number_of_selected_components(self): 
     347        """How many components are selected. 
     348        """ 
     349        if self.data is None: 
     350            return 0 
     351 
     352        variance_components = np.searchsorted(self.variances_cumsum, 
     353                                              self.variance_covered / 100.0) 
     354        return min(variance_components + 1, self.max_components) 
    330355 
    331356if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.