# HG changeset patch # User Nicolas Saunier # Date 1501018567 14400 # Node ID 989917b1ed85e496028b7d91310550cf9e741062 # Parent a9b2beef0db43a01c4808b3fab24eb8175a41fc9 assign and learn work diff -r a9b2beef0db4 -r 989917b1ed85 python/ml.py --- a/python/ml.py Mon Jul 24 21:22:18 2017 -0400 +++ b/python/ml.py Tue Jul 25 17:36:07 2017 -0400 @@ -138,7 +138,7 @@ self.prototypeId = prototypeId self.memberIndices = memberIndices -def assignToPrototypeClusters(instances, prototypeIndices, similarities, minSimilarity, similarityFunc = None, minClusterSize = None): +def assignToPrototypeClusters(instances, prototypeIndices, similarities, minSimilarity, similarityFunc = None, minClusterSize = 0): '''Assigns instances to prototypes if minClusterSize is not None, the clusters will be refined by removing iteratively the smallest clusters and reassigning all elements in the cluster until no cluster is smaller than minClusterSize''' @@ -166,8 +166,7 @@ prototypeIndices.remove(smallestClusterIndex) indices = [i for i in range(similarities.shape[0]) if labels[i] == smallestClusterIndex] return prototypeIndices, labels - -def prototypeCluster(instances, similarities, minSimilarity, similarityFunc = None, minClusterSize = 0, optimizeCentroid = True, randomInitialization = False, initialPrototypeIndices = None): +def prototypeCluster(instances, similarities, minSimilarity, similarityFunc = None, optimizeCentroid = True, randomInitialization = False, initialPrototypeIndices = None): '''Finds exemplar (prototype) instance that represent each cluster Returns the prototype indices (in the instances list) diff -r a9b2beef0db4 -r 989917b1ed85 scripts/learn-motion-patterns.py --- a/scripts/learn-motion-patterns.py Mon Jul 24 21:22:18 2017 -0400 +++ b/scripts/learn-motion-patterns.py Tue Jul 25 17:36:07 2017 -0400 @@ -18,7 +18,7 @@ parser.add_argument('-e', dest = 'epsilon', help = 'distance for the similarity of trajectory points', type = float, required = True) parser.add_argument('--metric', dest = 'metric', help = 'metric for the similarity of trajectory points', default = 'cityblock') # default is manhattan distance parser.add_argument('-s', dest = 'minSimilarity', help = 'minimum similarity to put a trajectory in a cluster', type = float, required = True) -parser.add_argument('-c', dest = 'minClusterSize', help = 'minimum cluster size', type = int, default = None) +parser.add_argument('-c', dest = 'minClusterSize', help = 'minimum cluster size', type = int, default = 0) parser.add_argument('--learn', dest = 'learn', help = 'learn', action = 'store_true') parser.add_argument('--optimize', dest = 'optimizeCentroid', help = 'recompute centroid at each assignment', action = 'store_true') parser.add_argument('--random', dest = 'randomInitialization', help = 'random initialization of clustering algorithm', action = 'store_true') @@ -77,9 +77,11 @@ similarityFunc = lambda x,y : lcss.computeNormalized(x, y) # the next line can be called again without reinitializing similarities if args.learn: - prototypeIndices = ml.prototypeCluster(trajectories, similarities, args.minSimilarity, similarityFunc, args.minClusterSize, args.optimizeCentroid, args.randomInitialization, initialPrototypeIndices) + prototypeIndices = ml.prototypeCluster(trajectories, similarities, args.minSimilarity, similarityFunc, args.optimizeCentroid, args.randomInitialization, initialPrototypeIndices) # assignment is done if explicitly passed as argument or if working on the same database (starting prototypes from scratch and assigning the ) # (otherwise the matchings will not compare and one has to to matchings on a large scale at once) +else: + prototypeIndices = initialPrototypeIndices if args.assign: prototypeIndices, labels = ml.assignToPrototypeClusters(trajectories, prototypeIndices, similarities, args.minSimilarity, similarityFunc, args.minClusterSize) @@ -90,7 +92,7 @@ prototypes = [] for i in prototypeIndices: if args.assign: - nMatchings = clusterSizes[i] + nMatchings = clusterSizes[i]-1 else: nMatchings = 0 if i