示例#1
0
 def merge_same(self):  #合并关联密度吸引点
     uf = UnionFind(self.n)
     for i in range(self.n):
         for j in range(i + 1, self.n):
             if dist(self.attrs[i], self.attrs[j]) < 2 * DELTA:
                 uf.merge(i, j)
     uf.arrange()
     new_attrs = []
     for position in uf.pos:
         new_attrs.append(self.attrs[position])
     self.attrs = new_attrs
     for i in range(self.n):
         self.bel.append(uf.sid[i])
示例#2
0
 def merge_cluster(self):  #合并簇
     uf = UnionFind(len(self.attrs))
     is_higher = [self.f_gauss(p) >= XI for p in self.ps]
     for i in range(self.n):
         for j in range(i + 1, self.n):
             if self.bel[i] != self.bel[j] \
                     and is_higher[i] \
                     and is_higher[j] \
                     and (not self.is_out[self.bel[i]]) \
                     and (not self.is_out[self.bel[j]]) \
                     and dist(self.ps[i], self.ps[j]) < K:
                 uf.merge(self.bel[i], self.bel[j])
     uf.arrange()
     for i in range(len(self.attrs)):
         self.cluster_id.append(uf.sid[i])
示例#3
0
def persistence(f):
    def mergeF(a, b):
        m, e = max((a['max'], a['elder']), (b['max'], b['elder']))
        return {'max': m, 'elder': e}

    fi = sorted(list(zip(f, range(len(f)))), reverse=True)
    uf = UnionFind(mergeF)
    pairs = []
    for v, i in fi:
        uf.add(i, {'max': v, 'elder': i})
        if i - 1 in uf.V and i + 1 in uf.V:
            a = uf.getData(i - 1)
            b = uf.getData(i + 1)
            d, j = min((a['max'], a['elder']), (b['max'], b['elder']))
            pairs.append((d - v, i, j))
        if i - 1 in uf.V:
            uf.merge(i - 1, i)
        if i + 1 in uf.V:
            uf.merge(i, i + 1)
    pairs.append((float('inf'), None, fi[0][1]))
    return pairs