def clusterLinkAgg(dom, para=1): md = ldi.linkDistance(dom, para) linkList = getLink(dom) linkClusterList = [] for link in linkList: linkClusterList.append([link]) while True: if len(linkClusterList) <= 1: break first = 0 second = 1 try: minGap = singleLink(linkClusterList[first], linkClusterList[second], md) #minGap = singleLink2D(linkClusterList[first], linkClusterList[second], md) except: print(len(linkClusterList)) return for i in range(0, len(linkClusterList)): for j in range(i + 1, len(linkClusterList)): gap = singleLink(linkClusterList[i], linkClusterList[j], md) #gap = singleLink2D(linkClusterList[i], linkClusterList[j], md) if gap < minGap: minGap = gap first = i second = j if minGap > md.dt: #if minGap > md.dt*1.414: break linkClusterList[first] += linkClusterList[second] linkClusterList.pop(second) return linkClusterList
def clusterLinkKM(dom, k=2): md = ldi.linkDistance(dom, 1) linkList = getLink(dom) a = [[link['index']] for link in linkList] #a = [[link['index'], link.parent['index']] for link in linkList] #a = [[link['index'], link['link_color'], link['link_size']] for link in linkList] #a = [[link['index'], link['link_color'], link['link_size'], link.parent['index']] for link in linkList] if not a: return [] cluster = KMeans(k) labelList = cluster.fit_predict(array(a)) linkClusterList = [[] for i in range(0, k)] for i in range(0, len(labelList)): linkClusterList[labelList[i]].append(linkList[i]) return linkClusterList
def clusterLink1D(dom, para=1): md = ldi.linkDistance(dom, para) linkList = getLink(dom) if not linkList: return [] linkClusterList = [] tmp = [linkList[0]] for i in range(1, len(linkList)): if md.getDis(linkList[i], linkList[i - 1]) > md.dt: linkClusterList.append(tmp) tmp = [] else: tmp.append(linkList[i]) if tmp: linkClusterList.append(tmp) linkClusterList = [ linkCluster for linkCluster in linkClusterList if linkCluster ] return linkClusterList
def clusterLinkSC(dom, k=2, affinity='nearest_neighbors', n_neighbors=1, gamma=0.021): md = ldi.linkDistance(dom, 1) linkList = getLink(dom) a = [[link['index']] for link in linkList] #a = [[link['index'], link.parent['index']] for link in linkList] #a = [[link['index'], link['link_color'], link['link_size']] for link in linkList] #a = [[link['index'], link['link_color'], link['link_size'], link.parent['index']] for link in linkList] if not a: return [] cluster = SpectralClustering(k, gamma=gamma) labelList = cluster.fit_predict(array(a)) linkClusterList = [[] for i in range(0, k)] for i in range(0, len(labelList)): linkClusterList[labelList[i]].append(linkList[i]) return linkClusterList
def clusterLinkDB(dom, para=0.5): md = ldi.linkDistance(dom, para) linkList = getLink(dom) a = [[link['index']] for link in linkList] #a = [[link['index'], link.parent['index']] for link in linkList] #a = [[link['index'], link['link_color'], link['link_size']] for link in linkList] #a = [[link['index'], link['link_color'], link['link_size'], link.parent['index']] for link in linkList] if not a: return [] if not md.dt: return linkList #cluster = DBSCAN(md.dt*1.414, min_samples=1) cluster = DBSCAN(md.dt, min_samples=1) labelList = cluster.fit_predict(array(a)) tmpSet = set() for label in labelList: tmpSet.add(label) linkClusterList = [[] for i in range(0, len(tmpSet))] for i in range(0, len(labelList)): linkClusterList[labelList[i]].append(linkList[i]) linkClusterList = [ linkCluster for linkCluster in linkClusterList if linkCluster ] return linkClusterList
def chdLD(dom, para=1): md1 = ldi.linkDistance(dom, para) md2 = lde.linkDensity(dom, 1, 0.00001) return runClusterLink(dom, md1, md2)