Ejemplo n.º 1
0
 def distance(self, first: Instance, second: Instance, a0=None, a1=None):
     if a0 is None or isinstance(a0, PerformanceStats):
         return self.distance(first, second, float("inf"), a0)
     elif isinstance(a0, float):
         distance = 0
         firstNumValues = first.numValues()
         secondNumValues = second.numValues()
         numAttributes = self.m_Data.numAttributes()
         classIndex = self.m_Data.classIndex()
         self.validate()
         p1 = p2 = 0
         while p1 < firstNumValues or p2 < secondNumValues:
             if p1 >= firstNumValues:
                 firstI = numAttributes
             else:
                 firstI = first.index(p1)
             if p2 >= secondNumValues:
                 secondI = numAttributes
             else:
                 secondI = second.index(p2)
             if firstI == classIndex:
                 p1 += 1
                 continue
             if firstI < numAttributes and not self.m_ActiveIndices[firstI]:
                 p1 += 1
                 continue
             if secondI == classIndex:
                 p2 += 1
                 continue
             if secondI < numAttributes and not self.m_ActiveIndices[
                     secondI]:
                 p2 += 1
                 continue
             if firstI == secondI:
                 diff = self.difference(firstI, first.valueSparse(p1),
                                        second.valueSparse(p2))
                 p1 += 1
                 p2 += 1
             elif firstI > secondI:
                 diff = self.difference(secondI, 0, second.valueSparse(p2))
                 p2 += 1
             else:
                 diff = self.difference(firstI, first.valueSparse(p1), 0)
                 p1 += 1
             if isinstance(a1, PerformanceStats):
                 a1.incrCoordCount()
             distance = self.updateDistance(distance, diff)
             if distance > a0:
                 return float('inf')
         return distance
Ejemplo n.º 2
0
 def updateRanges(self, instance: Instance, ranges: List[List[float]]):
     numVals = instance.numValues()
     prevIndex = 0
     for j in range(numVals):
         currIndex = instance.index(j)
         while prevIndex < currIndex:
             if 0 < ranges[prevIndex][self.R_MIN]:
                 ranges[prevIndex][self.R_MIN] = 0
                 ranges[prevIndex][self.R_WIDTH] = ranges[prevIndex][
                     self.R_MAX] - ranges[prevIndex][self.R_MIN]
             if 0 > ranges[prevIndex][self.R_MAX]:
                 ranges[prevIndex][self.R_MAX] = 0
                 ranges[prevIndex][self.R_WIDTH] = ranges[prevIndex][
                     self.R_MAX] - ranges[prevIndex][self.R_MIN]
             prevIndex += 1
         prevIndex += 1
         if not instance.isMissingSparse(j):
             val = instance.valueSparse(j)
             if val < ranges[currIndex][self.R_MIN]:
                 ranges[currIndex][self.R_MIN] = val
                 ranges[currIndex][self.R_WIDTH] = ranges[currIndex][
                     self.R_MAX] - ranges[currIndex][self.R_MIN]
             if val > ranges[currIndex][self.R_MAX]:
                 ranges[currIndex][self.R_MAX] = val
                 ranges[currIndex][self.R_WIDTH] = ranges[currIndex][
                     self.R_MAX] - ranges[currIndex][self.R_MIN]
     return ranges
Ejemplo n.º 3
0
 def updateRangesFirst(self, instance: Instance, numAtt: int,
                       ranges: List[List]):
     for i in range(len(ranges)):
         for j in range(len(ranges[i])):
             ranges[i][j] = 0
     numVals = instance.numValues()
     for j in range(numVals):
         currIndex = instance.index(j)
         if not instance.isMissingSparse(j):
             return True
     return False