Source code for got.relevance_analysis.lapin

import numpy as np
import numpy.linalg as LA

ZERO_BOUND = 10 ** (-8)
ENTITY_BOUND = 10 ** (-4)


[docs]def lapin(A): ''' ''' A = (A + A.T) / 2 a_sums = np.ravel(abs(sum(A))) checked = np.array(a_sums > ENTITY_BOUND) is_correct = checked.all() if not is_correct: print('These entities are no good - remove them first!!!') print([i for i, j in enumerate(checked, 1) if not j]) A = A[:, checked][checked, :] a_sums = a_sums[checked] matrix_dim, _ = A.shape C = np.empty((matrix_dim, matrix_dim)) for i in range(matrix_dim): for j in range(matrix_dim): C[i, j] = A[i, j] / np.sqrt(a_sums[i] * a_sums[j]) eig_vals, eig_vecs = LA.eig(np.eye(matrix_dim) - C) eig_vals_diag = np.diag(eig_vals) nonzero_cond = np.array(eig_vals > ZERO_BOUND) nonzero_eig_vals_diag = eig_vals_diag[nonzero_cond, :][:, nonzero_cond] nonzero_eig_vecs = eig_vecs[:, nonzero_cond] B = nonzero_eig_vecs.dot(LA.inv(nonzero_eig_vals_diag)).dot(nonzero_eig_vecs.T) return B
if __name__ == '__main__': M = np.matrix([[1, 2, 1], [2, 4, 1], [1, 1, 9]]) M = np.matrix([[1, 0, 1], [0, 3, 0], [1, 0, 9]]) M_transformed = lapin(M) print(M_transformed)