Как преобразовать массив, используя его первые спектральные компоненты ⇐ Python
-
Anonymous
Как преобразовать массив, используя его первые спектральные компоненты
Я пытаюсь преобразовать массив на основе его первых спектральных компонентов, но получаю выходной признак, который сильно отличается от исходного, даже если я сохраняю все компоненты целиком.
Давайте рассмотрим этот массив 4x4
импортировать numpy как np из numpy.linalg импортировать eig arr = np.asarray([[23, 34, 78, 54], [87, 98, 23, 67], [76, 67, 98, 29], [56, 88, 28, 27]]) Его матрица смежности будет
A = np.asarray([[0., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0.], [0., 0., 1., 1., 0., 0., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0.], [0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0.], [0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 0.], [0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1.], [0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 0., 0., 0., 1., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 0.]] ) Его степень и матрица Лапласа определяются как:
степень = A.sum(ось=1) D = np.diag(степень) # Матрица Лапласа Л = Д - А Вычислите его собственные векторы и собственные значения и отсортируйте их в порядке убывания
eig_val, eig_vec = eig(L) idx = eig_val.argsort()[::-1] Отсортируйте собственные векторы соответствующим образом
eig_vec = eig_vec[:,idx] Собственные векторы образуют ортонормированный базис, поэтому произведение двух различных векторов должно быть равно 0. Я заметил, что здесь это не тот случай, например. произведение первого и второго собственных векторов равно
sum(np.multiply(eig_vec[0], eig_vec[1])) = 0,043247527085787975 Есть ли что-то, что мне не хватает?
Вычислить спектральные компоненты входного массива
spectral = np.matmul(eig_vec.transpose(), arr.flatten()) печать(spectral.shape) Возьмите первые k компонентов. Это значит замаскировать остальное (заменить на 0)
k = 15 в маске = np.zeros(spectral.shape) м = спектральный[:k] в маске[:k] = м Получите обновленные функции
updated_arr = np.matmul(eig_vec, в маске) обновленный_arr = обновленный_arr.reshape(arr.shape[0], -1) печать (обновленное_arr) массив([[-40.29945921, -20.838019 , 15.23873386, -1.31402251], [33.1372913, 37.06095382, -34.98050288, 16.02987125], [10.92036053, 8.63461724, 42.59316054, -34.61663745], [ -5.31097749, 33.28191998, -33.21174921, -26.32554079]]) Обновленный массив сильно отличается от оригинала, даже если принять во внимание сумму спектральных составляющих.
Любые предложения или ресурсы, на которые стоит обратить внимание, будут приветствоваться.
Я пытаюсь преобразовать массив на основе его первых спектральных компонентов, но получаю выходной признак, который сильно отличается от исходного, даже если я сохраняю все компоненты целиком.
Давайте рассмотрим этот массив 4x4
импортировать numpy как np из numpy.linalg импортировать eig arr = np.asarray([[23, 34, 78, 54], [87, 98, 23, 67], [76, 67, 98, 29], [56, 88, 28, 27]]) Его матрица смежности будет
A = np.asarray([[0., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [1., 1., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0.], [1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0.], [0., 1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0.], [0., 0., 1., 1., 0., 0., 1., 0., 0., 0., 1., 1., 0., 0., 0., 0.], [0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 0., 0., 1., 1., 0., 0.], [0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 0.], [0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1., 0., 1., 1., 1.], [0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 0., 0., 0., 1., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 1., 0., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 0.]] ) Его степень и матрица Лапласа определяются как:
степень = A.sum(ось=1) D = np.diag(степень) # Матрица Лапласа Л = Д - А Вычислите его собственные векторы и собственные значения и отсортируйте их в порядке убывания
eig_val, eig_vec = eig(L) idx = eig_val.argsort()[::-1] Отсортируйте собственные векторы соответствующим образом
eig_vec = eig_vec[:,idx] Собственные векторы образуют ортонормированный базис, поэтому произведение двух различных векторов должно быть равно 0. Я заметил, что здесь это не тот случай, например. произведение первого и второго собственных векторов равно
sum(np.multiply(eig_vec[0], eig_vec[1])) = 0,043247527085787975 Есть ли что-то, что мне не хватает?
Вычислить спектральные компоненты входного массива
spectral = np.matmul(eig_vec.transpose(), arr.flatten()) печать(spectral.shape) Возьмите первые k компонентов. Это значит замаскировать остальное (заменить на 0)
k = 15 в маске = np.zeros(spectral.shape) м = спектральный[:k] в маске[:k] = м Получите обновленные функции
updated_arr = np.matmul(eig_vec, в маске) обновленный_arr = обновленный_arr.reshape(arr.shape[0], -1) печать (обновленное_arr) массив([[-40.29945921, -20.838019 , 15.23873386, -1.31402251], [33.1372913, 37.06095382, -34.98050288, 16.02987125], [10.92036053, 8.63461724, 42.59316054, -34.61663745], [ -5.31097749, 33.28191998, -33.21174921, -26.32554079]]) Обновленный массив сильно отличается от оригинала, даже если принять во внимание сумму спектральных составляющих.
Любые предложения или ресурсы, на которые стоит обратить внимание, будут приветствоваться.