【问题标题】:How to get the balanced and imbalanced triangles in an incomplete network?如何在不完整的网络中获得平衡和不平衡三角形?
【发布时间】:2022-08-20 05:03:27
【问题描述】:

我正在尝试计算不完整签名的组织网络中平衡和不平衡三元组的数量。但问题是我的代码只适用于完整的网络。组织 5 处于三元组中,但由于未完全连接,因此输出会抛出错误。考虑到某些节点可能未完全连接,我该如何运行分析?我的代码如下:

G = nx.Graph()
G.add_edge(\'Organization 1\',\'Organization 2\',color=\'g\', sign=\'+\')
G.add_edge(\'Organization 2\',\'Organization 3\',color=\'r\', sign=\'-\')
G.add_edge(\'Organization 3\',\'Organization 4\',color=\'r\', sign=\'-\')
G.add_edge(\'Organization 4\',\'Organization 1\',color=\'r\', sign=\'-\')
G.add_edge(\'Organization 2\',\'Organization 4\',color=\'r\', sign=\'-\')
G.add_edge(\'Organization 1\',\'Organization 3\',color=\'g\', sign=\'+\')
G.add_edge(\'Organization 5\',\'Organization 4\',color=\'g\', sign=\'+\')
G.add_edge(\'Organization 2\',\'Organization 4\',color=\'g\', sign=\'+\')
G.add_edge(\'Organization 5\',\'Organization 3\',color=\'r\', sign=\'-\')


plt.figure(figsize=(12, 6), dpi=300)
pos = nx.circular_layout(G)

edges = G.edges()
colors = [G[u][v][\'color\'] for u,v in edges]

nx.draw(G, pos, edge_color=colors, width=5, node_size=1500, with_labels=True)
plt.savefig(\'simulated_conflicts\')

This is the resulting network. Green edges are positive relations and red edges are negative

为了进行结构平衡分析,我运行了以下代码:


G.nodes()
triangular_relations2009 = [list(each_tri_combination) for each_tri_combination in itertools.combinations(nodes,3)]



#Let\'s visualize these triangular relationships
#I will create a function to get all the signs of triangles defined in the list

def get_signs_of_triangles_list(triangles_list,graph):
    all_signs = []
    for each_node_in_triangle_list in range(len(triangles_list)):
        temp_storage_list = []
        temp_storage_list.append(G[triangles_list[each_node_in_triangle_list][0]][triangles_list[each_node_in_triangle_list][1]][\'sign\'])
        temp_storage_list.append(G[triangles_list[each_node_in_triangle_list][0]][triangles_list[each_node_in_triangle_list][2]][\'sign\'])
        temp_storage_list.append(G[triangles_list[each_node_in_triangle_list][1]][triangles_list[each_node_in_triangle_list][2]][\'sign\'])
        all_signs.append(temp_storage_list)
    return all_signs


#storing all the signs in the list

all_signs_in_network = get_signs_of_triangles_list(triangular_relations2009,G)
len(all_signs_in_network)
count_unstable_triangles(all_signs_in_network)

我得到的关键错误是:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Input In [60], in <cell line: 2>()
      1 #storing all the signs in the list
----> 2 all_signs_in_network = get_signs_of_triangles_list(triangular_relations2009,G)
      4 len(all_signs_in_network)
      6 count_unstable_triangles(all_signs_in_network)

Input In [58], in get_signs_of_triangles_list(triangles_list, graph)
      6 temp_storage_list = []
      7 temp_storage_list.append(G[triangles_list[each_node_in_triangle_list][0]][triangles_list[each_node_in_triangle_list][1]][\'sign\'])
----> 8 temp_storage_list.append(G[triangles_list[each_node_in_triangle_list][0]][triangles_list[each_node_in_triangle_list][2]][\'sign\'])
      9 temp_storage_list.append(G[triangles_list[each_node_in_triangle_list][1]][triangles_list[each_node_in_triangle_list][2]][\'sign\'])
     10 all_signs.append(temp_storage_list)

File ~/opt/anaconda3/lib/python3.9/site-packages/networkx/classes/coreviews.py:54, in AtlasView.__getitem__(self, key)
     53 def __getitem__(self, key):
---> 54     return self._atlas[key]

KeyError: \'Organization 5\'

我认为问题在于它不能将组织 5 包括在分析中,因为它没有完全连接,我该怎么做?我想要的是能够将所有标志存储在列表中,以便接下来运行此代码:

def count_unstable_triangles(all_signs):
    number_of_stable_triangles = 0
    number_of_unstable_triangles = 0
    for each_sign in range(len(all_signs)):
        if all_signs[each_sign].count(\'+\') == 3 or all_signs[each_sign].count(\'+\') == 1:
            number_of_stable_triangles = number_of_stable_triangles+1
        else:
            number_of_unstable_triangles = number_of_unstable_triangles+1
    print(f\"number of stable_triangles out of {number_of_stable_triangles+number_of_unstable_triangles} are {number_of_stable_triangles}\")
    print(f\"number of unstable_triangles out of {number_of_stable_triangles+number_of_unstable_triangles} are {number_of_unstable_triangles}\")  
    return number_of_unstable_triangles,number_of_stable_triangles

count_unstable_triangles(all_signs_in_network)

此代码将为我提供网络中平衡和不平衡三角形的数量。我用多个完整的网络运行了这段代码,它运行平稳。

    标签: python networkx sna


    【解决方案1】:

    在这里,我假设平衡三合会您的意思是一组三个节点,它们都通过带有符号+ 的边连接,并且带有不平衡的三元组您的意思是一组三个节点,其中两个通过带有符号+ 的边连接。

    from collections import Counter
    from itertools import combinations
    
    edges = set(G.edges)
    n_balanced, n_imbalanced = 0, 0
    for triad in list(combinations(G.nodes, 3)):
        a, b, c = triad
        edge_set = {(a, b), (a, c), (b, c)}
        if edge_set.issubset(edges):
            count = Counter([G.edges[edge]['sign'] for edge in edge_set])
            if count['+'] == 3:
                n_balanced += 1
            elif count['+'] == 2:
                n_imbalanced += 1
        else:
            edge_subsets = set(combinations(edge_set, 2))
            for edge_subset in edge_subsets:
                if set(edge_subset).issubset(edges):
                    if G.edges[edge_subset[0]]['sign'] == G.edges[edge_subset[1]]['sign'] == '+':
                        n_imbalanced += 1
                        break
    print(n_balanced, n_imbalanced)
    

    印刷

    0 3
    

    【讨论】:

    • 这太棒了@Michael Hodel。我看起来不像我的代码那么混乱。我一定会试一试,我真的很感激!
    • 我认为这仍然可以大大简化,或者至少可以提高效率。但是我想我对你对(im)平衡三元组的定义的解释是正确的?
    猜你喜欢
    • 2011-12-28
    • 2019-06-18
    • 2017-07-27
    • 2019-04-22
    • 2016-12-31
    • 2020-06-07
    • 1970-01-01
    • 2019-03-26
    • 2017-11-14
    相关资源
    最近更新 更多