使用igraph python从数据中读取关系

使用igraph python从数据中读取关系,python,igraph,Python,Igraph,我有一个example.cvc文件,其中包含以下值: pos= [180 270 360 450 540 630 720 810] mean_values= [(270,630), (540,720),(270,810),(450,630),(180,360), (180,540),(450,810),(360,540),(180,720),(630,810),(270,450),(360,720)] 平均值基本上来自二维高斯混合模型。根据我的理解,标签可以表示顶点(8),平均值可以称为边(1

我有一个example.cvc文件,其中包含以下值:

pos= [180 270 360 450 540 630 720 810]
mean_values= [(270,630), (540,720),(270,810),(450,630),(180,360), (180,540),(450,810),(360,540),(180,720),(630,810),(270,450),(360,720)]
平均值基本上来自二维高斯混合模型。根据我的理解,标签可以表示顶点(8),平均值可以称为边(12)

关于数据:位置基本上由蓝色和黄色圆圈值表示,而平均值对应于哪个位置与哪个位置相关。因此,例如,在180360540和720标签值中,180连接到360540,720,如箭头所示,并由以下平均值表示:[(180360),(180540),(180720)]其他pos也有类似的结果


知道如何使用igraph获得这样的结果吗。我做了几次搜索,但都不知道。我是新来的伊格拉夫,任何帮助将不胜感激。首先,您需要像这样计算最接近的点集(请注意,我随意从列表而不是文件中读取数据,您可以相应地更改它):

当我们绘制图形时,我将第二个元素存储为字符串的原因将被清除。您可以自己查看要验证的点

print(closest_mapping)
#[(640.0, '630.0'),
# (270.0, '360.0'),
# (450.0, '450.0'),
# (230.0, '360.0'),
# (180.0, '360.0'),
# (540.0, '540.0'),
# (270.0, '360.0'),
# (180.0, '360.0'),
# (450.0, '450.0'),
# (360.0, '360.0'),
# (610.0, '630.0'),
# (360.0, '360.0')]
我不知道如何使用igraph绘制二部图,因此我将使用:

import networkx as nx

# Create an empty graph
G = nx.Graph()

# Add the edges from the list we created
G.add_edges_from(closest_mapping)

# Create a bipartite layout 
pos = nx.bipartite_layout(G, a)

# Draw the Graph
nx.draw(G, pos, with_labels=True, node_size=900, node_color='y')

左侧的节点来自
A
,而右侧的节点来自
B

如果要为每对节点查找最近的节点

import numpy as np
import networkx as nx

a = np.asarray([640., 270., 450., 230., 180., 540., 270., 180., 450., 360., 610.,
       360.])
b = np.asarray([810., 630., 810., 760., 360., 720., 450., 540., 630., 720., 810.,
       540.])


closest_mapping = []

# Find mapping for A->B
for node in a:
    # Subtract node from each element in b
    # and get the absolute value
    dist_list = np.absolute(np.array(b) - node)

    # Find the element in b with the min. absolute value
    min_element = b[np.argmin(dist_list)]

    # Create a tuple of (node, min_element) and add it to list.
    # This will be used to plot a graph later. 
    # Note that the second element is stored as a string.
    closest_mapping.append((node, str(min_element)))

# Find Mapping for B->A
for node in b:
    # Subtract node from each element in b
    # and get the absolute value
    dist_list = np.absolute(np.array(a) - node)

    # Find the element in b with the min. absolute value
    min_element = a[np.argmin(dist_list)]

    # Create a tuple of (node, min_element) and add it to list.
    # This will be used to plot a graph later. 
    # Note that the first element is stored as a string.
    closest_mapping.append((str(node), min_element))


# Create an empty graph
G = nx.Graph()

# Add the edges from the list we created
G.add_edges_from(closest_mapping)

# Create a bipartite layout 
pos = nx.bipartite_layout(G, a)

# Draw the Graph
nx.draw(G, pos, with_labels=True, node_size=900, node_color='y')

注意列表
B
中的节点存储为字符串的原因是,如果它们保持为整数/浮点数,并且它们在
A
中具有相同的值,则图形将不会是两部分的(即使两者在逻辑上不同,它也不会注册重复节点,因此我将一个节点列表保留为字符串)

更新: 根据更新的问题,可以使用NetworkX直接添加节点和边,如下所示:

将networkx导入为nx

pos= [180, 270, 360, 450, 540, 630, 720, 810]
mean_values= [(270,630), (540,720), (270,810), (450,630), (180,360),
              (180,540), (450,810), (360,540), (180,720), (630,810),
              (270,450), (360,720)]
 
G = nx.Graph()
G.add_nodes_from(pos)
G.add_edges_from(mean_values)

pos = nx.spring_layout(G)
nx.draw(G, pos, node_size=500, with_labels=True, node_color='y')

您可以对像这样的定向边使用
nx.DiGraph

import networkx as nx

pos= [180, 270, 360, 450, 540, 630, 720, 810]
mean_values= [(270,630), (540,720), (270,810), (450,630), (180,360),
              (180,540), (450,810), (360,540), (180,720), (630,810),
              (270,450), (360,720)]
 
G = nx.DiGraph()
G.add_nodes_from(pos)
G.add_edges_from(mean_values)

pos = nx.spring_layout(G)
nx.draw(G, pos, node_size=500, with_labels=True, node_color='y')

参考资料


你的意思是在数字刻度上“更接近”吗?a,b代表什么?是的。它们表示从高斯混合模型得到的a和b的不同平均值。那么为什么你需要图形呢?如果我错了,请纠正我,但您正在发现a的哪些混合物与b的混合物最相似(至少在平均值的接近性方面)。所以为什么不使用一个简单的距离矩阵呢?我们的结果表明,有两个簇,我想通过这两个簇中的图来知道,这两个簇的平均值更接近每个簇。所以我认为用距离矩阵是不可能的。我也不清楚为什么它需要一个图。您在示例中提到640接近630。为什么这种洞察力需要一张图表。这仅仅是为了视觉化的目的吗?这不完全是我想要的。我进一步简化了我的问题,得到了预期的结果。请看一看,如果你能帮忙,请告诉我。谢谢。我还有一个关于igraph的跟进。你能帮我做这个吗?下面给出了新问题的链接。
import networkx as nx

pos= [180, 270, 360, 450, 540, 630, 720, 810]
mean_values= [(270,630), (540,720), (270,810), (450,630), (180,360),
              (180,540), (450,810), (360,540), (180,720), (630,810),
              (270,450), (360,720)]
 
G = nx.DiGraph()
G.add_nodes_from(pos)
G.add_edges_from(mean_values)

pos = nx.spring_layout(G)
nx.draw(G, pos, node_size=500, with_labels=True, node_color='y')