实现将多个有序的关系对聚合层多个类,实质为由多个有向边的关系对得到图的个数。
示例:
如现有如下有向关系对:
(A,B),(B,C),(D,C),(E,F),(G,F),(H,E),(I-G),(J-B)
其中,(A,B)表示A属于B,即为有向关系对。
通过关系合并,则最终可以得到的两个图(类)。图1的节点有(A,B,C,D,J)、图2的节点有(E,F,G,I)。
代码实现:
def _find_parent(parent, u):
idx = []
# parent is a fixed point
while (u != parent[u]):
idx.append(u)
u = parent[u]
for i in idx:
parent[i] = u
return u
def edge_to_connected_graph(edges, num):
"""
:param edges: 有向关系对
:param num: 定点个数
:return:
"""
parent = list(range(num))
for u, v in edges:
p_u = _find_parent(parent, u)
p_v = _find_parent(parent, v)
parent[p_u] = p_v
for i in range(num):
parent[i] = _find_parent(parent, i)
remap = {}
uf = np.unique(np.array(parent))
for i, f in enumerate(uf):
remap[f] = i
cluster_id = np.array([remap[f] for f in parent])
return cluster_id