Nicholas, can you paste a sample of the input data file? --------- Matt Taylor OS Community Flag-Bearer Numenta
On Thu, Dec 11, 2014 at 7:50 AM, Nicholas Mitri <[email protected]> wrote: > Hey all, > > I’m running into some trouble with using HTM for a gesture recognition > application and would appreciate some help. > First, the data is collected from 17 users performing 5 gestures of each > of 16 different gesture classes using motion sensors. The feature vector > for each sample is a sequence of discretized directions calculated using > bezier control points after curve fitting the gesture trace. > > For a baseline, I fed the data to 16 10-state HMMs for training and again > for testing. The classification accuracy achieved is 95.7%. > > For HTM, I created 16 CLA models using parameters from a medium swarm. I > ran the data through the models for training where each model is trained on > only 1 gesture class. For testing, I fed the same data again with learning > turned off and recorded the anomaly score (averaged across each sequence) > for each model. Classification was done by seeking the model with the > minimum anomaly score. Accuracy turned out to be a puzzling 0.0%!! > > Below is the relevant section of the code. I would appreciate any hints. > Thanks, > Nick > > def run_experiment(): > print "Running experiment..." > > model = [0]*16 > for i in range(0, 16): > model[i] = ModelFactory.create(model_params, logLevel=0) > model[i].enableInference({"predictedField": FIELD_NAME}) > > with open(FILE_PATH, "rb") as f: > csv_reader = csv.reader(f) > data = [] > labels = [] > for row in csv_reader: > r = [int(item) for item in row[:-1]] > data.append(r) > labels.append(int(row[-1])) > > # data_train, data_test, labels_train, labels_test = > cross_validation.train_test_split(data, labels, test_size=0.4, > random_state=0) > data_train = data > data_test = data > labels_train = labels > labels_test = labels > > for passes in range(0, TRAINING_PASSES): > sample = 0 > for (ind, row) in enumerate(data_train): > for r in row: > value = int(r) > result = model[labels_train[ind]].run({FIELD_NAME: value, > '_learning': True}) > prediction = > result.inferences["multiStepBestPredictions"][1] > anomalyScore = result.inferences["anomalyScore"] > model[labels[ind]].resetSequenceStates() > sample += 1 > print "Processing training sample %i" % sample > if sample == 100: > break > > sample = 0 > labels_predicted = [] > for row in data_test: > anomaly = [0]*16 > for i in range(0, 16): > model[i].resetSequenceStates() > for r in row: > value = int(r) > result = model[i].run({FIELD_NAME: value, '_learning': > False}) > prediction = > result.inferences["multiStepBestPredictions"][1] > anomalyScore = result.inferences["anomalyScore"] > # print value, prediction, anomalyScore > if value == int(prediction) and anomalyScore == 0: > # print "No prediction made" > anomalyScore = 1 > anomaly[i] += anomalyScore > anomaly[i] /= len(row) > sample += 1 > print "Processing testing sample %i" % sample > labels_predicted.append(np.min(np.array(anomaly))) > print anomaly, row[-1] > if sample == 100: > break > > accuracy = np.sum(np.array(labels_predicted) == > np.array(labels_test))*100.0/len(labels_test) > print "Testing accuracy is %0.2f" % accuracy > > >
