Задача расчета симметричной c нормализованной матрицы Лапласа - PullRequest
0 голосов
/ 10 февраля 2020

Я обнаружил некоторые проблемы при вычислении симметричной c нормализованной матрицы Лапласа в python. Предположим, у нас есть матрица S и ее матрица диагональной степени D:

    [ [ 1 , 0.5, 0.2]        [ [1.7, 0, 0 ]
S =   [0.5,  1 , 0.5]     D =  [ 0 , 2, 0 ] 
      [0.2, 0.5,  1 ] ]        [ 0 , 0,1.7] ]

При расчете L как

Laplace normalised equation

Я получаю результат:

       [[ 0.41176471 -0.27116307 -0.11764706]
    L = [-0.27116307  0.5        -0.27116307]
        [-0.11764706 -0.27116307  0.41176471]]

Использование этого кода:

S = np.array([[1,0.5,0.2],[0.5,1,0.5],[0.2,0.5,1]])

print("Similiarity Matrix: \n",S)
print("\n\n")


D = np.zeros((len(S), len(S)))
#H = np.sum(G[0])
for id, x in enumerate(S):
    D[id][id] = np.sum(x)

I = np.identity(len(S))

L = I - ((sqrtm(inv(D))).dot(S)).dot(sqrtm(inv(D)))
print("\n\n")
print("Laplacian normalized: \n",L)

Это отличается от использования функции csgraph.laplacian(S, normed=True), которая возвращает:

       [[[ 1.        -0.5976143  -0.28571429]
    L = [-0.5976143   1.         -0.5976143 ]
        [-0.28571429 -0.5976143   1.        ]]

, почему это происходит? Я делаю что-то не так?

1 Ответ

0 голосов
/ 16 февраля 2020

Я заметил, что отношение ненормализованных и нормализованных матриц, возвращаемых csgraph.laplacian, тесно связано с отношением ненормализованной матрицы и вашего L:

In [20]: csgraph.laplacian(S, normed=False) / L - 1
Out[20]:
array([[0.7       , 0.84390889, 0.7       ],
       [0.84390889, 1.        , 0.84390889],
       [0.7       , 0.84390889, 0.7       ]])

In [21]: csgraph.laplacian(S, normed=False) / csgraph.laplacian(S, normed=True)
Out[21]:
array([[0.7       , 0.83666003, 0.7       ],
       [0.83666003, 1.        , 0.83666003],
       [0.7       , 0.83666003, 0.7       ]])

0,84390889 9 0,83666003, но других чисел матч. Может ли разница быть просто из-за нормализации?

...