class CLAModel(object): def __init__(self): self.dim = 64**2 self.tp = TP(numberOfCols=64**2, cellsPerColumn=32, initialPerm=0.5, connectedPerm=0.5, minThreshold=10, newSynapseCount=40, permanenceInc=0.1, permanenceDec=0.00001, activationThreshold=int((64**2 * .02) / 2), globalDecay=0, burnIn=1, checkSynapseConsistency=False, pamLength=10) def train(self, sdr, learning): values = self.toArray(sdr, self.dim) self.tp.compute(values, learning, computeInfOutput=True) predictedCells = self.tp.getPredictedState() predictedColumns = predictedCells.max(axis=1) predictedBitmap = predictedColumns.nonzero()[0] return list(predictedBitmap) def toArray(self, lst, length): res = np.zeros(length, dtype="uint32") for val in lst: res[val] = 1 return res
class TPTrainer(): """Trainer for the temporal pooler. Takes word fingerprints from an input file and feeds them to the temporal pooler by first getting the SDR from the spatial pooler and then passing that to the temporal pooler. """ def __init__(self, sp_trainer): """ Parameters: ---------- sp_trainer : The spatial pooler trainer """ self.sp_trainer = sp_trainer self.input_array = np.zeros(self.sp_trainer.fp_length, dtype="int32") self.active_array = np.zeros(self.sp_trainer.num_columns, dtype="int32") self.is_learning = True self.compute_inference = False self.tp = TP(numberOfCols=self.sp_trainer.num_columns, cellsPerColumn=2, initialPerm=0.5, connectedPerm=0.5, minThreshold=10, newSynapseCount=10, permanenceInc=0.1, permanenceDec=0.0, activationThreshold=5, globalDecay=0, burnIn=1, checkSynapseConsistency=False, pamLength=10) def run(self, fp): """Run the spatial pooler and temporal pooler with the input fingerprint""" # clear the input_array to zero before creating a new input vector self.input_array[0:] = 0 self.input_array[list(fp)] = 1 # active_array[column] = 1 if column is active after spatial pooling self.sp_trainer.sp.compute(self.input_array, False, self.active_array) self.tp.compute(self.active_array, enableLearn=self.is_learning, computeInfOutput=self.compute_inference) if self.compute_inference: self.predicted_sdr = set( self.tp.getPredictedState().max(axis=1).nonzero()[0].flat) lemma_sdrs = np.array( [l for l in self.sp_trainer.lemma_to_sdr.values()]) # convert string key to list by stripping front and end: # Example: (array([ 8, 12, ... , 1018]),) all_lemma_sdrs = [ set(eval(l.last_sdr_key[7:-3])) for l in lemma_sdrs ] _, indexes = wordnet_fp.find_matching(self.predicted_sdr, all_lemma_sdrs, 1, 10) self.predicted_lemmas = lemma_sdrs[indexes]
def main(SEED): # input 生成 numOnBitsPerPattern = 3 (numCols, trainingSequences) = buildOverlappedSequences( numSequences = 2, # 生成するsequenceの数 seqLen = 5, # sequenceの長さ sharedElements = [2,3], # 異なるsequence間で同じものが含まれている番号 numOnBitsPerPattern = 3, # activeになるカラム数 patternOverlap = 0 # activeになるカラムが重なっている数 ) print numCols for sequence in trainingSequences: print sequence # TP生成 tp = TP( numberOfCols = numCols, cellsPerColumn = 2, initialPerm = 0.6, connectedPerm = 0.5, minThreshold = 3, newSynapseCount = 3, permanenceInc = 0.1, permanenceDec = 0.0, activationThreshold = 3, globalDecay = 0.0, burnIn = 1, seed = SEED, verbosity = 0, checkSynapseConsistency = True, pamLength = 1 ) # TP学習 for _ in range(10): for seq_num, sequence in enumerate(trainingSequences): for x in sequence: x = numpy.array(x).astype('float32') tp.compute(x, enableLearn = True, computeInfOutput=True) #tp.printStates(False, False) tp.reset() # TP 予測 for seq_num, sequence in enumerate(trainingSequences): for x in sequence: x = numpy.array(x).astype('float32') tp.compute(x, enableLearn = False, computeInfOutput = True) tp.printStates(False, False)
def run(): tp = TP(numberOfCols=121, cellsPerColumn=4, initialPerm=0.5, connectedPerm=0.5, minThreshold=11, newSynapseCount=11, permanenceInc=0.1, permanenceDec=0.05, activationThreshold=2, globalDecay=0, burnIn=1, checkSynapseConsistency=False, pamLength=3) Patcher().patchTP(tp) inputArray = numpy.zeros(tp.numberOfCols, dtype='int32') for i in range(100): generateInput(inputArray) tp.compute(inputArray, enableLearn = True, computeInfOutput = True) print "Ran iteration:\t{0}".format(i)
def run(): tp = TP(numberOfCols=121, cellsPerColumn=4, initialPerm=0.5, connectedPerm=0.5, minThreshold=11, newSynapseCount=11, permanenceInc=0.1, permanenceDec=0.05, activationThreshold=2, globalDecay=0, burnIn=1, checkSynapseConsistency=False, pamLength=3) Patcher().patchTP(tp) inputArray = numpy.zeros(tp.numberOfCols, dtype='int32') for i in range(100): generateInput(inputArray) tp.compute(inputArray, enableLearn=True, computeInfOutput=True) print "Ran iteration:\t{0}".format(i)
class AudioStream: def __init__(self): """ Instantiate temporal pooler, encoder, audio sampler, filter, & freq plot """ self.vis = Visualizations() """ The number of columns in the input and therefore the TP 2**9 = 512 Trial and error pulled that out numCols should be tested during benchmarking """ self.numCols = 2**9 sparsity = 0.10 self.numInput = int(self.numCols * sparsity) """ Create a bit map encoder From the encoder's __init__ method: 1st arg: the total bits in input 2nd arg: the number of bits used to encode each input bit """ self.e = SparsePassThroughEncoder(self.numCols, 1) """ Sampling details rate: The sampling rate in Hz of my soundcard buffersize: The size of the array to which we will save audio segments (2^12 = 4096 is very good) secToRecord: The length of each sampling buffersToRecord: how many multiples of buffers are we recording? """ rate = 44100 secToRecord = .1 self.buffersize = 2**12 self.buffersToRecord = int(rate * secToRecord / self.buffersize) if not self.buffersToRecord: self.buffersToRecord = 1 """ Filters in Hertz highHertz: lower limit of the bandpass filter, in Hertz lowHertz: upper limit of the bandpass filter, in Hertz max lowHertz = (buffersize / 2 - 1) * rate / buffersize """ highHertz = 500 lowHertz = 10000 """ Convert filters from Hertz to bins highpass: convert the highHertz into a bin for the FFT lowpass: convert the lowHertz into a bin for the FFt NOTES: highpass is at least the 1st bin since most mics only pick up >=20Hz lowpass is no higher than buffersize/2 - 1 (highest array index) passband needs to be wider than size of numInput - not checking for that """ self.highpass = max(int(highHertz * self.buffersize / rate), 1) self.lowpass = min(int(lowHertz * self.buffersize / rate), self.buffersize / 2 - 1) """ The call to create the temporal pooler region """ self.tp = TP(numberOfCols=self.numCols, cellsPerColumn=4, initialPerm=0.5, connectedPerm=0.5, minThreshold=10, newSynapseCount=10, permanenceInc=0.1, permanenceDec=0.07, activationThreshold=8, globalDecay=0.02, burnIn=2, checkSynapseConsistency=False, pamLength=100) """ Creating the audio stream from our mic """ p = pyaudio.PyAudio() #self.inStream = p.open(format=pyaudio.paInt32,channels=1,rate=rate,input=True,frames_per_buffer=self.buffersize) self.inStream = p.open(format=pyaudio.paInt32, channels=1, rate=rate, input=True, input_device_index=4, frames_per_buffer=self.buffersize) #参考 成功したpyaudio の設定 #stream = audio.open(format=pyaudio.paInt16, channels=CHANNELS,rate=RATE, input=True,input_device_index=4,frames_per_buffer=CHUNK) """ Setting up the array that will handle the timeseries of audio data from our input """ self.audio = numpy.empty((self.buffersToRecord * self.buffersize), dtype="uint32") """ Print out the inputs """ print "Number of columns:\t" + str(self.numCols) print "Max size of input:\t" + str(self.numInput) print "Sampling rate (Hz):\t" + str(rate) print "Passband filter (Hz):\t" + str(highHertz) + " - " + str( lowHertz) print "Passband filter (bin):\t" + str(self.highpass) + " - " + str( self.lowpass) print "Bin difference:\t\t" + str(self.lowpass - self.highpass) print "Buffersize:\t\t" + str(self.buffersize) """ Setup the plot Use the bandpass filter frequency range as the x-axis Rescale the y-axis """ plt.ion() bin = range(self.highpass, self.lowpass) xs = numpy.arange(len(bin)) * rate / self.buffersize + highHertz self.freqPlot = plt.plot(xs, xs)[0] plt.ylim(0, 10**12) while True: self.processAudio() def processAudio(self): """ Sample audio, encode, send it to the TP Pulls the audio from the mic Conditions that audio as an SDR Computes a prediction via the TP Update the visualizations """ """ Cycle through the multiples of the buffers we're sampling Sample audio to store for each frame in buffersize Mic voltage-level timeseries is saved as 32-bit binary Convert that 32-bit binary into integers, and save to array for the FFT """ for i in range(self.buffersToRecord): try: audioString = self.inStream.read(self.buffersize) except IOError: print "Overflow error from 'audiostring = inStream.read(buffersize)'. Try decreasing buffersize." quit() self.audio[i * self.buffersize:(i + 1) * self.buffersize] = numpy.fromstring(audioString, dtype="uint32") """ Get int array of strength for each bin of frequencies via fast fourier transform Get the indices of the strongest frequencies (the top 'numInput') Scale the indices so that the frequencies fit to within numCols Pick out the unique indices (we've reduced the mapping, so we likely have multiples) Encode those indices into an SDR via the SparsePassThroughEncoder Cast the SDR as a float for the TP """ ys = self.fft(self.audio, self.highpass, self.lowpass) #fft の結果 fs = numpy.sort( ys.argsort()[-self.numInput:]) #ysを昇順にソートして結果の上位から入力数だけのインデックス ufs = fs.astype(numpy.float32) / ( self.lowpass - self.highpass) * self.numCols #fsをフロートに変換して、バンド幅で割り、カラム数で割る。 ufs = ufs.astype(numpy.int32) ufs = numpy.unique(ufs) #重複をなくす actual = numpy.zeros(self.numCols, dtype=numpy.int32) for index in ufs: actual += self.e.encode(index) actualInt = actual """ Pass the SDR to the TP Collect the prediction SDR from the TP Pass the prediction & actual SDRS to the anomaly calculator & array comparer Update the frequency plot """ self.tp.compute(actual, enableLearn=True, computeInfOutput=True) predictedInt = self.tp.getPredictedState().max(axis=1) compare = self.vis.compareArray(actualInt, predictedInt) anomaly = self.vis.calcAnomaly(actualInt, predictedInt) print ".".join(compare) print self.vis.hashtagAnomaly(anomaly) self.freqPlot.set_ydata(ys) #plt.plot(self.xs,ys) plt.show(block=False) plt.draw() def fft(self, audio, highpass, lowpass): """ Fast fourier transform conditioning Output: 'output' contains the strength of each frequency in the audio signal frequencies are marked by its position in 'output': frequency = index * rate / buffesize output.size = buffersize/2 Method: Use numpy's FFT (numpy.fft.fft) Find the magnitude of the complex numbers returned (abs value) Split the FFT array in half, because we have mirror frequencies (they're the complex conjugates) Use just the first half to apply the bandpass filter Great info here: http://stackoverflow.com/questions/4364823/how-to-get-frequency-from-fft-result """ left, right = numpy.split(numpy.abs(numpy.fft.fft(audio)), 2) output = left[highpass:lowpass] return output
x[4,40:50] = 1 # Input SDR representing "E", corresponding to columns 40-49 ####################################################################### # # Step 3: send this simple sequence to the temporal pooler for learning # We repeat the sequence 10 times for i in range(10): # Send each letter in the sequence in order for j in range(5): # The compute method performs one step of learning and/or inference. Note: # here we just perform learning but you can perform prediction/inference and # learning in the same step if you want (online learning). tp.compute(x[j], enableLearn = True, computeInfOutput = False) # This function prints the segments associated with every cell. # If you really want to understand the TP, uncomment this line. By following # every step you can get an excellent understanding for exactly how the TP # learns. #tp.printCells() # The reset command tells the TP that a sequence just ended and essentially # zeros out all the states. It is not strictly necessary but it's a bit # messier without resets, and the TP learns quicker with resets. tp.reset() ####################################################################### #
x[3, 30:40] = 1 # Input SDR representing "D" x[4, 40:50] = 1 # Input SDR representing "E" ####################################################################### # # Step 3: send this simple sequence to the temporal pooler for learning # We repeat the sequence 10 times for i in range(10): # Send each letter in the sequence in order for j in range(5): # The compute method performs one step of learning and/or inference. Note: # here we just perform learning but you can perform prediction/inference and # learning in the same step if you want (online learning). tp.compute(x[j], enableLearn=True, computeInfOutput=False) # The reset command tells the TP that a sequence just ended and essentially # zeros out all the states. It is not strictly necessary but it's a bit # messier without resets, and the TP learns quicker with resets. tp.reset() ####################################################################### # # Step 3: send the same sequence of vectors and look at predictions made by # temporal pooler for j in range(5): print "\n\n--------", "ABCDE"[j], "-----------" print "Raw input vector\n", formatRow(x[j]) # Send each vector to the TP, with learning turned off
class AudioStream: def printWaveInfo(self, wf): """ WAVEファイルの情報を取得 """ print() print("チャンネル数:", wf.getnchannels() ) print("サンプル幅:", wf.getsampwidth() ) print("サンプリング周波数:", wf.getframerate() ) print("フレーム数:", wf.getnframes() ) print("パラメータ:", wf.getparams() ) print("長さ(秒):", float(wf.getnframes()) / wf.getframerate() ) print() def __init__(self, wf=None): """ wf = None : mic """ # Visualizations of result self.vis = Visualizations() # network parameter self.numCols = 2**9 # 2**9 = 512 sparsity = 0.10 self.numInput = int(self.numCols * sparsity) # encoder of audiostream self.e = BitmapArrayEncoder(self.numCols, 1) # setting audio p = pyaudio.PyAudio() if wf == None: self.wf = None channels = 1 rate = 44100 # sampling周波数: 1秒間に44100回 secToRecord = .1 # self.buffersize = 2**12 self.buffersToRecord=int(rate*secToRecord/self.buffersize) if not self.buffersToRecord: self.buffersToRecord = 1 audio_format = pyaudio.paInt32 else: self.printWaveInfo(wf) channels = wf.getnchannels() self.wf = wf rate = wf.getframerate() secToRecord = wf.getsampwidth() self.buffersize = 1024 self.buffersToRecord=int(rate*secToRecord/self.buffersize) if not self.buffersToRecord: self.buffersToRecord = 1 audio_format = p.get_format_from_width(secToRecord) self.inStream = p.open( format=audio_format, channels=channels, rate=rate, input=True, output=True, frames_per_buffer=self.buffersize) self.audio = numpy.empty((self.buffersToRecord*self.buffersize), dtype="uint32") # filters in Hertz # max lowHertz = (buffersize / 2-1) * rate / buffersize highHertz = 500 lowHertz = 10000 # Convert filters from Hertz to bins self.highpass = max(int(highHertz * self.buffersize /rate), 1) self.lowpass = min(int(lowHertz * self.buffersize / rate), self.buffersize/2 -1) # Temporal Pooler self.tp = TP( numberOfCols = self.numCols, cellsPerColumn = 4, initialPerm = 0.5, connectedPerm = 0.5, minThreshold = 10, newSynapseCount = 10, permanenceInc = 0.1, permanenceDec = 0.07, activationThreshold = 8, globalDecay = 0.02, burnIn = 2, checkSynapseConsistency = False, pamLength = 100 ) print("Number of columns: ", str(self.numCols)) print("Max size of input: ", str(self.numInput)) print("Sampling rate(Hz): ", str(rate)) print("Passband filter(Hz): ", str(highHertz), " - ", str(lowHertz)) print("Passband filter(bin):", str(self.highpass), " - ", str(self.lowpass)) print("Bin difference: ", str(self.lowpass - self.highpass)) print("Buffersize: ", str(self.buffersize)) # # setup plot # plt.ion() # bin = range(self.highpass, self.lowpass) # xs = numpy.arange(len(bin)*rate/self.buffersize + highHertz) # self.freqPlot = plt.plot(xs, xs)[0] # plt.ylim(0, 10**12) def plotPerformance(self, values, window=1000): plt.clf() plt.plot(values[-window:]) plt.gcf().canvas.draw() # Without the next line, the pyplot plot won't actually show up. plt.pause(0.001) def playAudio(self): """ 指定されているwaveを再生 同時に波形をplot """ chunk = 22050 # 音源が0.5秒毎に切り替わっていたため. data = self.wf.readframes(chunk) #plt.ion() #data_list = [] predictedInt = None plt.figure(figsize=(15, 5)) while data != '': dat = numpy.fromstring(data, dtype = "uint32") #print(dat.shape, dat) # plot data_list = dat.tolist() self.plotPerformance(data_list, window=500) # plt.plot(dat) # plt.show(block = False) # plt.draw() # 音ならす. self.inStream.write(data) # sampling値 -> SDR actualInt, actual = self.encoder(data_list) # actualInt, predictedInt 比較 if not predictedInt == None: compare = self.vis.compareArray(actualInt, predictedInt) print("." . join(compare) ) anomaly = self.vis.calcAnomaly(actualInt, predictedInt) print(self.vis.hashtagAnomaly(anomaly) ) # TP predict predictedInt = self.tp_learn_and_predict(actual) # 次のデータ data = self.wf.readframes(chunk) self.inStream.close() p.terminate() def tp_learn_and_predict(self, data): self.tp.compute(data, enableLearn = True, computeInfOutput = True) predictedInt = self.tp.getPredictedState().max(axis=1) return predictedInt def encoder(self, data): # sampling 値 -> 周波数成分 ys = self.fft(data, self.highpass, self.lowpass) # 1. 強い周波数成分の上位numInputのindexを取得する. # 2. 数字のレンジをnumColsに合わせる. # 3. uniqにする. (いるの?) fs = numpy.sort(ys.argsort()[-self.numInput:]) rfs = fs.astype(numpy.float32) / (self.lowpass - self.highpass) * self.numCols ufs = numpy.unique(rfs) # encode actualInt = self.e.encode(ufs) actual = actualInt.astype(numpy.float32) return actualInt, actual def fft(self, audio, highpass, lowpass): left, right = numpy.split(numpy.abs(numpy.fft.fft(audio)), 2) output = left[highpass:lowpass] return output def formatRow(self, x): s = '' for c in range(len(x)): if c > 0 and c % 10 == 0: s += ' ' s += str(x[c]) s += ' ' return s def getAudioString(self): if self.wf == None: print(self.buffersToRecord) for i in range(self.buffersToRecord): try: audioString = self.inStream.read(self.buffersize) except IOError: print("Overflow error from 'audiostring = inStream.read(buffersize)'. Try decreasing buffersize.") quit() self.audio[i*self.buffersize:(i+1)*self.buffersize] = numpy.fromstring(audioString, dtype = "uint32") else: for i in range(self.buffersToRecord): audioString = self.wf.readframes(self.buffersize) self.audio[i*self.buffersize:(i+1)*self.buffersize] = numpy.fromstring(audioString, dtype = "uint32") def plotWave(self): self.getAudioString() print(self.audio) plt.plot(audiostream.audio[0:1000]) plt.show()
class AudioStream: def __init__(self): """ Instantiate temporal pooler, encoder, audio sampler, filter, & freq plot """ self.vis = Visualizations() """ The number of columns in the input and therefore the TP 2**9 = 512 Trial and error pulled that out numCols should be tested during benchmarking """ self.numCols = 2**9 sparsity = 0.10 self.numInput = int(self.numCols * sparsity) """ Create a bit map encoder From the encoder's __init__ method: 1st arg: the total bits in input 2nd arg: the number of bits used to encode each input bit """ self.e = SparsePassThroughEncoder(self.numCols, 1) """ Sampling details rate: The sampling rate in Hz of my soundcard buffersize: The size of the array to which we will save audio segments (2^12 = 4096 is very good) secToRecord: The length of each sampling buffersToRecord: how many multiples of buffers are we recording? """ rate=44100 secToRecord=.1 self.buffersize=2**12 self.buffersToRecord=int(rate*secToRecord/self.buffersize) if not self.buffersToRecord: self.buffersToRecord=1 """ Filters in Hertz highHertz: lower limit of the bandpass filter, in Hertz lowHertz: upper limit of the bandpass filter, in Hertz max lowHertz = (buffersize / 2 - 1) * rate / buffersize """ highHertz = 500 lowHertz = 10000 """ Convert filters from Hertz to bins highpass: convert the highHertz into a bin for the FFT lowpass: convert the lowHertz into a bin for the FFt NOTES: highpass is at least the 1st bin since most mics only pick up >=20Hz lowpass is no higher than buffersize/2 - 1 (highest array index) passband needs to be wider than size of numInput - not checking for that """ self.highpass = max(int(highHertz * self.buffersize / rate),1) self.lowpass = min(int(lowHertz * self.buffersize / rate), self.buffersize/2 - 1) """ The call to create the temporal pooler region """ self.tp = TP(numberOfCols=self.numCols, cellsPerColumn=4, initialPerm=0.5, connectedPerm=0.5, minThreshold=10, newSynapseCount=10, permanenceInc=0.1, permanenceDec=0.07, activationThreshold=8, globalDecay=0.02, burnIn=2, checkSynapseConsistency=False, pamLength=100) """ Creating the audio stream from our mic """ p = pyaudio.PyAudio() self.inStream = p.open(format=pyaudio.paInt32,channels=1,rate=rate,input=True,frames_per_buffer=self.buffersize) """ Setting up the array that will handle the timeseries of audio data from our input """ self.audio = numpy.empty((self.buffersToRecord*self.buffersize),dtype="uint32") """ Print out the inputs """ print "Number of columns:\t" + str(self.numCols) print "Max size of input:\t" + str(self.numInput) print "Sampling rate (Hz):\t" + str(rate) print "Passband filter (Hz):\t" + str(highHertz) + " - " + str(lowHertz) print "Passband filter (bin):\t" + str(self.highpass) + " - " + str(self.lowpass) print "Bin difference:\t\t" + str(self.lowpass - self.highpass) print "Buffersize:\t\t" + str(self.buffersize) """ Setup the plot Use the bandpass filter frequency range as the x-axis Rescale the y-axis """ plt.ion() bin = range(self.highpass,self.lowpass) xs = numpy.arange(len(bin))*rate/self.buffersize + highHertz self.freqPlot = plt.plot(xs,xs)[0] plt.ylim(0, 10**12) while True: self.processAudio() def processAudio (self): """ Sample audio, encode, send it to the TP Pulls the audio from the mic Conditions that audio as an SDR Computes a prediction via the TP Update the visualizations """ """ Cycle through the multiples of the buffers we're sampling Sample audio to store for each frame in buffersize Mic voltage-level timeseries is saved as 32-bit binary Convert that 32-bit binary into integers, and save to array for the FFT """ for i in range(self.buffersToRecord): try: audioString = self.inStream.read(self.buffersize) except IOError: print "Overflow error from 'audiostring = inStream.read(buffersize)'. Try decreasing buffersize." quit() self.audio[i*self.buffersize:(i + 1)*self.buffersize] = numpy.fromstring(audioString,dtype = "uint32") """ Get int array of strength for each bin of frequencies via fast fourier transform Get the indices of the strongest frequencies (the top 'numInput') Scale the indices so that the frequencies fit to within numCols Pick out the unique indices (we've reduced the mapping, so we likely have multiples) Encode those indices into an SDR via the SparsePassThroughEncoder Cast the SDR as a float for the TP """ ys = self.fft(self.audio, self.highpass, self.lowpass) fs = numpy.sort(ys.argsort()[-self.numInput:]) rfs = fs.astype(numpy.float32) / (self.lowpass - self.highpass) * self.numCols ufs = numpy.unique(rfs) actualInt = self.e.encode(ufs) actual = actualInt.astype(numpy.float32) """ Pass the SDR to the TP Collect the prediction SDR from the TP Pass the prediction & actual SDRS to the anomaly calculator & array comparer Update the frequency plot """ self.tp.compute(actual, enableLearn = True, computeInfOutput = True) predictedInt = self.tp.getPredictedState().max(axis=1) compare = self.vis.compareArray(actualInt, predictedInt) anomaly = self.vis.calcAnomaly(actualInt, predictedInt) print "." . join(compare) print self.vis.hashtagAnomaly(anomaly) self.freqPlot.set_ydata(ys) plt.show(block = False) plt.draw() def fft(self, audio, highpass, lowpass): """ Fast fourier transform conditioning Output: 'output' contains the strength of each frequency in the audio signal frequencies are marked by its position in 'output': frequency = index * rate / buffesize output.size = buffersize/2 Method: Use numpy's FFT (numpy.fft.fft) Find the magnitude of the complex numbers returned (abs value) Split the FFT array in half, because we have mirror frequencies (they're the complex conjugates) Use just the first half to apply the bandpass filter Great info here: http://stackoverflow.com/questions/4364823/how-to-get-frequency-from-fft-result """ left,right = numpy.split(numpy.abs(numpy.fft.fft(audio)),2) output = left[highpass:lowpass] return output
# train temporal pooler with desired state #desiredState = exputils.getRandom2dBoolMatrix(inputWidth, inputHeight).flatten() #print "training temporal pooler" #for x in xrange(0, inputWidth * inputHeight * 100): # temporalPooler.compute(bottomUpInput = desiredState, enableLearn = True, computeInfOutput = False) #print "training temporal pooler complete\n" #temporalPooler.printCells() # train temporal pooler with random data print "training temporal pooler" for x in xrange(0, inputWidth * inputHeight * 100): trainingData = exputils.getRandom2dBoolMatrix(inputWidth, inputHeight).flatten() temporalPooler.compute(bottomUpInput=trainingData, enableLearn=True, computeInfOutput=False) print "training temporal pooler complete\n" #temporalPooler.printCells() #--------------------- define transform ----------------------- def applyTransform(base, manipulator): # simple bit flip for x in range(0, len(manipulator)): if manipulator[x] == 1: baseValue = base[x] if baseValue == 0: baseValue = 1 else:
tp = TP(numberOfCols=date_enc.width, cellsPerColumn=1795, initialPerm=0.5, connectedPerm=0.5, minThreshold=10, newSynapseCount=10, permanenceInc=0.1, permanenceDec=0.01, activationThreshold=5, globalDecay=0, burnIn=1, checkSynapseConsistency=False, pamLength=7) days = [datetime.date(y, m, d) for y in range(1998, 2013) for m in range(1, 13) for d in range(1, calendar.monthrange(y, m)[1] + 1)] print days[0], days[1], days[-2], days[-1] input_array = numpy.zeros(date_enc.width, dtype="int32") for pres in xrange(10): print 'Pass', pres for i, d in enumerate(days): if (i + 1) % 100 == 0: print i + 1 if (i + 1) % 28 == 0: tp.reset() input_array[:] = numpy.concatenate(date_enc.encodeEachField(DateRecord(d))) tp.compute(input_array, enableLearn=True, computeInfOutput=False) #input_array[:] = numpy.concatenate(date_enc.encodeEachField(DateRecord(days[i + 1]))) #tp.compute(input_array, enableLearn=True, computeInfOutput=False) print "saving TP to tp.p and tp.tp" tp.saveToFile("tp.tp") with open("tp.p", "w") as f: pickle.dump(tp, f)
globalDecay=0, burnIn=1, checkSynapseConsistency=False, pamLength=7) days = [ datetime.date(y, m, d) for y in range(1998, 2013) for m in range(1, 13) for d in range(1, calendar.monthrange(y, m)[1] + 1) ] print days[0], days[1], days[-2], days[-1] input_array = numpy.zeros(date_enc.width, dtype="int32") for pres in xrange(10): print 'Pass', pres for i, d in enumerate(days): if (i + 1) % 100 == 0: print i + 1 if (i + 1) % 28 == 0: tp.reset() input_array[:] = numpy.concatenate( date_enc.encodeEachField(DateRecord(d))) tp.compute(input_array, enableLearn=True, computeInfOutput=False) #input_array[:] = numpy.concatenate(date_enc.encodeEachField(DateRecord(days[i + 1]))) #tp.compute(input_array, enableLearn=True, computeInfOutput=False) print "saving TP to tp.p and tp.tp" tp.saveToFile("tp.tp") with open("tp.p", "w") as f: pickle.dump(tp, f)
def main(): # create Temporal Pooler instance tp = TP(numberOfCols=50, # カラム数 cellsPerColumn=2, # 1カラム中のセル数 initialPerm=0.5, # initial permanence connectedPerm=0.5, # permanence の閾値 minThreshold=10, # 末梢樹状セグメントの閾値の下限? newSynapseCount=10, # ? permanenceInc=0.1, # permanenceの増加 permanenceDec=0.0, # permanenceの減少 activationThreshold=8, # synapseの発火がこれ以上かを確認している. globalDecay=0, # decrease permanence? burnIn=1, # Used for evaluating the prediction score checkSynapseConsistency=False, pamLength=10 # Number of time steps ) # create input vectors to feed to the temporal pooler. # Each input vector must be numberOfCols wide. # Here we create a simple sequence of 5 vectors # representing the sequence A -> B -> C -> D -> E x = numpy.zeros((5,tp.numberOfCols), dtype="uint32") x[0, 0:10] = 1 # A x[1,10:20] = 1 # B x[2,20:30] = 1 # C x[3,30:40] = 1 # D x[4,40:50] = 1 # E print x # repeat the sequence 10 times for i in range(10): # Send each letter in the sequence in order # A -> B -> C -> D -> E print print print '#### :', i for j in range(5): tp.compute(x[j], enableLearn = True, computeInfOutput=True) #tp.printCells(predictedOnly=False) tp.printStates(printPrevious = False, printLearnState = False) # sequenceの最後を教える. 絶対必要なわけではないが, あった方が学習速い. tp.reset() for j in range(5): print "\n\n--------","ABCDE"[j],"-----------" print "Raw input vector\n",formatRow(x[j]) # Send each vector to the TP, with learning turned off tp.compute(x[j], enableLearn = False, computeInfOutput = True) # print predict state print "\nAll the active and predicted cells:" tp.printStates(printPrevious = False, printLearnState = False) # get predict state print "\n\nThe following columns are predicted by the temporal pooler. This" print "should correspond to columns in the *next* item in the sequence." predictedCells = tp.getPredictedState() print formatRow(predictedCells.max(axis=1).nonzero())