Манипулирование матрицей смежности и индекс связности

Надеюсь, с тобой все хорошо. Я преобразовывал матрицу смежности в индекс связности. У меня проблемы с попыткой заставить его взять второго соседа, но у меня были проблемы. Я постараюсь объяснить свою проблему и цель как можно лучше. Лучше будет пояснить на примере.

Это пример матрицы смежности.

    A0   A1   A2   A3   A4   A5
A0  0.0  1.0  0.0  0.0  0.0  0.0
A1  1.0  0.0  1.0  0.0  0.0  0.0
A2  0.0  1.0  0.0  1.0  0.0  0.0
A3  0.0  0.0  1.0  0.0  1.0  0.0
A4  0.0  0.0  0.0  1.0  0.0  1.0
A5  0.0  0.0  0.0  0.0  1.0  0.0

Названия (A0, A1 и т. д.) представляют собой атом. Значения представляют соединение. Таким образом, значение 1 в строке A0 и столбце A1 означает, что между двумя атомами есть связь, и они являются соседями.

Я следую уравнению, чтобы найти индекс связности (CF) первого порядка (первого соседа) по следующему уравнению:

CF = Σ(Si * Sj)^(-0,5)

Где Si соответствует связности атома в строке i (как в приведенном выше примере это будет A0), а Sj для j (A1 в приведенном выше примере). Связность (S) определяется как количество связей, то есть сумма строки или столбца этого атома.

Я использовал код ниже, чтобы применить это.

def randic_index(A):
    n = A.shape[0]
    R = 0
    for i in range(n):
        for j in range(n):
            if A[i,j] != 0:
                deg_i = np.sum(A[i,:])
                deg_j = np.sum(A[:,j])
                R += 1 / np.sqrt(deg_i * deg_j)
    return  0.5*R

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

Формула для индекса связности второго порядка (CS):

CS = Σ(Si * Sj * Sk)^(-0,5), где k соответствует соседу j-го атома.

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

Возможно ли, что у кого-нибудь есть советы о том, как решить эту проблему, или предоставить модификацию для решения этой проблемы? И, возможно, предоставить что-то, что позволит вычислять более высокие порядки, чем секунды, хотя я ожидаю, что смогу настроить это самостоятельно.

Большое спасибо

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если сумму для индекса второго порядка брать по всем тройкам (i, j, k) связных узлов, включая те, где i=k, то должно работать следующее:

import numpy as np

def randic_index2_path(A):
    degs = 1 / A.sum(axis=0)**0.5
    B = (A * degs**0.5 * degs[..., None])
    return np.tril((B.T@B)).sum()

Если, с другой стороны, сумма берется по тройкам связанных узлов (i, j, k), где i и k различны, то вы можете попробовать следующее:

def randic_index2_trail(A):
    degs = 1 / A.sum(axis=0)**0.5
    B = (A * degs**0.5 * degs[..., None])
    return np.tril((B.T@B), k=-1).sum()

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

def randic_index(A):
    degs = 1 / A.sum(axis=0)**0.5
    return np.tril(A * degs * degs[..., None]).sum()

Другие вопросы по теме