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])
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])
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