Найти узлы с общими связями - PullRequest
1 голос
/ 12 апреля 2020

На данный момент я создал двудольный график networkx, который отображает расстройства на симптомы. Таким образом, расстройство может быть связано с одним или несколькими симптомами. Кроме того, у меня есть некоторая базовая c статистика, например, симптомы по крайней мере с одним расстройством и c.

import networkx as nx

csv_dictionary = {"Da": ["A", "C"], "Db": ["B"], "Dc": ["A", "C", "F"], "Dd": ["D"], "De": ["E", "B"], "Df":["F"], "Dg":["F"], "Dh":["F"]}

G = nx.Graph()

all_symptoms = set()
for disorder, symptoms in csv_dictionary.items():
    for i in range (0, len(symptoms)):
        G.add_edge(disorder, symptoms[i])

        all_symptoms.add(symptoms[i])

symptoms_with_multiple_diseases = [symptom for symptom in all_symptoms if G.degree(symptom) > 1]

sorted_symptoms = list(sorted(symptoms_with_multiple_diseases, key= lambda symptom: 
G.degree(symptom)))

Мне нужно найти расстройства, которые имеют по крайней мере два симптома . Итак, расстройства, которые имеют два общих симптома друг с другом. Я провел некоторое исследование и думаю, что мне нужно добавить веса для моих ребер, основываясь на том, как они соединяются, но я не могу обернуть это вокруг головы.

Итак, в приведенном выше примере Da и D c разделяют два симптома (A и C).

1 Ответ

1 голос
/ 12 апреля 2020

Вы можете перебрать комбинации длины 2 узлов disorder с центральностью выше 2 и найти nx.common_neighbours каждой комбинации, оставив только те, которые имеют минимум 2 соседей.

Поэтому вместо этого начните с отслеживания всех нарушений:

all_symptoms = set()
all_disorders = set()

for disorder, symptoms in csv_dictionary.items():
    for i in range (0, len(symptoms)):
        G.add_edge(disorder, symptoms[i])
        all_symptoms.add(symptoms[i])
    all_disorders.add(disorder)

Проверка, степень которой выше 2:

disorders_with_multiple_diseases = [symptom for symptom in all_disorders 
                                    if G.degree(symptom) > 1]

А затем выполнить итерацию по всем 2 комбинациям all_dissorders:

from itertools import combinations

common_symtpoms = dict()
for nodes in combinations(all_disorders, r=2):
    cn = list(nx.common_neighbors(G, *nodes))
    if len(cn)>1:
        common_symtpoms[nodes] = list(cn)

print(common_symtpoms)
# {('Da', 'Dc'): ['A', 'C']}
...