def cluster(self, points, kernel_bandwidth, iteration_callback=None): if iteration_callback: iteration_callback(points, 0) shift_points = np.array(points) max_min_dist = 1 iteration_number = 0 still_shifting = [True] * points.shape[0] while max_min_dist > MIN_DISTANCE: # print max_min_dist max_min_dist = 0 iteration_number += 1 for i in range(0, len(shift_points)): if not still_shifting[i]: continue p_new = shift_points[i] p_new_start = p_new p_new = self._shift_point(p_new, points, kernel_bandwidth) dist = ms_utils.euclidean_dist(p_new, p_new_start) if dist > max_min_dist: max_min_dist = dist if dist < MIN_DISTANCE: still_shifting[i] = False shift_points[i] = p_new if iteration_callback: iteration_callback(shift_points, iteration_number) point_grouper = pg.PointGrouper() group_assignments = point_grouper.group_points(shift_points.tolist()) return MeanShiftResult(points, shift_points, group_assignments)
def _distance_to_group(self, point, group): min_distance = sys.float_info.max for pt in group: dist = ms_utils.euclidean_dist(point, pt) if dist < min_distance: min_distance = dist return min_distance