Ho un algoritmo di ricerca che viene utilizzato in combinazione con un algoritmo di apprendimento automatico. Ho separato i due perché volevo essere in grado di scambiare al volo algoritmi di ricerca. Tuttavia, l'accoppiamento è attualmente troppo stretto. Assomiglia a qualcosa:
class ML_Algorithm:
def __init__(self,observers):
import someMlLibrary
self.observers = observers
self.classifier = someMlLibrary.model()
self.searchWindow = SearchingWindow(self.__Classify)
def Train(self, trainingData):
preprocessedOutput = self.__Preprocess(trainingData)
transformedOutput = self.__Transform(preprocessedOutput)
self.classifier.fit(transformedOutput)
def __call__(self, data):
# The main entry point for all the processing
self.searchWindow.AddData(data)
for output in searchWindow:
self.UpdateObservers(output)
def __Classify(self, dataSubset):
preprocessedOutput = self.__Preprocess(dataSubset)
transformedOutput = self.__Transform(preprocessedOutput)
return self.classifier.predict(transformedOutput)
def __Prepocess(self,data):
import someLibrary
return someLibrary.doSomething(data)
def __Transform(self,data):
import someOtherLibrary
return someOtherLibrary.doSomething(data)
def UpdateObservers(self, output):
for observer in self.observers:
observer.OnOutput(output)
class Observer:
def OnOutput(self, output):
pass
class SearchingWindow:
def __init__(self, fn, negativeResult=0):
from collections import deque
self.fn = fn
self.buffer = deque(maxlen=1000)
self.negativeResult = negativeResult
def AddData(self, data):
self.buffer.extend(data)
def __iter__(self):
start = 0
step = 1
stop = 3*step
while notDone:
start, stop, step = self.GetNextStartStopStep(start, stop, step)
for i in range(start,stop,step):
dataSubset = self.buffer[start:stop]
result1, result2, ..., resultN = self.fn(dataSubset)
if result1 != self.negativeResult:
yield dataSubset
Ho realizzato l'accoppiamento stretto quando volevo accedere a result1, ..., resultN per fare alcuni test diagnostici attraverso l'oggetto ML_Algorithm ma non potevo.
Qualsiasi aiuto è molto apprezzato.