Nano Hash - криптовалюты, майнинг, программирование

Найти подключенные компоненты Networkx

Мне нужно найти связанные узлы в неориентированном и взвешенном графе. Я искал здесь несколько предложений, но никто не ответил, что связано с моей проблемой. Эти пары узлов, которые также подключаются к соседям, и каждая пара при подключении проводит некоторое время в секундах, подключенных. Я пытаюсь найти подключенные компоненты и количество раз, когда одни и те же комментарии подключаются, и как долго (время) они подключаются.

Eg:

Node  Node time
A      B    34
A      B    56
A      C    09
A      D    5464
A      C    456
C      B    36
C      A    345
B      C    346

Итак, всего A B C подключены два раза

Nodes   connected  time
[A B C]    1       34+09+36 = 79
[A B C]    1       56+345+346 = 747

Ожидаемый результат

Nodes  connected  time 
[A B C]    2       826

And

Node  connected  time
[A B]   2         90
[B C]   2         382
[A C]   2         354

Код:

import networkx as nx
import numpy as np
from collections import defaultdict

count = defaultdict(int)
time = defaultdict(float)

data = np.loadtxt('USC_Test.txt')

for line in data:
    edge_list = [(line[0], line[1])]
    G= nx.Graph()
    G.add_edges_from(edge_list)
    components = nx.connected_components(G)
    count['components'] += 1
    time['components'] += float(line[2])

print components, count['components'], time['components']

Вход:

5454 5070 2755.0
5070 4391 2935.0
1158 305  1.0
5045 3140 48767.0
4921 3140 58405.0
5372 2684 460.0
1885 1158 351.0
1349 1174 6375.0
1980 1174 650.0
1980 1349 650.0
4821 2684 469.0
4821 937  459.0
2684 937  318.0
1980 606  390.0
1349 606  750.0
1174 606  750.0
5045 3545 8133.0
4921 3545 8133.0
3545 3140 8133.0
5045 4243 14863.0
4921 4243 14863.0
4243 3545 8013.0
4243 3140 14863.0
4821 4376 5471.0
4376 937  136.0
2613 968  435.0
5372 937  83.0

Неправильный вывод

Вывод, который я получаю, неверен

Last_node_pair  total_count_of_line  total_time  of Entire input data

Где я должен получить

[5045 3140 4921]  [number_of_times_same_components_connected]   [total_time_components_connected]

  • Ваш код не работает: edge_list = [(line_one[0], line_two[1])] вызывает IndexError: list index out of range, не могли бы вы отредактировать свой код, чтобы он работал, чтобы мы могли предложить ответ 26.08.2014
  • @EdChum Отредактированный код все еще содержит ошибку. Обновил и это. 26.08.2014
  • Я думаю, вам нужно еще немного отладить и распечатать значения, чтобы понять ошибки, чтобы исправить вашу первую проблему, измените строку: edge_list = line[0], line[1] на edge_list = [(line[0], line[1])] метод add_edges_from принимает список кортежей. 26.08.2014
  • Между тем, я попробовал то же самое, что вы упомянули в предыдущем комментарии. Теперь ошибка изменилась на Traceback (most recent call last): File "topo_op.py", line 14, in <module> count[components] += 1 TypeError: unhashable type: 'list' 26.08.2014
  • Я получаю ту же ошибку, я думаю, вам следует проработать эти ошибки, распечатать значения и найти api, чтобы узнать, какие типы они принимают, на данный момент существует слишком много ошибок, чтобы эффективно ответить на ваш вопрос, но я думаю, если вы будете упорны дойдет до вашего ответа, когда вы действительно застрянете, отредактируйте вопрос с помощью последней попытки, и я постараюсь помочь. Удачи! 26.08.2014
  • @EdChum Я изменил код, и в этом случае вывод неверен, как указано выше. 27.08.2014
  • Не могли бы вы попробовать это: for line in data: edge_list = [(line[0], line[1])] G= nx.Graph() G.add_edges_from(edge_list) components = nx.connected_components(G) #print (components) #print (line[2]) count[components[0][0]] += 1 time[components[0][0]] += float(line[2]) print(components) print(count) print(time) 27.08.2014
  • @EdChum Но это дает мне только количество и время отдельных подсчетов, а не подключенных компонентов. 27.08.2014
  • попробуйте это: for line in data: edge_list = [(line[0], line[1])] G= nx.Graph() G.add_edges_from(edge_list) components = nx.connected_components(G) edge = str(components[0][0]), str(components[0][1]) count[edge] += 1 time[edge] += float(line[2]) 27.08.2014
  • @EdChum Это дает мне только последнюю пару узлов и количество встречающихся пар узлов, а также время их соединения ('937.0', '5372.0') 1 83.0, но не соединенные компоненты. 27.08.2014
  • Я думаю, вам нужно попробовать еще немного, чтобы понять, как достичь того, чего вы хотите, на данный момент это не та конструктивная публикация комментариев, которая не позволяет достичь того, чего вы хотите. 27.08.2014
  • @EdChum Конечно, я пытаюсь разными способами отредактировать код, если я подхожу к тому, что мне нужно. 27.08.2014

Ответы:


1

Здесь есть несколько проблем:

  1. Вы воссоздаете график на каждой итерации, поэтому в вашем графике всегда будет только одно ребро.
  2. Вы используете буквальную строку «components» вместо переменной components в качестве индекса, поэтому вы сохраняете и отображаете только это единственное значение в словарях результатов.
  3. Вы печатаете результат только один раз, в конце. Здесь переменная components оказывается последним компонентом на графике (это последнее, что присвоено этой переменной цикла), и вы распечатываете общее количество компонентов и время, которое является общим количество компонентов и время для всех компонентов из-за проблемы №2.

Вот что должно сработать. Из лени дважды пролистываю данные.

import networkx as nx
import numpy as np
from collections import defaultdict

count = defaultdict(int)
time = defaultdict(float)

data = np.loadtxt('USC_Test.txt')
G = nx.Graph()
for line in data:
    a,b,time = line
    G.add_edge(a, b)

results = defaultdict(lambda: list([0, 0.0]))
components = nx.connected_components(G)
component_map = { } 
component_stats = defaultdict(lambda: list([0,0.0]))
edge_stats = defaultdict(lambda: list([0,0.0]))
for nodes in components:
    for node in nodes:
        component_map[int(node)] = tuple(nodes)

for a,b,time in data:
    component_stats[component_map[a]][0] += 1
    component_stats[component_map[a]][1] += time

    if len(component_map[a]) > 2:
        edge_stats[(a,b)][0] += 1
        edge_stats[(a,b)][1] += time

for nodes,(count,time) in component_stats.iteritems():
    print sorted([ int(n) for n in nodes ]), count, time

print

for nodes,(count,time) in edge_stats.iteritems():
    print sorted([ int(n) for n in nodes ]), count, time

С вашим вводом это дает следующий результат:

[606, 1174, 1349, 1980] 6 9565.0
[305, 1158, 1885] 2 352.0
[968, 2613] 1 435.0
[937, 2684, 4376, 4821, 5372] 7 7396.0
[4391, 5070, 5454] 2 5690.0
[3140, 3545, 4243, 4921, 5045] 9 184173.0

[1349, 1980] 1 650.0
[937, 4376] 1 136.0
[606, 1980] 1 390.0
[3140, 4921] 1 58405.0
[937, 5372] 1 83.0
[606, 1349] 1 750.0
[4391, 5070] 1 2935.0
[3545, 4921] 1 8133.0
[1158, 1885] 1 351.0
[3140, 3545] 1 8133.0
[2684, 4821] 1 469.0
[2684, 5372] 1 460.0
[937, 2684] 1 318.0
[1174, 1980] 1 650.0
[3140, 5045] 1 48767.0
[5070, 5454] 1 2755.0
[4376, 4821] 1 5471.0
[606, 1174] 1 750.0
[3545, 5045] 1 8133.0
[4243, 4921] 1 14863.0
[3140, 4243] 1 14863.0
[4243, 5045] 1 14863.0
[937, 4821] 1 459.0
[3545, 4243] 1 8013.0
[1174, 1349] 1 6375.0
[305, 1158] 1 1.0

Надеюсь, это поможет!

06.09.2014
  • Мне это кажется правильным, но результат, который я ищу, наполовину правильный. Например, [606, 1980, 1349, 1174] 6 9565.0 правильно, но я также ищу что-то вроде этого. [606 1980] \ n [606, 1349] \ n [606, 1174] с соответствующим счетчиком и соответствующей суммой времени. 06.09.2014
  • Понятно. Итак, вы хотите отслеживать компоненты и отдельные края? Я обновил ответ, чтобы сделать это. Дайте мне знать, если это то, что вы ищете! 07.09.2014
  • Это выглядит идеально. Я выполню код и скоро приму ответ. Спасибо большое :) 08.09.2014
  • Когда я перехожу на большой входной файл, я получаю сообщение об ошибке. G.add_edges_from((a, b) for a,b,time in data) ValueError: too many values to unpack 11.09.2014
  • Вы уверены, что данные представляют собой матрицу из трех столбцов? Может быть, в вашем файле данных есть лишнее место? 12.09.2014
  • Да, данные из 3 столбцов 12.09.2014
  • Очень странный. Я немного отредактировал ответ, чтобы вам было легче отлаживать. Можете ли вы запустить его со средой выполнения, которая при исключении переходит в отладчик (т.е. ipython --pdb script.py), а при исключении делает print line? Это по крайней мере скажет вам, на какой линии он не работает. 13.09.2014
  • При запуске с небольшим файлом данных это работает хорошо. Но когда у меня есть большой файл данных, он не генерирует никаких выходных данных, и терминал зависает целую вечность. 16.09.2014
  • О каком размере данных мы здесь говорим? Можете ли вы проверить, где застревает анализ (например, вставьте некоторые отладочные операторы печати)? 18.09.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..