Надеюсь, с тобой все хорошо. Я преобразовывал матрицу смежности в индекс связности. У меня проблемы с попыткой заставить его взять второго соседа, но у меня были проблемы. Я постараюсь объяснить свою проблему и цель как можно лучше. Лучше будет пояснить на примере.
Это пример матрицы смежности.
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-го атома.
Мне нужно закодировать метод выбора соседей первого соседа и повторения для всех потенциальных вторых соседей, не оставляя комбинаций, которые не были бы рассчитаны.
Возможно ли, что у кого-нибудь есть советы о том, как решить эту проблему, или предоставить модификацию для решения этой проблемы? И, возможно, предоставить что-то, что позволит вычислять более высокие порядки, чем секунды, хотя я ожидаю, что смогу настроить это самостоятельно.
Большое спасибо
Если сумму для индекса второго порядка брать по всем тройкам (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()