import numpy as np import math from detector import ChangeDetector class EntropyDetector(ChangeDetector): def __init__(self, threshold=4): super( EntropyDetector, self ).__init__() self.entropy_ = 0 self.oldEntropy = 0 self.threshold = threshold self.freqList = {} self.sum_ = 0 def update(self, new_signal_value): super(EntropyDetector, self).update(new_signal_value) x = new_signal_value if x in self.freqList: self.freqList[x] += 1 else: self.freqList[x] = 1 self.oldEntropy = self.entropy_ for f in self.freqList: p_x = float(self.signal.count(x))/self.signal_size print(p_x) if p_x > 0: self.entropy_ += - p_x * math.log(p_x, 2) #print(self.entropy_) self.sum_ = self.sum_ + self.entropy_ - self.oldEntropy; def check_stopping_rules(self, new_signal_value): self.rules_triggered = False #print("entropy:", self.entropy_) #if self.entropy_ > self.threshold: if np.abs(self.sum_) > self.threshold: self.rules_triggered = True self.entropy_ = 0 self.signal = [] self.signal_size = 0 self.freqList = {} self.sum_ = 0 def entrop(self, data): entropy = 0 for x in range(len(data)): p_x = float(data.count(x))/len(data) if p_x > 0: entropy += - p_x*math.log(p_x, 2) return entropy