Changeset 9463:37e5cc527552 in orange


Ignore:
Timestamp:
07/28/11 10:15:56 (3 years ago)
Author:
wencanluo <wencanluo@…>
Branch:
default
Convert:
b2810d71928246a9bfcda6385eb69a079f3e4235
Message:

ML-kNN method for multi-label classification is finished

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/multilabel/mlknn.py

    r9462 r9463  
    5555 
    5656""" 
    57  
     57import random 
    5858import Orange 
    5959import label 
     
    164164        label_indices = self.label_indices 
    165165        k = self.k 
    166         print k 
    167166         
    168167        #A table holding the prior probability for an instance to belong in each class 
     
    173172         
    174173        #A table holding the probability for an instance to belong in each class given that i:0..k of its neighbors belong to that class 
    175         self.CondProbabilities   = [ [0.] * (k + 1) ] * num_labels 
     174        self.cond_probabilities   = [ [0.] * (k + 1) ] * num_labels 
    176175         
    177176        #A table holding the probability for an instance not to belong in each class given that i:0..k of its neighbors belong to that class 
    178         self.CondNProbabilities  = [ [0.] * (k + 1) ] * num_labels 
     177        self.cond_nprobabilities  = [ [0.] * (k + 1) ] * num_labels 
    179178         
    180179        #build a kNNLearner 
     
    200199        self.knn = Orange.classification.knn.kNNLearner(new_table,k) 
    201200         
    202         for e in new_table: 
    203             set = self.knn.findNearest(e,k) 
    204            
    205201        #Computing the prior probabilities P(H_b^l) 
    206202        self.compute_prior() 
     
    211207        #Computing y_t and r_t 
    212208         
    213         return MLkNNClassifier(instances = instances, label_indices = label_indices) 
     209        return MLkNNClassifier(instances = instances, label_indices = label_indices,  
     210                               prior_probabilities = self.prior_probabilities,  
     211                               prior_nprobabilities = self.prior_nprobabilities, 
     212                               cond_probabilities = self.cond_probabilities, 
     213                               cond_nprobabilities = self.cond_nprobabilities, 
     214                               knn = self.knn, 
     215                               k = self.k) 
    214216 
    215217    def compute_prior(self): 
     
    231233        k = self.k 
    232234        num_instances = len(self.instances) 
     235        instances = self.instances 
    233236         
    234237        temp_ci  = [ [0] * (k + 1) ] * num_labels 
    235         temp_NCi = [ [0] * (k + 1) ] * num_labels 
    236  
    237 """ 
     238        temp_nci = [ [0] * (k + 1) ] * num_labels 
     239 
    238240        for i  in range(num_instances): 
    239             #Instances knn = new Instances(lnn.kNearestNeighbours(train.instance(i), k)); 
    240  
    241             # now compute values of temp_ci and temp_NCi for every class label 
    242             for (int j = 0; j < numLabels; j++) { 
    243  
    244                 int aces = 0; // num of aces in Knn for j 
    245                 for (int k = 0; k < k; k++) { 
    246                     double value = Double.parseDouble(train.attribute(labelIndices[j]).value( 
    247                             (int) knn.instance(k).value(labelIndices[j]))); 
    248                     if (Utils.eq(value, 1.0)) { 
    249                         aces++; 
    250                     } 
    251                 } 
    252                 // raise the counter of temp_ci[j][aces] and temp_NCi[j][aces] by 1 
    253                 if (Utils.eq(Double.parseDouble(train.attribute(labelIndices[j]).value( 
    254                         (int) train.instance(i).value(labelIndices[j]))), 1.0)) { 
    255                     temp_ci[j][aces]++; 
    256                 } else { 
    257                     temp_NCi[j][aces]++; 
    258                 } 
    259             } 
    260         } 
    261  
    262         // compute CondProbabilities[i][..] for labels based on temp_ci[] 
    263         for (int i = 0; i < numLabels; i++) { 
    264             int temp1 = 0; 
    265             int temp2 = 0; 
    266             for (int j = 0; j < k + 1; j++) { 
    267                 temp1 += temp_ci[i][j]; 
    268                 temp2 += temp_NCi[i][j]; 
    269             } 
    270             for (int j = 0; j < k + 1; j++) { 
    271                 CondProbabilities[i][j] = (smooth + temp_ci[i][j]) / (smooth * (k + 1) + temp1); 
    272                 CondNProbabilities[i][j] = (smooth + temp_NCi[i][j]) / (smooth * (k + 1) + temp2); 
    273             } 
    274         } 
    275     } 
    276 """ 
     241            neighbors = self.knn.findNearest(instances[i], k) 
     242                  
     243            # now compute values of temp_ci and temp_nci for every class label 
     244            for j in range(num_labels): 
     245                aces = 0 # num of aces in Knn for j 
     246                for m in range(k): 
     247                    value = neighbors[m].get_class().value[j] 
     248                    if value == '1': 
     249                        aces = aces + 1 
     250                      
     251                #raise the counter of temp_ci[j][aces] and temp_nci[j][aces] by 1 
     252                if instances[i][label_indices[j]].value == '1': 
     253                    temp_ci[j][aces] = temp_ci[j][aces] + 1 
     254                else: 
     255                    temp_nci[j][aces] = temp_nci[j][aces] + 1 
     256                 
     257        # compute cond_probabilities[i][..] for labels based on temp_ci[] 
     258        for i in range(num_labels): 
     259            temp1 = 0 
     260            temp2 = 0 
     261            for j in range(k + 1): 
     262                temp1 += temp_ci[i][j] 
     263                temp2 += temp_nci[i][j] 
     264            for j in range(k + 1): 
     265                self.cond_probabilities[i][j] = (self.smooth + temp_ci[i][j]) / (self.smooth * (k + 1) + temp1) 
     266                self.cond_nprobabilities[i][j] = (self.smooth + temp_nci[i][j]) / (self.smooth * (k + 1) + temp2) 
    277267  
    278268class MLkNNClassifier(_multibase.MultiLabelClassifier):       
     
    285275            raise ValueError, "has no label attribute: 'the multilabel data should have at last one label attribute' " 
    286276         
    287         c,p = self.classifier(example,Orange.classification.Classifier.GetBoth) 
    288         str = c.value 
    289         for i in range(len(str)): 
    290             if str[i] == '0': 
     277        neighbors = self.knn.findNearest(example, self.k) 
     278        for i in range(num_labels): 
     279            # compute sum of aces in KNN 
     280            aces = 0  #num of aces in Knn for i 
     281            for m in range(self.k): 
     282                value = neighbors[m].get_class().value[i] 
     283                if value == '1': 
     284                    aces = aces + 1 
     285     
     286            prob_in = self.prior_probabilities[i] * self.cond_probabilities[i][aces] 
     287            prob_out = self.prior_nprobabilities[i] * self.cond_nprobabilities[i][aces] 
     288                 
     289            if prob_in > prob_out: 
     290                labels.append(Orange.data.Value(domain[self.label_indices[i]],'1')) 
     291            elif prob_in < prob_out: 
    291292                labels.append(Orange.data.Value(domain[self.label_indices[i]],'0')) 
    292                 prob.append(0.0) 
    293             elif str[i] == '1': 
    294                 labels.append(Orange.data.Value(domain[self.label_indices[i]],'1')) 
    295                 prob.append(1.0) 
    296293            else: 
    297                 raise ValueError, "invalid label value: 'the label value in instances should be only 0 or 1' " 
    298          
     294                rnd = random.randint(0,1) 
     295                if rnd == 0: 
     296                    labels.append(Orange.data.Value(domain[self.label_indices[i]],'0')) 
     297                else: 
     298                    labels.append(Orange.data.Value(domain[self.label_indices[i]],'1')) 
     299             
     300            #ranking function 
     301            prob.append( prob_in / (prob_in + prob_out) ) 
     302        
    299303        disc = Orange.statistics.distribution.Discrete(prob) 
    300304        disc.variable = Orange.core.EnumVariable(values = [domain[val].name for index,val in enumerate(self.label_indices)]) 
Note: See TracChangeset for help on using the changeset viewer.