comparison python/indicators.py @ 322:28661c5887d3

Corrected a major bug for LCSS Added functions to test all alignments when computing the LCSS with a finite delta
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 07 May 2013 18:43:40 +0200
parents a5e40bd04cf4
children 1046b7346886
comparison
equal deleted inserted replaced
321:a5e40bd04cf4 322:28661c5887d3
119 average = len(l1)+len(l2)/2 119 average = len(l1)+len(l2)/2
120 DLCSS = 1- ((LCSS(l1,l2, threshold, delta, distance))/average) 120 DLCSS = 1- ((LCSS(l1,l2, threshold, delta, distance))/average)
121 return DLCSS 121 return DLCSS
122 122
123 123
124 def distanceForLCSS(x, y): # lambda x,y:abs(x-y)
125 if x == None or y == None:
126 return float('inf')
127 else:
128 return abs(x-y)
129
130 # non-aligned LCSS computations, ok for delta = inf
124 def computeLCSS(indicator1, indicator2, threshold, delta = float('inf')): 131 def computeLCSS(indicator1, indicator2, threshold, delta = float('inf')):
125 ''' compute the LCSS between two indicators using LCSS''' 132 ''' compute the LCSS between two indicators using LCSS'''
126 from utils import LCSS 133 from utils import LCSS
127 134 if indicator1 and indicator2:
128 def distance(x, y): # lambda x,y:abs(x-y) 135 return LCSS(indicator1.getValues(), indicator2.getValues(), threshold, distanceForLCSS, delta)
129 if x == None or y == None:
130 return float('inf')
131 else:
132 return abs(x-y)
133 if indicator1 and indicator2:
134 return LCSS(indicator1.getValues(), indicator2.getValues(), threshold, distance, delta)
135 else: 136 else:
136 return 0 137 return 0
137 138
138 def computeNormalizedLCSS(indicator1, indicator2, threshold, delta = float('inf'), method= 'min'): 139 def computeNormalizedLCSS(indicator1, indicator2, threshold, delta = float('inf'), method= min):
139 ''' compute the normalized LCSS between two indicators using LCSS 140 ''' compute the normalized LCSS between two indicators using LCSS
140 ie, the LCSS divided by the min or mean of the indicator lengths''' 141 ie, the LCSS divided by the min or mean of the indicator lengths'''
141 142 from utils import normalizedLCSS
142 if indicator1 and indicator2: 143 if indicator1 and indicator2:
143 if method == 'min': 144 return normalizedLCSS(indicator1.getValues(), indicator2.getValues(), threshold, distanceForLCSS, delta, method)
144 denominator = min(len(indicator1), len(indicator2))
145 elif method == 'mean':
146 denominator = float(len(indicator1) + len(indicator2))/2
147 else:
148 print('Unknown denominator method name')
149 denominator = 1.
150 return float(computeLCSS(indicator1, indicator2, threshold, delta))/denominator
151 else: 145 else:
152 return 0. 146 return 0.
153 147
154 def computeDLCSS(indicator1, indicator2, threshold, delta = float('inf'), method = 'min'): 148 def computeDLCSS(indicator1, indicator2, threshold, delta = float('inf'), method = min):
155 ''' compute the LCSS distance between two indicators using LCSS''' 149 ''' compute the LCSS distance between two indicators using LCSS'''
156 return 1-computeNormalizedLCSS(indicator1, indicator2, threshold, delta, method) 150 from utils import DLCSS
151 return DLCSS(indicator1.getValues(), indicator2.getValues(), threshold, distanceForLCSS, delta, method)
152
153 # aligned LCSS computations
154 def computeAlignedLCSS(indicator1, indicator2, threshold, delta = float('inf')):
155 ''' compute the aligned LCSS between two indicators using LCSS'''
156 from utils import alignedLCSS
157 if indicator1 and indicator2:
158 return alignedLCSS(indicator1.getValues(), indicator2.getValues(), threshold, distanceForLCSS, delta)
159 else:
160 return 0
161
162 def computeNormalizedAlignedLCSS(indicator1, indicator2, threshold, delta = float('inf'), method= min):
163 ''' compute the normalized aligned LCSS between two indicators using LCSS
164 ie, the LCSS divided by the min or mean of the indicator lengths'''
165 from utils import normalizedAlignedLCSS
166 if indicator1 and indicator2:
167 return normalizedAlignedLCSS(indicator1.getValues(), indicator2.getValues(), threshold, distanceForLCSS, delta, method)
168 else:
169 return 0.
170
171 def computeAlignedDLCSS(indicator1, indicator2, threshold, delta = float('inf'), method = min):
172 ''' compute the aligned LCSS distance between two indicators using LCSS'''
173 from utils import alignedDLCSS
174 return alignedDLCSS(indicator1.getValues(), indicator2.getValues(), threshold, distanceForLCSS, delta, method)
157 175
158 class SeverityIndicator(TemporalIndicator): 176 class SeverityIndicator(TemporalIndicator):
159 '''Class for severity indicators 177 '''Class for severity indicators
160 field mostSevereIsMax is True 178 field mostSevereIsMax is True
161 if the most severe value taken by the indicator is the maximum''' 179 if the most severe value taken by the indicator is the maximum'''