Changeset 8123:4f7c394d8682 in orange


Ignore:
Timestamp:
07/28/11 18:13:58 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
cef2750b46fc89684539b92fe79b4cc61aea08c0
Message:

Added distance_matrix utility function.
Added Pearson/SpearmanRAbsolute distance measures.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/distance/instances.py

    r8059 r8123  
    347347        res = diff * self.icm * diff.transpose() 
    348348        return res[0,0]**0.5 
     349     
     350     
     351class PearsonRAbsoluteConstructor(PearsonRConstructor): 
     352    """ Construct an instance of PearsonRAbsolute example distance estimator. 
     353    """ 
     354    def __call__(self, data): 
     355        indxs = [i for i, a in enumerate(data.domain.attributes) \ 
     356                 if a.varType==Orange.data.Type.Continuous] 
     357        return PearsonRAbsolute(domain=data.domain, indxs=indxs) 
     358     
     359     
     360class PearsonRAbsolute(PearsonR): 
     361    """ An example distance estimator using absolute value of Pearson 
     362    correlation coefficient. 
     363    """ 
     364    def __call__(self, e1, e2): 
     365        """ 
     366        Return absolute Pearson's dissimilarity between e1 and e2, 
     367        i.e. 
     368         
     369        .. math:: (1 - abs(r))/2 
     370         
     371        where r is Pearson's correlation coefficient. 
     372        """ 
     373        X1 = []; X2 = [] 
     374        for i in self.indxs: 
     375            if not(e1[i].isSpecial() or e2[i].isSpecial()): 
     376                X1.append(float(e1[i])) 
     377                X2.append(float(e2[i])) 
     378        if not X1: 
     379            return 1.0 
     380        try: 
     381            return (1.0 - abs(statc.pearsonr(X1, X2)[0])) 
     382        except: 
     383            return 1.0 
     384         
     385         
     386class SpearmanRAbsoluteConstructor(SpearmanRConstructor): 
     387    """ Construct an instance of SpearmanRAbsolute example distance estimator. 
     388    """ 
     389    def __call__(self, data): 
     390        indxs = [i for i, a in enumerate(data.domain.attributes) \ 
     391                 if a.varType==Orange.data.Type.Continuous] 
     392        return SpearmanRAbsolute(domain=data.domain, indxs=indxs) 
     393     
     394     
     395class SpearmanRAbsolute(SpearmanR): 
     396    def __call__(self, e1, e2): 
     397        """ 
     398        Return absolute Spearman's dissimilarity between e1 and e2, 
     399        i.e. 
     400          
     401        .. math:: (1 - abs(r))/2 
     402         
     403        where r is Spearman's correlation coefficient. 
     404        """ 
     405        X1 = []; X2 = [] 
     406        for i in self.indxs: 
     407            if not(e1[i].isSpecial() or e2[i].isSpecial()): 
     408                X1.append(float(e1[i])) 
     409                X2.append(float(e2[i])) 
     410        if not X1: 
     411            return 1.0 
     412        try: 
     413            return (1.0 - abs(statc.spearmanr(X1, X2)[0])) 
     414        except: 
     415            return 1.0 
     416     
     417     
     418def distance_matrix(data, distance_constructor, progress_callback=None): 
     419    """ A helper function that computes an obj:`Orange.core.SymMatrix` of all 
     420    pairwise distances between instances in `data`. 
     421     
     422    :param data: A data table 
     423    :type data: :obj:`Orange.data.Table` 
     424     
     425    :param distance_constructor: An ExamplesDistance_Constructor instance. 
     426    :type distance_constructor: :obj:`Orange.distances.ExampleDistConstructor` 
     427     
     428    """ 
     429    from Orange.misc import progressBarMilestones as progress_milestones 
     430    matrix = Orange.core.SymMatrix(len(data)) 
     431    dist = distance_constructor(data) 
     432     
     433    msize = len(data)*(len(data) - 1)/2 
     434    milestones = progress_milestones(msize, 100) 
     435    count = 0 
     436    for i in range(len(data)): 
     437        for j in range(i + 1, len(data)): 
     438            matrix[i, j] = dist(data[i], data[j]) 
     439             
     440            if progress_callback and count in milestones: 
     441                progress_callback(100.0 * count / msize) 
     442            count += 1 
     443             
     444    return matrix 
Note: See TracChangeset for help on using the changeset viewer.