Hi Matt, Sounds like you have some labeled data you want to train NuPIC with, where S1 is the raw data and S2 are the feature labels. The intent is to train NuPIC on labeled data, and then pass in unlabeled data, having NuPIC infer the categorization. Is that right?
So, I'm not sure that this will work. NuPIC may not be learning the patterns within S1 that represent the feature labels in S2. It could be learning the pattern of S2 itself over time. When you get the swarm results, pay close attention to which field is given an encoder in the model params it creates. If it encodes S1 and not S2, that is a good sign. If it only encodes S2, that means it didn't pick up a direct correlation between S1 and S2, and it will only be paying attention to S2 patterns. You don't want this. If it encodes both fields, it is making inferences based on both input fields. Another tactic that has been used in the past is to use anomaly values for categorization. This is a more complex process for several reasons. For this method, you should need to pre-process your data into several data sets, each representing one feature. This could be tricky, especially if your data is timestamped, and the timestamp is important to feature categorization. Then you train one NuPIC model for each feature, so that each model learns the patterns of one feature only. This will likely require swarming only once, since the input data (no matter the feature) pretty much has the same characteristics. You can use the same model params for each model you're training. Just send different feature sets into each one. You'll end up with a set of models that have learned the patterns of each feature, and are ignorant of the other features. Theoretically, each model will return lower anomaly scores if it sees data over time that fits inside the feature patterns it has learned during training. For this method, you would not need S2 at all. The features would instead be "labelled" by training different NuPIC models on different features. Once your models are trained, you would pass real data into each model, each input data row being processed simultaneously by each feature-detecting model. Each model would have an inference type of "TemporalAnomaly", and the model results will contain an "anomaly_score". The model with the lowest anomaly score would be the winner, thus classifying the input data at that point in time. This tactic has worked in the past for classifying EEG data, but not a lot of further work as been done with it. Keep in mind that your features must be discrete and known ahead of time for this to work, so it may not work for you. However, if new features are identified over time, new models could be trained and added to the ensemble at a later time, thus expanding the possible categories at the expense of memory and CPU. I hope this helps, --------- Matt Taylor OS Community Flag-Bearer Numenta On Sat, May 16, 2015 at 7:32 AM, Matt Harvey <[email protected]> wrote: > Hi, > > > I'm just starting out with nupic, nd would really appreciate a pointer or > two on which inference model is best for my task. > > I'm trying to train a model to to perform a specific feature detection task > on discrete data. My Input data is: > > * S1 a set of N discrete category values representing features derived from > raw spatial-domain data > * S2 a set of N feature categorisations of S1 sequences, where element S2_i > can -- broadly speaking -- be determined from { S1_(i-n) ... S1_(i+n) } > (although exact value of n is unknown) > > I would like to train a model to learn to perform the S1->S2 feature > categorisation. For a given sequence S1, the model should give a best guess > at the likely feature for each element. > > My initial attempt, based on the one_gym and opf examples, is to treat the > data as a temporal sequence and train a TemporalMultiStep on each > {S1_i,S2_i} tuple (using the "string" type for the data). > > I don't know how successful this is going to be (still swarming...) , but I > can already see some problems. My questions are: > > * Is TemporalMultiStep the right inference type for this? (I don't need > prediction at future i, just an inference of S2_i). Would TemporalClassifier > be more appropriate? > > * In the case where all of the S1 set is known in advance, treating the data > as temporal input means that the model is unable to learn from 'future' > input, which is certainly going to make the feature learning harder. (Though > I could combine results inference from running S1 both forwards and > backwards through the model?) > > Would it instead be better to try a classification of intervals over S1, eg > giving as inputs { {S1_i-n .. S1_i+n}, S2_i } ?. In that case, would it be > better to treat this with a non-temporal model? (NontemporalClassifier?) > > I'd be most grateful any opinions or advice. > > Cheers, > > Matt
