فهرست منبع

Upload files to ''

valapil 2 سال پیش
والد
کامیت
9720ea551b
1فایلهای تغییر یافته به همراه61 افزوده شده و 0 حذف شده
  1. 61 0
      TSPerformanceMeasure.py

+ 61 - 0
TSPerformanceMeasure.py

@@ -0,0 +1,61 @@
+def overlapintervals(i1, i2):
+    """
+    Calculate intersection of two lists of intervals.
+
+    :param i1: list of intervals
+    :param i2: list of intervals
+
+    :return: list of intervals with overlap of both intervals only
+    """
+    ollist = []
+    for i in i1:
+        for j in i2:
+            if j[0] < i[0]+i[1] and j[0]+j[1] > i[0]:
+                ollist += [[max(i[0], j[0]),
+                            min(i[0]+i[1], j[0]+j[1])-max(i[0], j[0])]]
+    return ollist
+
+
+
+def calcPrecisionRecall(detection, groundtruth, setlength):
+    """
+    Calculated precision and recall for intervals in time series
+
+    :param detection: array with detected intervals
+    :param groundtruth: array with ground truth
+    :param setlength: length of time series
+
+    :return: precision, recall
+    """
+    import numpy as np
+
+
+    if len(groundtruth) == 0 and len(detection) == 0:
+        precision = 1
+        recall = 1
+    else:
+        # Turn detection into array
+        detArray = IntervalsToBinary(detection, setlength)
+        gtArray = IntervalsToBinary(groundtruth, setlength)
+        if np.sum(gtArray) == 0:
+            gtArray = -1 * (gtArray - 1)
+            detArray = -1*(detArray-1)
+
+        unique, counts = np.unique(detArray+gtArray, return_counts=True)
+        countvalues = dict(zip(unique, counts))
+        tp = countvalues[2] if 2 in countvalues else 0
+        tn = countvalues[0] if 0 in countvalues else 0
+
+        unique, counts = np.unique(detArray-gtArray, return_counts=True)
+        countvalues = dict(zip(unique, counts))
+        fp = countvalues[1] if 1 in countvalues else 0
+
+        unique, counts = np.unique(gtArray-detArray, return_counts=True)
+        countvalues = dict(zip(unique, counts))
+        fn = countvalues[1] if 1 in countvalues else 0
+
+        precision = tp / (tp + fp) if tp + fp > 0 else 0
+        recall = tp / (fn + tp) if tp + fn > 0 else 0
+
+    #print(detection, groundtruth, precision, recall)
+    return precision, recall