Changeset 7703:f44c8b063fe7 in orange


Ignore:
Timestamp:
02/21/11 13:18:10 (3 years ago)
Author:
mocnik <mocnik@…>
Branch:
default
Convert:
34a659efda618c1ff6ab0f5880ae783bd82621bd
Message:

Added Mahalanobis distance to the Orange.distances

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/distances/__init__.py

    r7659 r7703  
    198198 
    199199import statc 
     200import numpy 
     201from numpy import linalg 
    200202 
    201203class PearsonRConstructor(ExamplesDistanceConstructor): 
     
    291293            return 1.0 
    292294 
     295class MahalanobisConstructor(ExamplesDistanceConstructor): 
     296    """ Construct instance of Mahalanobis. """ 
     297     
     298    def __new__(cls, data=None, **argkw): 
     299        self = ExamplesDistanceConstructor.__new__(cls, **argkw) 
     300        self.__dict__.update(argkw) 
     301        if data: 
     302            return self.__call__(data) 
     303        else: 
     304            return self 
     305     
     306    # Check attributtes a, b, c 
     307    def __call__(self, table, a=None, b=None, c=None, **argkw): 
     308        # Process data 
     309        dc = Orange.core.DomainContinuizer() 
     310        dc.classTreatment = Orange.core.DomainContinuizer.Ignore 
     311        dc.continuousTreatment = Orange.core.DomainContinuizer.NormalizeBySpan 
     312        dc.multinomialTreatment = Orange.core.DomainContinuizer.NValues 
     313         
     314        newdomain = dc(table) 
     315        newtable = table.translate(newdomain) 
     316         
     317        data, cls, _ = newtable.to_numpy() 
     318         
     319        covariance_matrix = numpy.cov(data, rowvar=0) 
     320        inverse_covariance_matrix = linalg.pinv(covariance_matrix, rcond=1e-10) 
     321         
     322        return Mahalanobis(domain=newdomain, icm=inverse_covariance_matrix) 
     323 
     324class Mahalanobis(ExamplesDistance): 
     325    """`Mahalanobis distance 
     326    <http://en.wikipedia.org/wiki/Mahalanobis_distance>`_""" 
     327 
     328    def __init__(self, domain, icm, **argkw): 
     329        self.domain = domain 
     330        self.icm = icm 
     331        self.__dict__.update(argkw) 
     332         
     333    def __call__(self, e1, e2): 
     334        """ 
     335        :param e1: data instances. 
     336        :param e2: data instances. 
     337         
     338        Returns Mahalanobis distance between e1 and e2. 
     339        """ 
     340        e1 = Orange.data.Instance(self.domain, e1) 
     341        e2 = Orange.data.Instance(self.domain, e2) 
     342         
     343        diff = [] 
     344        for i in range(len(self.domain.attributes)): 
     345            diff.append(e1[i].value - e2[i].value) if not(e1[i].isSpecial() or e2[i].isSpecial()) else 0.0 
     346        diff = numpy.asmatrix(diff) 
     347        res = diff * self.icm * diff.transpose() 
     348        return res[0,0]**0.5 
Note: See TracChangeset for help on using the changeset viewer.