def knn_visual_all(k, locationid, models, database, this_vector=None): nearest = {} others = database.get_location_ids() others.remove(locationid) # Calculate this_vector if not this_vector: this_vector = Vectorizer.visual_vector_multimodel( locationid, database, models) # Make a vector where each item is an average for that model for other in others: other_vector = Vectorizer.visual_vector_multimodel( locationid, database, models) # get distance between vectors distance = Distance.l_p_distance(3, this_vector, other_vector) if len(nearest) < k: largest_key, largest_best = None, inf else: largest_key, largest_best = max(nearest.items(), key=itemgetter(1)) if distance < largest_best: if largest_key: nearest.pop(largest_key) nearest[other] = distance return nearest
def visual_sim_multimodal(this_vector, ids, database, models, k=3): other_vectors = [ Vectorizer.visual_vector_multimodel(locid, database, models) for locid in ids ] return Neighbor.similarity_contribution(this_vector, other_vectors, k, positional=True)
def nearest_visual(self, *args): """ arg[0] = locationid arg[1] = model (CM, CM3x3, CN, CN3x3, CSD, GLRLM, GLRLM3x3, HOG, LBP, LBP3x3, ALL) arg[2] = k """ if not self.database: print("[ERROR] The database must be loaded for this action.") return if not len(args) == 3: print("[ERROR] Expected three arguments but got " + str(len(args)) + ".") print("\targ = " + str(args)) # Get the first argument try: k = int(args[2]) except: print("[ERROR] K Value provided is invalid.") print("\tk = " + str(args[2])) return # Get the model to use. We do this before the item as it is easier # to differentiate valid from invalid model = args[1] if not model in self.valid_vis_models: print("[ERROR] Model Type value provided was invalid.") print("\tModel Type = " + str(args[1])) return try: locationid = int(args[0]) except: print("[ERROR] The ID specified was not valid") print("\tID = " + str(locationid) + "; Model = " + model) return start = time() if model == 'ALL': this_vector = Vectorizer.visual_vector_multimodel(locationid, self.database, self.valid_vis_models) nearest = Neighbor.knn_visual_all(k, locationid, self.valid_vis_models, self.database, this_vector = this_vector) else: # get vector representing item associated w/ id this_vector = Vectorizer.visual_vector(locationid, self.database, model) nearest = Neighbor.knn_visual(k, locationid, model, self.database, this_vector=this_vector) contribs = Neighbor.visual_sim_contribution(this_vector, nearest.keys(), self.database, model, k=3) print("The Visual Descriptor Nearest Neighbor took " + str(time() - start)) print(str(k) + " Nearest Neighbors:") for i, (an_id, distance) in enumerate(nearest.items()): print('\t' + str(i) + ". " + str(an_id) + "; Distance = " + str(distance)) print('Top 3 Image Pairs:') for i, item in enumerate(contribs): print('\t' + str(i) + '. ' + str(item))