Example #1
0
def join_CCs_simple(X, W, num_ccs=1, verbose=False):
  """Old method for connecting the graph. Use join_CCs now."""
  n, labels = connected_components(W, directed=False, return_labels=True)
  CC_labels = labels
  while n > num_ccs:
    if verbose:
      print n, 'connected components'
    Dcenter, min_edge_idxs = inter_cluster_distance(X, n, labels)
    p_inds,q_inds = min_k_indices(Dcenter, 2).T  # self + 1 == 2
    ii,jj = min_edge_idxs[p_inds,q_inds].T
    W[ii,jj] = 1
    W[jj,ii] = 1
    n, labels = connected_components(W, directed=False, return_labels=True)
  return CC_labels
Example #2
0
def grow_trees(X, W, embed_dim, verbose=False):
  W = W.astype(int)
  dist_thresh = 0
  while True:
    n, labels = connected_components(W, directed=False, return_labels=True)
    tree_sizes = np.bincount(labels)
    min_tree_size = tree_sizes.min()
    if min_tree_size > embed_dim:
      break
    Dcenter, min_edge_idxs = inter_cluster_distance(X, n, labels)
    pairs = min_k_indices(Dcenter, 2)  # self + 1 == 2
    ninds = pairs[tree_sizes == min_tree_size]
    meta_edge_lengths = Dcenter[ninds[:,0],ninds[:,1]]
    dist_thresh = max(dist_thresh, np.max(meta_edge_lengths))
    if verbose:
      print n, 'CCs. dist thresh:', dist_thresh
    # modify W to connect edges between nearby CCs
    assert _connect_meta_edges(X,W,None,labels,ninds,dist_thresh=dist_thresh)[0]
  return W
Example #3
0
def join_CCs(X, W, embed_dim, num_ccs=1, max_angle=0.3, verbose=False):
  n, labels = connected_components(W, directed=False, return_labels=True)
  # compute linear subspaces for each connected component (assumed to be local+linear)
  CC_planes, _ = cluster_subspaces(X, embed_dim, n, labels)
  CC_labels = labels  # keep around the original labels that go with CC_planes
  angle_thresh = 0.1
  while n > num_ccs:
    # compute the distance between all clusters
    #   (by finding the distance between the closest 2 member points)
    Dcenter, min_edge_idxs = inter_cluster_distance(X, n, labels)
    # Find "meta-edges" between clusters (k=1)
    ninds = min_k_indices(Dcenter, 2)  # self + 1 == 2
    meta_edge_lengths = Dcenter[ninds[:,0],ninds[:,1]]
    dist_thresh = np.median(meta_edge_lengths)
    if verbose:
      print n, 'CCs'
    # convert ninds to CC_ninds (back to the CC_labels space, via W-space)
    CC_ninds = CC_labels[min_edge_idxs[ninds[:,0],ninds[:,1]]]
    # modify W to connect edges between nearby CCs
    while True:
      if verbose:
        print 'DT:', dist_thresh, 'AT:', angle_thresh
      done, minD, minF = _connect_meta_edges(X, W, CC_planes, CC_labels, CC_ninds,
                                             dist_thresh=dist_thresh,
                                             angle_thresh=angle_thresh)
      if done:
        break
      elif angle_thresh < minF <= max_angle:
        angle_thresh = minF
      elif dist_thresh < minD:
        if np.isinf(minD):
          max_angle += 0.1  # TODO: configure the step-up amount
          angle_thresh = min(minF, max_angle)
          if verbose:
            print 'increasing max_angle to', max_angle
        else:
          dist_thresh = minD
      else:
        assert False, "Impossible state: can't increase dist_thresh enough to make a connection"

    # recalc CCs and repeat (keeping the original CC_planes!) until there's only one left.
    n, labels = connected_components(W, directed=False, return_labels=True)
  return CC_labels, angle_thresh